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