Commit 451418fc authored by Andrew Gallagher's avatar Andrew Gallagher Committed by Miklos Szeredi

fuse: don't invalidate attrs when not using atime

Various read operations (e.g. readlink, readdir) invalidate the cached
attrs for atime changes.  This patch adds a new function
'fuse_invalidate_atime', which checks for a read-only super block and
avoids the attr invalidation in that case.
Signed-off-by: default avatarAndrew Gallagher <andrewjcg@fb.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
parent 063ec1e5
......@@ -112,6 +112,16 @@ void fuse_invalidate_attr(struct inode *inode)
get_fuse_inode(inode)->i_time = 0;
}
/**
* Mark the attributes as stale due to an atime change. Avoid the invalidate if
* atime is not used.
*/
void fuse_invalidate_atime(struct inode *inode)
{
if (!IS_RDONLY(inode))
fuse_invalidate_attr(inode);
}
/*
* Just mark the entry as stale, so that a next attempt to look it up
* will result in a new lookup call to userspace
......@@ -1371,7 +1381,7 @@ static int fuse_readdir(struct file *file, struct dir_context *ctx)
}
__free_page(page);
fuse_invalidate_attr(inode); /* atime changed */
fuse_invalidate_atime(inode);
return err;
}
......@@ -1404,7 +1414,7 @@ static char *read_link(struct dentry *dentry)
link[req->out.args[0].size] = '\0';
out:
fuse_put_request(fc, req);
fuse_invalidate_attr(inode); /* atime changed */
fuse_invalidate_atime(inode);
return link;
}
......
......@@ -687,7 +687,7 @@ static int fuse_readpage(struct file *file, struct page *page)
SetPageUptodate(page);
}
fuse_invalidate_attr(inode); /* atime changed */
fuse_invalidate_atime(inode);
out:
unlock_page(page);
return err;
......@@ -716,7 +716,7 @@ static void fuse_readpages_end(struct fuse_conn *fc, struct fuse_req *req)
fuse_read_update_size(inode, pos,
req->misc.read.attr_ver);
}
fuse_invalidate_attr(inode); /* atime changed */
fuse_invalidate_atime(inode);
}
for (i = 0; i < req->num_pages; i++) {
......
......@@ -788,6 +788,8 @@ void fuse_invalidate_attr(struct inode *inode);
void fuse_invalidate_entry_cache(struct dentry *entry);
void fuse_invalidate_atime(struct inode *inode);
/**
* Acquire reference to fuse_conn
*/
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment