Skip to content

fuse: Send statx with requested flags only and reduce flags for perm …#151

Open
bsbernd wants to merge 2 commits into
redfs-ubuntu-noble-6.8.0-58.60from
perm-statx-redfs-ubuntu-noble-6.8.0-58.60
Open

fuse: Send statx with requested flags only and reduce flags for perm …#151
bsbernd wants to merge 2 commits into
redfs-ubuntu-noble-6.8.0-58.60from
perm-statx-redfs-ubuntu-noble-6.8.0-58.60

Conversation

@bsbernd
Copy link
Copy Markdown
Collaborator

@bsbernd bsbernd commented May 12, 2026

…check

One purpose of statx is to help cluster/network file systems and only request as many flags as needed. The file system is then free to add in more flags.

One use case for fuse_permission/fuse_perm_getattr and only check if mode/uid/gid have changed. Checking other stat might be an expensive operation, as time stamps and file size might need to be queries from multiple servers.

bsbernd added 2 commits May 17, 2026 23:49
In preparation for allowing partial attribute updates via statx
(where only a subset of STATX_BASIC_STATS may be requested and
returned), modify fuse_change_attributes_common() to be more
selective about what it updates.

Currently, fuse_change_attributes_common() unconditionally:
1. Clears ALL of STATX_BASIC_STATS from inval_mask
2. Updates fi->i_time (extending the attribute timeout)

For some fuse-servers it might be benefitial to reduce the number
of queries attributes and and attribute mask is one of the
features of statx. With the all or nothing handling
of fuse_change_attributes_common() that statx feature is
impossible to be used.

This commit adds the logic to:
1. Track which attributes were actually returned (via sx->mask for
   statx, or assume all STATX_BASIC_STATS for getattr)
2. Only clear those specific attributes from inval_mask
3. Only update fi->i_time when it's safe: when cache_mask is empty
   OR when all cache_mask attributes were included in the response

The condition in fuse_do_statx() still requires ALL STATX_BASIC_STATS,
so this commit has no functional change. A follow up commit will relax
that condition to enable partial updates.

Signed-off-by: Bernd Schubert <bernd@bsbernd.com>
…attributes

For permission checks via inode_permission(), we only need mode, uid, and
gid attributes. Previously, we requested all STATX_BASIC_STATS, which was
inefficient.

This commit enables the optimization by:
1. Requesting only STATX_MODE | STATX_UID | STATX_GID for permission checks
2. Relaxing the condition in fuse_do_statx() from requiring all basic stats
   to accepting any subset of basic stats
3. Adding validation that the server returns at least what was requested

The preparation commit ensures partial updates work correctly by only
updating returned attributes and managing timeouts appropriately.

Signed-off-by: Bernd Schubert <bernd@bsbernd.com>
@bsbernd bsbernd force-pushed the perm-statx-redfs-ubuntu-noble-6.8.0-58.60 branch from 28ea0e0 to 787de62 Compare May 17, 2026 21:53
Comment thread fs/fuse/dir.c
* The server may return more attributes than requested (which is fine),
* but must not return fewer.
*/
if ((sx->mask & inarg.sx_mask) != inarg.sx_mask) {
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is incorrect to me. The server may return a mask without STATX_BTIME even when fuse_do_statx() requests it

Comment thread fs/fuse/inode.c
fi->i_time = attr_valid;
} else {
/* no writeback_cache: need all basic stats */
if (returned_attrs == STATX_BASIC_STATS)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So, if I return attrs without ATIME,MTIME,CTIME, the fi->i_time will not be set?

@cding-ddn cding-ddn requested review from hbirth and yongzech May 20, 2026 08:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants