@@ -865,7 +865,7 @@ static void fuse_fillattr(struct inode *inode, struct fuse_attr *attr,
}
static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
- struct file *file)
+ struct file *file, unsigned flags)
{
int err;
struct fuse_getattr_in inarg;
@@ -886,9 +886,10 @@ static int fuse_do_getattr(struct inode *inode, struct kstat *stat,
if (file && S_ISREG(inode->i_mode)) {
struct fuse_file *ff = file->private_data;
- inarg.getattr_flags |= FUSE_GETATTR_FH;
inarg.fh = ff->fh;
+ flags |= FUSE_GETATTR_FH;
}
+ inarg.getattr_flags |= flags;
req->in.h.opcode = FUSE_GETATTR;
req->in.h.nodeid = get_node_id(inode);
req->in.numargs = 1;
@@ -927,7 +928,7 @@ int fuse_update_attributes(struct inode *inode, struct kstat *stat,
if (fi->i_time < get_jiffies_64()) {
r = true;
- err = fuse_do_getattr(inode, stat, file);
+ err = fuse_do_getattr(inode, stat, file, 0);
} else {
r = false;
err = 0;
@@ -1079,7 +1080,7 @@ static int fuse_perm_getattr(struct inode *inode, int mask)
if (mask & MAY_NOT_BLOCK)
return -ECHILD;
- return fuse_do_getattr(inode, NULL, NULL);
+ return fuse_do_getattr(inode, NULL, NULL, FUSE_GETATTR_PERM);
}
/*
@@ -254,6 +254,7 @@ struct fuse_file_lock {
* Getattr flags
*/
#define FUSE_GETATTR_FH (1 << 0)
+#define FUSE_GETATTR_PERM (1 << 1)
/**
* Lock flags
Introduce a new flag FUSE_GETATTR_PERM. The flag allows user space daemon to differentiate getattr that is for permission check from real getattr. When getattr is for permission check, the user space daemon does not need to provide accurate size/ctime/mtime of inode. Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com> --- fs/fuse/dir.c | 9 +++++---- include/uapi/linux/fuse.h | 1 + 2 files changed, 6 insertions(+), 4 deletions(-)