[PATCH] fuse: don't update file times
Don't change mtime/ctime/atime to local time on read/write. Rather invalidate file attributes, so next stat() will force a GETATTR call. Bug reported by Ben Grimm. Signed-off-by: Miklos Szeredi <miklos@szeredi.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
45323fb764
commit
b36c31ba95
3 changed files with 9 additions and 4 deletions
|
@ -552,6 +552,7 @@ static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
|
|||
filldir);
|
||||
|
||||
__free_page(page);
|
||||
fuse_invalidate_attr(inode); /* atime changed */
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -585,6 +586,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 */
|
||||
return link;
|
||||
}
|
||||
|
||||
|
|
|
@ -244,6 +244,7 @@ static int fuse_readpage(struct file *file, struct page *page)
|
|||
fuse_put_request(fc, req);
|
||||
if (!err)
|
||||
SetPageUptodate(page);
|
||||
fuse_invalidate_attr(inode); /* atime changed */
|
||||
out:
|
||||
unlock_page(page);
|
||||
return err;
|
||||
|
@ -312,6 +313,7 @@ static int fuse_readpages(struct file *file, struct address_space *mapping,
|
|||
if (!err && data.req->num_pages)
|
||||
err = fuse_send_readpages(data.req, file, inode);
|
||||
fuse_put_request(fc, data.req);
|
||||
fuse_invalidate_attr(inode); /* atime changed */
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -380,8 +382,8 @@ static int fuse_commit_write(struct file *file, struct page *page,
|
|||
clear_page_dirty(page);
|
||||
SetPageUptodate(page);
|
||||
}
|
||||
} else if (err == -EINTR || err == -EIO)
|
||||
fuse_invalidate_attr(inode);
|
||||
}
|
||||
fuse_invalidate_attr(inode);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -473,8 +475,8 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf,
|
|||
if (write && pos > i_size_read(inode))
|
||||
i_size_write(inode, pos);
|
||||
*ppos = pos;
|
||||
} else if (write && (res == -EINTR || res == -EIO))
|
||||
fuse_invalidate_attr(inode);
|
||||
}
|
||||
fuse_invalidate_attr(inode);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -173,6 +173,7 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
|
|||
return NULL;
|
||||
|
||||
if ((inode->i_state & I_NEW)) {
|
||||
inode->i_flags |= S_NOATIME|S_NOCMTIME;
|
||||
inode->i_generation = generation;
|
||||
inode->i_data.backing_dev_info = &fc->bdi;
|
||||
fuse_init_inode(inode, attr);
|
||||
|
|
Loading…
Reference in a new issue