Skip to content

Commit

Permalink
fuse: invalidate inode mapping if mtime changes
Browse files Browse the repository at this point in the history
We currently invalidate the inode address space mapping
if the file size changes unexpectedly. In the case of a
fuse network filesystem, a portion of a file could be
overwritten remotely without changing the file size.
Compare the old mtime as well to detect this condition
and invalidate the mapping if the file has been updated.

The original logic (to ignore changes in mtime) is
preserved unless the client specifies FUSE_AUTO_INVAL_DATA
on init.

Signed-off-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
  • Loading branch information
Brian Foster authored and Miklos Szeredi committed Jul 18, 2012
1 parent 72d0d24 commit eed2179
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions fs/fuse/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -197,22 +197,43 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr,
struct fuse_conn *fc = get_fuse_conn(inode);
struct fuse_inode *fi = get_fuse_inode(inode);
loff_t oldsize;
struct timespec old_mtime;

spin_lock(&fc->lock);
if (attr_version != 0 && fi->attr_version > attr_version) {
spin_unlock(&fc->lock);
return;
}

old_mtime = inode->i_mtime;
fuse_change_attributes_common(inode, attr, attr_valid);

oldsize = inode->i_size;
i_size_write(inode, attr->size);
spin_unlock(&fc->lock);

if (S_ISREG(inode->i_mode) && oldsize != attr->size) {
truncate_pagecache(inode, oldsize, attr->size);
invalidate_inode_pages2(inode->i_mapping);
if (S_ISREG(inode->i_mode)) {
bool inval = false;

if (oldsize != attr->size) {
truncate_pagecache(inode, oldsize, attr->size);
inval = true;
} else if (fc->auto_inval_data) {
struct timespec new_mtime = {
.tv_sec = attr->mtime,
.tv_nsec = attr->mtimensec,
};

/*
* Auto inval mode also checks and invalidates if mtime
* has changed.
*/
if (!timespec_equal(&old_mtime, &new_mtime))
inval = true;
}

if (inval)
invalidate_inode_pages2(inode->i_mapping);
}
}

Expand Down

0 comments on commit eed2179

Please sign in to comment.