Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -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;
}

+2 −2
Original line number Diff line number Diff line
@@ -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++) {
+2 −0
Original line number Diff line number Diff line
@@ -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
 */