diff options
| -rw-r--r-- | fs/fuse/inode.c | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index dd37ee291b8b..dd4401650b47 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
| @@ -197,6 +197,7 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr, | |||
| 197 | struct fuse_conn *fc = get_fuse_conn(inode); | 197 | struct fuse_conn *fc = get_fuse_conn(inode); |
| 198 | struct fuse_inode *fi = get_fuse_inode(inode); | 198 | struct fuse_inode *fi = get_fuse_inode(inode); |
| 199 | loff_t oldsize; | 199 | loff_t oldsize; |
| 200 | struct timespec old_mtime; | ||
| 200 | 201 | ||
| 201 | spin_lock(&fc->lock); | 202 | spin_lock(&fc->lock); |
| 202 | if (attr_version != 0 && fi->attr_version > attr_version) { | 203 | if (attr_version != 0 && fi->attr_version > attr_version) { |
| @@ -204,15 +205,35 @@ void fuse_change_attributes(struct inode *inode, struct fuse_attr *attr, | |||
| 204 | return; | 205 | return; |
| 205 | } | 206 | } |
| 206 | 207 | ||
| 208 | old_mtime = inode->i_mtime; | ||
| 207 | fuse_change_attributes_common(inode, attr, attr_valid); | 209 | fuse_change_attributes_common(inode, attr, attr_valid); |
| 208 | 210 | ||
| 209 | oldsize = inode->i_size; | 211 | oldsize = inode->i_size; |
| 210 | i_size_write(inode, attr->size); | 212 | i_size_write(inode, attr->size); |
| 211 | spin_unlock(&fc->lock); | 213 | spin_unlock(&fc->lock); |
| 212 | 214 | ||
| 213 | if (S_ISREG(inode->i_mode) && oldsize != attr->size) { | 215 | if (S_ISREG(inode->i_mode)) { |
| 214 | truncate_pagecache(inode, oldsize, attr->size); | 216 | bool inval = false; |
| 215 | invalidate_inode_pages2(inode->i_mapping); | 217 | |
| 218 | if (oldsize != attr->size) { | ||
| 219 | truncate_pagecache(inode, oldsize, attr->size); | ||
| 220 | inval = true; | ||
| 221 | } else if (fc->auto_inval_data) { | ||
| 222 | struct timespec new_mtime = { | ||
| 223 | .tv_sec = attr->mtime, | ||
| 224 | .tv_nsec = attr->mtimensec, | ||
| 225 | }; | ||
| 226 | |||
| 227 | /* | ||
| 228 | * Auto inval mode also checks and invalidates if mtime | ||
| 229 | * has changed. | ||
| 230 | */ | ||
| 231 | if (!timespec_equal(&old_mtime, &new_mtime)) | ||
| 232 | inval = true; | ||
| 233 | } | ||
| 234 | |||
| 235 | if (inval) | ||
| 236 | invalidate_inode_pages2(inode->i_mapping); | ||
| 216 | } | 237 | } |
| 217 | } | 238 | } |
| 218 | 239 | ||
