From d797f118f9f6fa6842fa13f6a87f30885e5835ad Mon Sep 17 00:00:00 2001 From: Brian Foster Date: Mon, 16 Jul 2012 15:23:49 -0400 Subject: [PATCH] --- yaml --- r: 321679 b: refs/heads/master c: eed2179efe1aac145bf6d54b925b750976380fa6 h: refs/heads/master i: 321677: a498498ebc14f9dfa81a253dc711b0006994a41c 321675: fb9ac021dc1dd2a1b16892d0785ddd9a6bd52680 321671: 5003416ba0c843b0b79e05098b7f26ac16f7dce9 321663: a7b5d5d781232b327ca579a5bcec56752f4d5f73 v: v3 --- [refs] | 2 +- trunk/fs/fuse/inode.c | 27 ++++++++++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index e40b2e7f2651..35868237b7b7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 72d0d248ca8232dbd30d35b42d0d86e39b3e322b +refs/heads/master: eed2179efe1aac145bf6d54b925b750976380fa6 diff --git a/trunk/fs/fuse/inode.c b/trunk/fs/fuse/inode.c index dd37ee291b8b..dd4401650b47 100644 --- a/trunk/fs/fuse/inode.c +++ b/trunk/fs/fuse/inode.c @@ -197,6 +197,7 @@ 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) { @@ -204,15 +205,35 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr, 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); } }