forked from luck/tmp_suning_uos_patched
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: Andrew Gallagher <andrewjcg@fb.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
This commit is contained in:
parent
063ec1e595
commit
451418fc92
@ -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
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user