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
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
|
* Error-check and convert a string of mount options from user space into
|
||||||
* a data structure
|
* a data structure
|
||||||
|
@ -1054,73 +1130,10 @@ static int nfs_parse_mount_options(char *raw,
|
||||||
string = match_strdup(args);
|
string = match_strdup(args);
|
||||||
if (string == NULL)
|
if (string == NULL)
|
||||||
goto out_nomem;
|
goto out_nomem;
|
||||||
token = match_token(string, nfs_secflavor_tokens, args);
|
rc = nfs_parse_security_flavors(string, mnt);
|
||||||
kfree(string);
|
kfree(string);
|
||||||
|
if (!rc)
|
||||||
/*
|
|
||||||
* 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:
|
|
||||||
goto out_unrec_sec;
|
goto out_unrec_sec;
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case Opt_proto:
|
case Opt_proto:
|
||||||
string = match_strdup(args);
|
string = match_strdup(args);
|
||||||
|
|
Loading…
Reference in New Issue