Commit b36c31ba authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds

[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: default avatarMiklos Szeredi <miklos@szeredi.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 45323fb7
...@@ -552,6 +552,7 @@ static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir) ...@@ -552,6 +552,7 @@ static int fuse_readdir(struct file *file, void *dstbuf, filldir_t filldir)
filldir); filldir);
__free_page(page); __free_page(page);
fuse_invalidate_attr(inode); /* atime changed */
return err; return err;
} }
...@@ -585,6 +586,7 @@ static char *read_link(struct dentry *dentry) ...@@ -585,6 +586,7 @@ static char *read_link(struct dentry *dentry)
link[req->out.args[0].size] = '\0'; link[req->out.args[0].size] = '\0';
out: out:
fuse_put_request(fc, req); fuse_put_request(fc, req);
fuse_invalidate_attr(inode); /* atime changed */
return link; return link;
} }
......
...@@ -244,6 +244,7 @@ static int fuse_readpage(struct file *file, struct page *page) ...@@ -244,6 +244,7 @@ static int fuse_readpage(struct file *file, struct page *page)
fuse_put_request(fc, req); fuse_put_request(fc, req);
if (!err) if (!err)
SetPageUptodate(page); SetPageUptodate(page);
fuse_invalidate_attr(inode); /* atime changed */
out: out:
unlock_page(page); unlock_page(page);
return err; return err;
...@@ -312,6 +313,7 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, ...@@ -312,6 +313,7 @@ static int fuse_readpages(struct file *file, struct address_space *mapping,
if (!err && data.req->num_pages) if (!err && data.req->num_pages)
err = fuse_send_readpages(data.req, file, inode); err = fuse_send_readpages(data.req, file, inode);
fuse_put_request(fc, data.req); fuse_put_request(fc, data.req);
fuse_invalidate_attr(inode); /* atime changed */
return err; return err;
} }
...@@ -380,8 +382,8 @@ static int fuse_commit_write(struct file *file, struct page *page, ...@@ -380,8 +382,8 @@ static int fuse_commit_write(struct file *file, struct page *page,
clear_page_dirty(page); clear_page_dirty(page);
SetPageUptodate(page); SetPageUptodate(page);
} }
} else if (err == -EINTR || err == -EIO) }
fuse_invalidate_attr(inode); fuse_invalidate_attr(inode);
return err; return err;
} }
...@@ -473,8 +475,8 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf, ...@@ -473,8 +475,8 @@ static ssize_t fuse_direct_io(struct file *file, const char __user *buf,
if (write && pos > i_size_read(inode)) if (write && pos > i_size_read(inode))
i_size_write(inode, pos); i_size_write(inode, pos);
*ppos = pos; *ppos = pos;
} else if (write && (res == -EINTR || res == -EIO)) }
fuse_invalidate_attr(inode); fuse_invalidate_attr(inode);
return res; return res;
} }
......
...@@ -173,6 +173,7 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid, ...@@ -173,6 +173,7 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
return NULL; return NULL;
if ((inode->i_state & I_NEW)) { if ((inode->i_state & I_NEW)) {
inode->i_flags |= S_NOATIME|S_NOCMTIME;
inode->i_generation = generation; inode->i_generation = generation;
inode->i_data.backing_dev_info = &fc->bdi; inode->i_data.backing_dev_info = &fc->bdi;
fuse_init_inode(inode, attr); fuse_init_inode(inode, attr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment