fuse: Send statx with requested flags only and reduce flags for perm …#151
Open
bsbernd wants to merge 2 commits into
Open
fuse: Send statx with requested flags only and reduce flags for perm …#151bsbernd wants to merge 2 commits into
bsbernd wants to merge 2 commits into
Conversation
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>
28ea0e0 to
787de62
Compare
cding-ddn
reviewed
May 18, 2026
| * 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) { |
Collaborator
There was a problem hiding this comment.
This is incorrect to me. The server may return a mask without STATX_BTIME even when fuse_do_statx() requests it
cding-ddn
reviewed
May 20, 2026
| fi->i_time = attr_valid; | ||
| } else { | ||
| /* no writeback_cache: need all basic stats */ | ||
| if (returned_attrs == STATX_BASIC_STATS) |
Collaborator
There was a problem hiding this comment.
So, if I return attrs without ATIME,MTIME,CTIME, the fi->i_time will not be set?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
…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.