From: Darrick J. Wong <djwong@xxxxxxxxxx> Actually copy the attributes/attributes_mask from userspace. Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> --- fs/fuse/fuse_i.h | 4 ++++ fs/fuse/dir.c | 4 ++++ fs/fuse/inode.c | 3 +++ 3 files changed, 11 insertions(+) diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 2b5d56e3cb4eaf..bb1fdae0bbc906 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -140,6 +140,10 @@ struct fuse_inode { /** Version of last attribute change */ u64 attr_version; + /** statx file attributes */ + u64 statx_attributes; + u64 statx_attributes_mask; + union { /* read/write io cache (regular file only) */ struct { diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 2d817d7cab2649..2e4d1131ab8cbe 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1278,6 +1278,8 @@ static int fuse_do_statx(struct mnt_idmap *idmap, struct inode *inode, stat->result_mask = sx->mask & (STATX_BASIC_STATS | STATX_BTIME); stat->btime.tv_sec = sx->btime.tv_sec; stat->btime.tv_nsec = min_t(u32, sx->btime.tv_nsec, NSEC_PER_SEC - 1); + stat->attributes = sx->attributes; + stat->attributes_mask = sx->attributes_mask; fuse_fillattr(idmap, inode, &attr, stat); stat->result_mask |= STATX_TYPE; } @@ -1381,6 +1383,8 @@ static int fuse_update_get_attr(struct mnt_idmap *idmap, struct inode *inode, stat->btime = fi->i_btime; stat->result_mask |= STATX_BTIME; } + stat->attributes = fi->statx_attributes; + stat->attributes_mask = fi->statx_attributes_mask; } return err; diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index b3b0c0f5598b4a..463879830ecf34 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -287,6 +287,9 @@ void fuse_change_attributes_common(struct inode *inode, struct fuse_attr *attr, fi->i_btime.tv_sec = sx->btime.tv_sec; fi->i_btime.tv_nsec = sx->btime.tv_nsec; } + + fi->statx_attributes = sx->attributes; + fi->statx_attributes_mask = sx->attributes_mask; } if (attr->blksize != 0)