]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
Return the delegation when deleting sillyrenamed files
authorLance Shelton <lance.shelton@primarydata.com>
Mon, 17 Jun 2024 01:21:36 +0000 (21:21 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 8 Jul 2024 17:47:26 +0000 (13:47 -0400)
Add a callback to return the delegation in order to allow generic NFS
code to return the delegation when appropriate.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Signed-off-by: Lance Shelton <lance.shelton@hammerspace.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/nfs3proc.c
fs/nfs/nfs4proc.c
fs/nfs/proc.c
fs/nfs/unlink.c
include/linux/nfs_xdr.h

index cab6c73d25d603c44b9cb0d0068e19445f9cf708..1566163c6d85b998f0391ec48b3429d245a54651 100644 (file)
@@ -984,6 +984,13 @@ static int nfs3_have_delegation(struct inode *inode, fmode_t type, int flags)
        return 0;
 }
 
+static int nfs3_return_delegation(struct inode *inode)
+{
+       if (S_ISREG(inode->i_mode))
+               nfs_wb_all(inode);
+       return 0;
+}
+
 static const struct inode_operations nfs3_dir_inode_operations = {
        .create         = nfs_create,
        .atomic_open    = nfs_atomic_open_v23,
@@ -1062,6 +1069,7 @@ const struct nfs_rpc_ops nfs_v3_clientops = {
        .clear_acl_cache = forget_all_cached_acls,
        .close_context  = nfs_close_context,
        .have_delegation = nfs3_have_delegation,
+       .return_delegation = nfs3_return_delegation,
        .alloc_client   = nfs_alloc_client,
        .init_client    = nfs_init_client,
        .free_client    = nfs_free_client,
index b1376571f6ef70589ea2f57f46dd6ceaaecac0b5..9376b5031acfd722d00a7e5656d47bd95f6f4c16 100644 (file)
@@ -10871,6 +10871,7 @@ const struct nfs_rpc_ops nfs_v4_clientops = {
        .close_context  = nfs4_close_context,
        .open_context   = nfs4_atomic_open,
        .have_delegation = nfs4_have_delegation,
+       .return_delegation = nfs4_inode_return_delegation,
        .alloc_client   = nfs4_alloc_client,
        .init_client    = nfs4_init_client,
        .free_client    = nfs4_free_client,
index 995cc42b0fa0ee8ee3e27b8a60fd90b641d6ea47..6c09cd090c34c7df28c0907c4e0d962fac1aef6f 100644 (file)
@@ -692,6 +692,13 @@ static int nfs_have_delegation(struct inode *inode, fmode_t type, int flags)
        return 0;
 }
 
+static int nfs_return_delegation(struct inode *inode)
+{
+       if (S_ISREG(inode->i_mode))
+               nfs_wb_all(inode);
+       return 0;
+}
+
 static const struct inode_operations nfs_dir_inode_operations = {
        .create         = nfs_create,
        .lookup         = nfs_lookup,
@@ -757,6 +764,7 @@ const struct nfs_rpc_ops nfs_v2_clientops = {
        .lock_check_bounds = nfs_lock_check_bounds,
        .close_context  = nfs_close_context,
        .have_delegation = nfs_have_delegation,
+       .return_delegation = nfs_return_delegation,
        .alloc_client   = nfs_alloc_client,
        .init_client    = nfs_init_client,
        .free_client    = nfs_free_client,
index 0110299643a248deddba312461cc5942ee6e9a74..bf77399696a767571d484ceb1c84937ed7256555 100644 (file)
@@ -232,6 +232,8 @@ nfs_complete_unlink(struct dentry *dentry, struct inode *inode)
        dentry->d_fsdata = NULL;
        spin_unlock(&dentry->d_lock);
 
+       NFS_PROTO(inode)->return_delegation(inode);
+
        if (NFS_STALE(inode) || !nfs_call_unlink(dentry, inode, data))
                nfs_free_unlinkdata(data);
 }
index af510a7ec46acc5c8a09451df361e57c632cf0ed..01efacae46344a22bfb723dccf01709ffb3f7a8a 100644 (file)
@@ -1840,6 +1840,7 @@ struct nfs_rpc_ops {
                                struct iattr *iattr,
                                int *);
        int (*have_delegation)(struct inode *, fmode_t, int);
+       int (*return_delegation)(struct inode *);
        struct nfs_client *(*alloc_client) (const struct nfs_client_initdata *);
        struct nfs_client *(*init_client) (struct nfs_client *,
                                const struct nfs_client_initdata *);