nfs4.1: Add SP4_MACH_CRED secinfo support
authorWeston Andros Adamson <dros@netapp.com>
Tue, 13 Aug 2013 20:37:35 +0000 (16:37 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 5 Sep 2013 14:48:30 +0000 (10:48 -0400)
SECINFO and SECINFO_NONAME can use the machine credential.

Signed-off-by: Weston Andros Adamson <dros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/nfs4proc.c
include/linux/nfs_fs_sb.h

index cba486a..5c917c9 100644 (file)
@@ -5998,6 +5998,10 @@ static int _nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct
        }
 
        dprintk("NFS call  secinfo %s\n", name->name);
+
+       nfs4_state_protect(NFS_SERVER(dir)->nfs_client,
+               NFS_SP4_MACH_CRED_SECINFO, &clnt, &msg);
+
        status = nfs4_call_sync(clnt, NFS_SERVER(dir), &msg, &args.seq_args,
                                &res.seq_res, 0);
        dprintk("NFS reply  secinfo: %d\n", status);
@@ -6137,7 +6141,9 @@ static const struct nfs41_state_protection nfs4_sp4_mach_cred_request = {
        },
        .allow.u.words = {
                [0] = 1 << (OP_CLOSE) |
-                     1 << (OP_LOCKU)
+                     1 << (OP_LOCKU),
+               [1] = 1 << (OP_SECINFO - 32) |
+                     1 << (OP_SECINFO_NO_NAME - 32)
        }
 };
 
@@ -6203,6 +6209,12 @@ static int nfs4_sp4_select_mode(struct nfs_client *clp,
                        dfprintk(MOUNT, "  cleanup mode enabled\n");
                        set_bit(NFS_SP4_MACH_CRED_CLEANUP, &clp->cl_sp4_flags);
                }
+
+               if (test_bit(OP_SECINFO, sp->allow.u.longs) &&
+                   test_bit(OP_SECINFO_NO_NAME, sp->allow.u.longs)) {
+                       dfprintk(MOUNT, "  secinfo mode enabled\n");
+                       set_bit(NFS_SP4_MACH_CRED_SECINFO, &clp->cl_sp4_flags);
+               }
        }
 
        return 0;
index c0ba338..800da11 100644 (file)
@@ -95,6 +95,7 @@ struct nfs_client {
 #define NFS_SP4_MACH_CRED_MINIMAL  1   /* Minimal sp4_mach_cred - state ops
                                         * must use machine cred */
 #define NFS_SP4_MACH_CRED_CLEANUP  2   /* CLOSE and LOCKU */
+#define NFS_SP4_MACH_CRED_SECINFO  3   /* SECINFO and SECINFO_NO_NAME */
 #endif /* CONFIG_NFS_V4 */
 
 #ifdef CONFIG_NFS_FSCACHE