Merge tag 'vfs-6.8.netfs' of gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs
[linux-2.6-microblaze.git] / fs / afs / inode.c
index 4f04f6f..94fc049 100644 (file)
@@ -58,7 +58,7 @@ static noinline void dump_vnode(struct afs_vnode *vnode, struct afs_vnode *paren
  */
 static void afs_set_netfs_context(struct afs_vnode *vnode)
 {
-       netfs_inode_init(&vnode->netfs, &afs_req_ops);
+       netfs_inode_init(&vnode->netfs, &afs_req_ops, true);
 }
 
 /*
@@ -166,6 +166,7 @@ static void afs_apply_status(struct afs_operation *op,
        struct inode *inode = &vnode->netfs.inode;
        struct timespec64 t;
        umode_t mode;
+       bool unexpected_jump = false;
        bool data_changed = false;
        bool change_size = vp->set_size;
 
@@ -230,6 +231,7 @@ static void afs_apply_status(struct afs_operation *op,
                }
                change_size = true;
                data_changed = true;
+               unexpected_jump = true;
        } else if (vnode->status.type == AFS_FTYPE_DIR) {
                /* Expected directory change is handled elsewhere so
                 * that we can locally edit the directory and save on a
@@ -249,8 +251,10 @@ static void afs_apply_status(struct afs_operation *op,
                 * what's on the server.
                 */
                vnode->netfs.remote_i_size = status->size;
-               if (change_size) {
+               if (change_size || status->size > i_size_read(inode)) {
                        afs_set_i_size(vnode, status->size);
+                       if (unexpected_jump)
+                               vnode->netfs.zero_point = status->size;
                        inode_set_ctime_to_ts(inode, t);
                        inode_set_atime_to_ts(inode, t);
                }
@@ -647,7 +651,7 @@ void afs_evict_inode(struct inode *inode)
        truncate_inode_pages_final(&inode->i_data);
 
        afs_set_cache_aux(vnode, &aux);
-       fscache_clear_inode_writeback(afs_vnode_cache(vnode), inode, &aux);
+       netfs_clear_inode_writeback(inode, &aux);
        clear_inode(inode);
 
        while (!list_empty(&vnode->wb_keys)) {
@@ -689,17 +693,17 @@ static void afs_setattr_success(struct afs_operation *op)
 static void afs_setattr_edit_file(struct afs_operation *op)
 {
        struct afs_vnode_param *vp = &op->file[0];
-       struct inode *inode = &vp->vnode->netfs.inode;
+       struct afs_vnode *vnode = vp->vnode;
 
        if (op->setattr.attr->ia_valid & ATTR_SIZE) {
                loff_t size = op->setattr.attr->ia_size;
                loff_t i_size = op->setattr.old_i_size;
 
-               if (size < i_size)
-                       truncate_pagecache(inode, size);
-               if (size != i_size)
-                       fscache_resize_cookie(afs_vnode_cache(vp->vnode),
-                                             vp->scb.status.size);
+               if (size != i_size) {
+                       truncate_setsize(&vnode->netfs.inode, size);
+                       netfs_resize_file(&vnode->netfs, size, true);
+                       fscache_resize_cookie(afs_vnode_cache(vnode), size);
+               }
        }
 }
 
@@ -767,11 +771,11 @@ int afs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,
                 */
                if (!(attr->ia_valid & (supported & ~ATTR_SIZE & ~ATTR_MTIME)) &&
                    attr->ia_size < i_size &&
-                   attr->ia_size > vnode->status.size) {
-                       truncate_pagecache(inode, attr->ia_size);
+                   attr->ia_size > vnode->netfs.remote_i_size) {
+                       truncate_setsize(inode, attr->ia_size);
+                       netfs_resize_file(&vnode->netfs, size, false);
                        fscache_resize_cookie(afs_vnode_cache(vnode),
                                              attr->ia_size);
-                       i_size_write(inode, attr->ia_size);
                        ret = 0;
                        goto out_unlock;
                }