afs: Maintain netfs_i_context::remote_i_size
authorDavid Howells <dhowells@redhat.com>
Mon, 14 Feb 2022 14:11:25 +0000 (14:11 +0000)
committerDavid Howells <dhowells@redhat.com>
Fri, 18 Mar 2022 09:29:05 +0000 (09:29 +0000)
Make afs use netfslib's tracking for the server's idea of what the current
inode size is independently of inode->i_size.  We really want to use this
value when calculating the new vnode size when initiating a StoreData RPC
op rather than the size stat() presents to the user (ie. inode->i_size) as
the latter is affected by as-yet uncommitted writes.

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
cc: linux-cachefs@redhat.com
cc: linux-afs@lists.infradead.org

Link: https://lore.kernel.org/r/164623014626.3564931.8375344024648265358.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/164678220204.1200972.17408022517463940584.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/164692923592.2099075.5466132542956550401.stgit@warthog.procyon.org.uk/
fs/afs/inode.c
fs/afs/write.c

index 5b5e4019765551a47cac55039580da232614beb6..2fe402483ad5bbc59750e2096f7127a3ba2152c0 100644 (file)
@@ -246,6 +246,7 @@ static void afs_apply_status(struct afs_operation *op,
                 * idea of what the size should be that's not the same as
                 * what's on the server.
                 */
+               vnode->netfs_ctx.remote_i_size = status->size;
                if (change_size) {
                        afs_set_i_size(vnode, status->size);
                        inode->i_ctime = t;
index e4b47f67a408de695b8dc9eae28b251d39b4cef9..85c9056ba9fb4eb58f75bcd86ec0e068964519ed 100644 (file)
@@ -353,9 +353,10 @@ static const struct afs_operation_ops afs_store_data_operation = {
 static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t pos,
                          bool laundering)
 {
+       struct netfs_i_context *ictx = &vnode->netfs_ctx;
        struct afs_operation *op;
        struct afs_wb_key *wbk = NULL;
-       loff_t size = iov_iter_count(iter), i_size;
+       loff_t size = iov_iter_count(iter);
        int ret = -ENOKEY;
 
        _enter("%s{%llx:%llu.%u},%llx,%llx",
@@ -377,15 +378,13 @@ static int afs_store_data(struct afs_vnode *vnode, struct iov_iter *iter, loff_t
                return -ENOMEM;
        }
 
-       i_size = i_size_read(&vnode->vfs_inode);
-
        afs_op_set_vnode(op, 0, vnode);
        op->file[0].dv_delta = 1;
        op->file[0].modification = true;
        op->store.write_iter = iter;
        op->store.pos = pos;
        op->store.size = size;
-       op->store.i_size = max(pos + size, i_size);
+       op->store.i_size = max(pos + size, ictx->remote_i_size);
        op->store.laundering = laundering;
        op->mtime = vnode->vfs_inode.i_mtime;
        op->flags |= AFS_OPERATION_UNINTR;