Commit 5df36e78 authored by Chuck Lever's avatar Chuck Lever Committed by Trond Myklebust

NFS: Clean up nfs_validate_mount_data

Move error handling code out of the main code path.  The switch statement
was also improperly indented, according to Documentation/CodingStyle.  This
prepares nfs_validate_mount_data for the addition of option string parsing.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent f1828993
...@@ -470,15 +470,8 @@ static int nfs_verify_server_address(struct sockaddr *addr) ...@@ -470,15 +470,8 @@ static int nfs_verify_server_address(struct sockaddr *addr)
static int nfs_validate_mount_data(struct nfs_mount_data *data, static int nfs_validate_mount_data(struct nfs_mount_data *data,
struct nfs_fh *mntfh) struct nfs_fh *mntfh)
{ {
if (data == NULL) { if (data == NULL)
dprintk("%s: missing data argument\n", __FUNCTION__); goto out_no_data;
return -EINVAL;
}
if (data->version <= 0 || data->version > NFS_MOUNT_VERSION) {
dprintk("%s: bad mount version\n", __FUNCTION__);
return -EINVAL;
}
switch (data->version) { switch (data->version) {
case 1: case 1:
...@@ -486,61 +479,77 @@ static int nfs_validate_mount_data(struct nfs_mount_data *data, ...@@ -486,61 +479,77 @@ static int nfs_validate_mount_data(struct nfs_mount_data *data,
case 2: case 2:
data->bsize = 0; data->bsize = 0;
case 3: case 3:
if (data->flags & NFS_MOUNT_VER3) { if (data->flags & NFS_MOUNT_VER3)
dprintk("%s: mount structure version %d does not support NFSv3\n", goto out_no_v3;
__FUNCTION__,
data->version);
return -EINVAL;
}
data->root.size = NFS2_FHSIZE; data->root.size = NFS2_FHSIZE;
memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE); memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE);
case 4: case 4:
if (data->flags & NFS_MOUNT_SECFLAVOUR) { if (data->flags & NFS_MOUNT_SECFLAVOUR)
dprintk("%s: mount structure version %d does not support strong security\n", goto out_no_sec;
__FUNCTION__,
data->version);
return -EINVAL;
}
case 5: case 5:
memset(data->context, 0, sizeof(data->context)); memset(data->context, 0, sizeof(data->context));
case 6:
if (data->flags & NFS_MOUNT_VER3)
mntfh->size = data->root.size;
else
mntfh->size = NFS2_FHSIZE;
if (mntfh->size > sizeof(mntfh->data))
goto out_invalid_fh;
memcpy(mntfh->data, data->root.data, mntfh->size);
if (mntfh->size < sizeof(mntfh->data))
memset(mntfh->data + mntfh->size, 0,
sizeof(mntfh->data) - mntfh->size);
break;
default:
goto out_bad_version;
} }
/* Set the pseudoflavor */
if (!(data->flags & NFS_MOUNT_SECFLAVOUR)) if (!(data->flags & NFS_MOUNT_SECFLAVOUR))
data->pseudoflavor = RPC_AUTH_UNIX; data->pseudoflavor = RPC_AUTH_UNIX;
#ifndef CONFIG_NFS_V3 #ifndef CONFIG_NFS_V3
/* If NFSv3 is not compiled in, return -EPROTONOSUPPORT */ if (data->flags & NFS_MOUNT_VER3)
if (data->flags & NFS_MOUNT_VER3) { goto out_v3_not_compiled;
dprintk("%s: NFSv3 not compiled into kernel\n", __FUNCTION__); #endif /* !CONFIG_NFS_V3 */
return -EPROTONOSUPPORT;
}
#endif /* CONFIG_NFS_V3 */
/* We now require that the mount process passes the remote address */ if (!nfs_verify_server_address((struct sockaddr *) &data->addr))
if (!nfs_verify_server_address((struct sockaddr *) &data->addr)) { goto out_no_address;
dprintk("%s: mount program didn't pass remote address!\n",
__FUNCTION__); return 0;
out_no_data:
dfprintk(MOUNT, "NFS: mount program didn't pass any mount data\n");
return -EINVAL; return -EINVAL;
}
/* Prepare the root filehandle */ out_no_v3:
if (data->flags & NFS_MOUNT_VER3) dfprintk(MOUNT, "NFS: nfs_mount_data version %d does not support v3\n",
mntfh->size = data->root.size; data->version);
else return -EINVAL;
mntfh->size = NFS2_FHSIZE;
if (mntfh->size > sizeof(mntfh->data)) { out_no_sec:
dprintk("%s: invalid root filehandle\n", __FUNCTION__); dfprintk(MOUNT, "NFS: nfs_mount_data version supports only AUTH_SYS\n");
return -EINVAL; return -EINVAL;
}
memcpy(mntfh->data, data->root.data, mntfh->size); out_bad_version:
if (mntfh->size < sizeof(mntfh->data)) dfprintk(MOUNT, "NFS: bad nfs_mount_data version %d\n",
memset(mntfh->data + mntfh->size, 0, data->version);
sizeof(mntfh->data) - mntfh->size); return -EINVAL;
return 0; #ifndef CONFIG_NFS_V3
out_v3_not_compiled:
dfprintk(MOUNT, "NFS: NFSv3 is not compiled into kernel\n");
return -EPROTONOSUPPORT;
#endif /* !CONFIG_NFS_V3 */
out_no_address:
dfprintk(MOUNT, "NFS: mount program didn't pass remote address\n");
return -EINVAL;
out_invalid_fh:
dfprintk(MOUNT, "NFS: invalid root filehandle\n");
return -EINVAL;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment