NFS: Refactor logic for parsing NFS security flavor mount options
Clean up: Refactor the NFS mount option parsing function to extract the security flavor parsing logic into a separate function. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
0e0cab744b
commit
01060c896e
1 changed files with 78 additions and 65 deletions
143
fs/nfs/super.c
143
fs/nfs/super.c
|
@ -853,6 +853,82 @@ static void nfs_set_mount_transport_protocol(struct nfs_parsed_mount_data *mnt)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse the value of the 'sec=' option.
|
||||
*
|
||||
* The flags setting is for v2/v3. The flavor_len setting is for v4.
|
||||
* v2/v3 also need to know the difference between NULL and UNIX.
|
||||
*/
|
||||
static int nfs_parse_security_flavors(char *value,
|
||||
struct nfs_parsed_mount_data *mnt)
|
||||
{
|
||||
substring_t args[MAX_OPT_ARGS];
|
||||
|
||||
dfprintk(MOUNT, "NFS: parsing sec=%s option\n", value);
|
||||
|
||||
switch (match_token(value, nfs_secflavor_tokens, args)) {
|
||||
case Opt_sec_none:
|
||||
mnt->flags &= ~NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 0;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_NULL;
|
||||
break;
|
||||
case Opt_sec_sys:
|
||||
mnt->flags &= ~NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 0;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_UNIX;
|
||||
break;
|
||||
case Opt_sec_krb5:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5;
|
||||
break;
|
||||
case Opt_sec_krb5i:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5I;
|
||||
break;
|
||||
case Opt_sec_krb5p:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5P;
|
||||
break;
|
||||
case Opt_sec_lkey:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEY;
|
||||
break;
|
||||
case Opt_sec_lkeyi:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYI;
|
||||
break;
|
||||
case Opt_sec_lkeyp:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYP;
|
||||
break;
|
||||
case Opt_sec_spkm:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKM;
|
||||
break;
|
||||
case Opt_sec_spkmi:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMI;
|
||||
break;
|
||||
case Opt_sec_spkmp:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMP;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Error-check and convert a string of mount options from user space into
|
||||
* a data structure
|
||||
|
@ -1054,73 +1130,10 @@ static int nfs_parse_mount_options(char *raw,
|
|||
string = match_strdup(args);
|
||||
if (string == NULL)
|
||||
goto out_nomem;
|
||||
token = match_token(string, nfs_secflavor_tokens, args);
|
||||
rc = nfs_parse_security_flavors(string, mnt);
|
||||
kfree(string);
|
||||
|
||||
/*
|
||||
* The flags setting is for v2/v3. The flavor_len
|
||||
* setting is for v4. v2/v3 also need to know the
|
||||
* difference between NULL and UNIX.
|
||||
*/
|
||||
switch (token) {
|
||||
case Opt_sec_none:
|
||||
mnt->flags &= ~NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 0;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_NULL;
|
||||
break;
|
||||
case Opt_sec_sys:
|
||||
mnt->flags &= ~NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 0;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_UNIX;
|
||||
break;
|
||||
case Opt_sec_krb5:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5;
|
||||
break;
|
||||
case Opt_sec_krb5i:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5I;
|
||||
break;
|
||||
case Opt_sec_krb5p:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_KRB5P;
|
||||
break;
|
||||
case Opt_sec_lkey:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEY;
|
||||
break;
|
||||
case Opt_sec_lkeyi:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYI;
|
||||
break;
|
||||
case Opt_sec_lkeyp:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_LKEYP;
|
||||
break;
|
||||
case Opt_sec_spkm:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKM;
|
||||
break;
|
||||
case Opt_sec_spkmi:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMI;
|
||||
break;
|
||||
case Opt_sec_spkmp:
|
||||
mnt->flags |= NFS_MOUNT_SECFLAVOUR;
|
||||
mnt->auth_flavor_len = 1;
|
||||
mnt->auth_flavors[0] = RPC_AUTH_GSS_SPKMP;
|
||||
break;
|
||||
default:
|
||||
if (!rc)
|
||||
goto out_unrec_sec;
|
||||
}
|
||||
break;
|
||||
case Opt_proto:
|
||||
string = match_strdup(args);
|
||||
|
|
Loading…
Reference in a new issue