diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/file.c | 13 | ||||
-rw-r--r-- | kernel/inode.c | 3 |
2 files changed, 11 insertions, 5 deletions
diff --git a/kernel/file.c b/kernel/file.c index 63e4380..f5e2c87 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -248,6 +248,8 @@ static int fuse_readpage(struct file *file, struct page *page) fuse_put_request(fc, req); if (!err) SetPageUptodate(page); + if (!(inode->i_sb->s_flags & MS_NOATIME)) + fuse_invalidate_attr(inode); out: unlock_page(page); return err; @@ -268,6 +270,8 @@ static int fuse_send_readpages(struct fuse_req *req, struct file *file, SetPageUptodate(page); unlock_page(page); } + if (!(inode->i_sb->s_flags & MS_NOATIME)) + fuse_invalidate_attr(inode); return req->out.h.error; } @@ -484,8 +488,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; } @@ -577,7 +581,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)) + } + if (write || !(inode->i_sb->s_flags & MS_NOATIME)) fuse_invalidate_attr(inode); return res; @@ -642,7 +647,7 @@ static int fuse_set_page_dirty(struct page *page) static struct file_operations fuse_file_operations = { .llseek = generic_file_llseek, #ifdef KERNEL_2_6 - .read = generic_file_read, + .read = generic_file_read, #else .read = fuse_file_read, #endif diff --git a/kernel/inode.c b/kernel/inode.c index 5dacb22..7717ef1 100644 --- a/kernel/inode.c +++ b/kernel/inode.c @@ -199,6 +199,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); @@ -424,7 +425,7 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d) return 0; } } - + if (!d->fd_present || !d->rootmode_present || !d->user_id_present || !d->group_id_present) return 0; |