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

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
Loading
Loading
Loading
Loading
+67 −58
Original line number Diff line number Diff line
@@ -470,15 +470,8 @@ static int nfs_verify_server_address(struct sockaddr *addr)
static int nfs_validate_mount_data(struct nfs_mount_data *data,
				   struct nfs_fh *mntfh)
{
	if (data == NULL) {
		dprintk("%s: missing data argument\n", __FUNCTION__);
		return -EINVAL;
	}

	if (data->version <= 0 || data->version > NFS_MOUNT_VERSION) {
		dprintk("%s: bad mount version\n", __FUNCTION__);
		return -EINVAL;
	}
	if (data == NULL)
		goto out_no_data;

	switch (data->version) {
	case 1:
@@ -486,61 +479,77 @@ static int nfs_validate_mount_data(struct nfs_mount_data *data,
	case 2:
		data->bsize = 0;
	case 3:
			if (data->flags & NFS_MOUNT_VER3) {
				dprintk("%s: mount structure version %d does not support NFSv3\n",
						__FUNCTION__,
						data->version);
				return -EINVAL;
			}
		if (data->flags & NFS_MOUNT_VER3)
			goto out_no_v3;
		data->root.size = NFS2_FHSIZE;
		memcpy(data->root.data, data->old_root.data, NFS2_FHSIZE);
	case 4:
			if (data->flags & NFS_MOUNT_SECFLAVOUR) {
				dprintk("%s: mount structure version %d does not support strong security\n",
						__FUNCTION__,
						data->version);
				return -EINVAL;
			}
		if (data->flags & NFS_MOUNT_SECFLAVOUR)
			goto out_no_sec;
	case 5:
		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))
		data->pseudoflavor = RPC_AUTH_UNIX;

#ifndef CONFIG_NFS_V3
	/* If NFSv3 is not compiled in, return -EPROTONOSUPPORT */
	if (data->flags & NFS_MOUNT_VER3) {
		dprintk("%s: NFSv3 not compiled into kernel\n", __FUNCTION__);
		return -EPROTONOSUPPORT;
	}
#endif /* CONFIG_NFS_V3 */
	if (data->flags & NFS_MOUNT_VER3)
		goto out_v3_not_compiled;
#endif /* !CONFIG_NFS_V3 */

	/* We now require that the mount process passes the remote address */
	if (!nfs_verify_server_address((struct sockaddr *) &data->addr)) {
		dprintk("%s: mount program didn't pass remote address!\n",
			__FUNCTION__);
	if (!nfs_verify_server_address((struct sockaddr *) &data->addr))
		goto out_no_address;

	return 0;

out_no_data:
	dfprintk(MOUNT, "NFS: mount program didn't pass any mount data\n");
	return -EINVAL;
	}

	/* Prepare the root filehandle */
	if (data->flags & NFS_MOUNT_VER3)
		mntfh->size = data->root.size;
	else
		mntfh->size = NFS2_FHSIZE;
out_no_v3:
	dfprintk(MOUNT, "NFS: nfs_mount_data version %d does not support v3\n",
		 data->version);
	return -EINVAL;

	if (mntfh->size > sizeof(mntfh->data)) {
		dprintk("%s: invalid root filehandle\n", __FUNCTION__);
out_no_sec:
	dfprintk(MOUNT, "NFS: nfs_mount_data version supports only AUTH_SYS\n");
	return -EINVAL;
	}

	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);
out_bad_version:
	dfprintk(MOUNT, "NFS: bad nfs_mount_data version %d\n",
		 data->version);
	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;
}

/*