From 4f18daa42192090b135606816bcb3a6dd8777f0a Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Sun, 20 Oct 2019 11:09:10 -0400 Subject: [PATCH] LU-9859 libcfs: move remaining code from linux-module.c to module.c There is no longer any need to keep this code separate, and now we can remove linux-module.c Linux-commit: 9604c7ac2005e214cb08500c957a79c58bea5c83 Test-Parameters: trivial Change-Id: Ie2b905f5a79be17840ddfac0661c10332dc2667d Signed-off-by: NeilBrown Signed-off-by: Greg Kroah-Hartman Reviewed-on: https://review.whamcloud.com/36510 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Neil Brown Reviewed-by: Andreas Dilger Reviewed-by: Yang Sheng --- libcfs/libcfs/Makefile.in | 1 - libcfs/libcfs/linux/Makefile.am | 2 +- libcfs/libcfs/linux/linux-module.c | 153 ------------------------------------- libcfs/libcfs/module.c | 115 ++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+), 155 deletions(-) delete mode 100644 libcfs/libcfs/linux/linux-module.c diff --git a/libcfs/libcfs/Makefile.in b/libcfs/libcfs/Makefile.in index ea03a99..c3e4d98 100644 --- a/libcfs/libcfs/Makefile.in +++ b/libcfs/libcfs/Makefile.in @@ -4,7 +4,6 @@ libcfs-linux-objs := linux-tracefile.o linux-debug.o libcfs-linux-objs += linux-prim.o libcfs-linux-objs += linux-curproc.o libcfs-linux-objs += linux-hash.o -libcfs-linux-objs += linux-module.o libcfs-linux-objs += linux-crypto.o linux-crypto-adler.o libcfs-linux-objs += linux-wait.o @HAVE_CRC32_TRUE@libcfs-linux-objs += linux-crypto-crc32.o diff --git a/libcfs/libcfs/linux/Makefile.am b/libcfs/libcfs/linux/Makefile.am index d0f59df..f8c9fba 100644 --- a/libcfs/libcfs/linux/Makefile.am +++ b/libcfs/libcfs/linux/Makefile.am @@ -1,5 +1,5 @@ EXTRA_DIST = linux-debug.c linux-prim.c linux-tracefile.c \ - linux-curproc.c linux-module.c linux-hash.c linux-wait.c\ + linux-curproc.c linux-hash.c linux-wait.c\ linux-crypto.c linux-crypto-crc32.c linux-crypto-adler.c\ linux-crypto-crc32pclmul.c linux-crypto-crc32c-pclmul.c \ crc32-pclmul_asm.S crc32c-pcl-intel-asm_64.S inst.h diff --git a/libcfs/libcfs/linux/linux-module.c b/libcfs/libcfs/linux/linux-module.c deleted file mode 100644 index 6a8c3c4..0000000 --- a/libcfs/libcfs/linux/linux-module.c +++ /dev/null @@ -1,153 +0,0 @@ -/* - * GPL HEADER START - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 only, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License version 2 for more details (a copy is included - * in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see - * http://www.gnu.org/licenses/gpl-2.0.html - * - * GPL HEADER END - */ -/* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. - * Use is subject to license terms. - * - * Copyright (c) 2012, 2017, Intel Corporation. - */ -/* - * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. - */ - -#define DEBUG_SUBSYSTEM S_LNET - -#include -#include -#include -#include - -static inline size_t libcfs_ioctl_packlen(struct libcfs_ioctl_data *data) -{ - size_t len = sizeof(*data); - - len += (data->ioc_inllen1 + 7) & ~7; - len += (data->ioc_inllen2 + 7) & ~7; - return len; -} - -static bool libcfs_ioctl_is_invalid(struct libcfs_ioctl_data *data) -{ - if (data->ioc_hdr.ioc_len > BIT(30)) - return true; - - if (data->ioc_inllen1 > BIT(30)) - return true; - - if (data->ioc_inllen2 > BIT(30)) - return true; - - if (data->ioc_inlbuf1 && !data->ioc_inllen1) - return true; - - if (data->ioc_inlbuf2 && !data->ioc_inllen2) - return true; - - if (data->ioc_pbuf1 && !data->ioc_plen1) - return true; - - if (data->ioc_pbuf2 && !data->ioc_plen2) - return true; - - if (data->ioc_plen1 && !data->ioc_pbuf1) - return true; - - if (data->ioc_plen2 && !data->ioc_pbuf2) - return true; - - if (libcfs_ioctl_packlen(data) != data->ioc_hdr.ioc_len) - return true; - - if (data->ioc_inllen1 && - data->ioc_bulk[((data->ioc_inllen1 + 7) & ~7) + - data->ioc_inllen2 - 1] != '\0') - return true; - - return false; -} - -int libcfs_ioctl_data_adjust(struct libcfs_ioctl_data *data) -{ - ENTRY; - - if (libcfs_ioctl_is_invalid(data)) { - CERROR("libcfs ioctl: parameter not correctly formatted\n"); - RETURN(-EINVAL); - } - - if (data->ioc_inllen1 != 0) - data->ioc_inlbuf1 = &data->ioc_bulk[0]; - - if (data->ioc_inllen2 != 0) - data->ioc_inlbuf2 = &data->ioc_bulk[0] + - cfs_size_round(data->ioc_inllen1); - - RETURN(0); -} - -int libcfs_ioctl_getdata(struct libcfs_ioctl_hdr **hdr_pp, - struct libcfs_ioctl_hdr __user *uhdr) -{ - struct libcfs_ioctl_hdr hdr; - int err; - ENTRY; - - if (copy_from_user(&hdr, uhdr, sizeof(hdr))) - RETURN(-EFAULT); - - if (hdr.ioc_version != LIBCFS_IOCTL_VERSION && - hdr.ioc_version != LIBCFS_IOCTL_VERSION2) { - CERROR("libcfs ioctl: version mismatch expected %#x, got %#x\n", - LIBCFS_IOCTL_VERSION, hdr.ioc_version); - RETURN(-EINVAL); - } - - if (hdr.ioc_len < sizeof(struct libcfs_ioctl_hdr)) { - CERROR("libcfs ioctl: user buffer too small for ioctl\n"); - RETURN(-EINVAL); - } - - if (hdr.ioc_len > LIBCFS_IOC_DATA_MAX) { - CERROR("libcfs ioctl: user buffer is too large %d/%d\n", - hdr.ioc_len, LIBCFS_IOC_DATA_MAX); - RETURN(-EINVAL); - } - - LIBCFS_ALLOC(*hdr_pp, hdr.ioc_len); - if (*hdr_pp == NULL) - RETURN(-ENOMEM); - - if (copy_from_user(*hdr_pp, uhdr, hdr.ioc_len)) - GOTO(free, err = -EFAULT); - - if ((*hdr_pp)->ioc_version != hdr.ioc_version || - (*hdr_pp)->ioc_len != hdr.ioc_len) { - GOTO(free, err = -EINVAL); - } - - RETURN(0); - -free: - LIBCFS_FREE(*hdr_pp, hdr.ioc_len); - RETURN(err); -} diff --git a/libcfs/libcfs/module.c b/libcfs/libcfs/module.c index b84f586..1d2351e 100644 --- a/libcfs/libcfs/module.c +++ b/libcfs/libcfs/module.c @@ -61,6 +61,121 @@ static struct dentry *lnet_debugfs_root; BLOCKING_NOTIFIER_HEAD(libcfs_ioctl_list); EXPORT_SYMBOL(libcfs_ioctl_list); +static inline size_t libcfs_ioctl_packlen(struct libcfs_ioctl_data *data) +{ + size_t len = sizeof(*data); + + len += (data->ioc_inllen1 + 7) & ~7; + len += (data->ioc_inllen2 + 7) & ~7; + return len; +} + +static bool libcfs_ioctl_is_invalid(struct libcfs_ioctl_data *data) +{ + if (data->ioc_hdr.ioc_len > BIT(30)) + return true; + + if (data->ioc_inllen1 > BIT(30)) + return true; + + if (data->ioc_inllen2 > BIT(30)) + return true; + + if (data->ioc_inlbuf1 && !data->ioc_inllen1) + return true; + + if (data->ioc_inlbuf2 && !data->ioc_inllen2) + return true; + + if (data->ioc_pbuf1 && !data->ioc_plen1) + return true; + + if (data->ioc_pbuf2 && !data->ioc_plen2) + return true; + + if (data->ioc_plen1 && !data->ioc_pbuf1) + return true; + + if (data->ioc_plen2 && !data->ioc_pbuf2) + return true; + + if (libcfs_ioctl_packlen(data) != data->ioc_hdr.ioc_len) + return true; + + if (data->ioc_inllen1 && + data->ioc_bulk[((data->ioc_inllen1 + 7) & ~7) + + data->ioc_inllen2 - 1] != '\0') + return true; + + return false; +} + +int libcfs_ioctl_data_adjust(struct libcfs_ioctl_data *data) +{ + ENTRY; + + if (libcfs_ioctl_is_invalid(data)) { + CERROR("libcfs ioctl: parameter not correctly formatted\n"); + RETURN(-EINVAL); + } + + if (data->ioc_inllen1 != 0) + data->ioc_inlbuf1 = &data->ioc_bulk[0]; + + if (data->ioc_inllen2 != 0) + data->ioc_inlbuf2 = &data->ioc_bulk[0] + + cfs_size_round(data->ioc_inllen1); + + RETURN(0); +} + +int libcfs_ioctl_getdata(struct libcfs_ioctl_hdr **hdr_pp, + struct libcfs_ioctl_hdr __user *uhdr) +{ + struct libcfs_ioctl_hdr hdr; + int err; + + ENTRY; + if (copy_from_user(&hdr, uhdr, sizeof(hdr))) + RETURN(-EFAULT); + + if (hdr.ioc_version != LIBCFS_IOCTL_VERSION && + hdr.ioc_version != LIBCFS_IOCTL_VERSION2) { + CERROR("libcfs ioctl: version mismatch expected %#x, got %#x\n", + LIBCFS_IOCTL_VERSION, hdr.ioc_version); + RETURN(-EINVAL); + } + + if (hdr.ioc_len < sizeof(struct libcfs_ioctl_hdr)) { + CERROR("libcfs ioctl: user buffer too small for ioctl\n"); + RETURN(-EINVAL); + } + + if (hdr.ioc_len > LIBCFS_IOC_DATA_MAX) { + CERROR("libcfs ioctl: user buffer is too large %d/%d\n", + hdr.ioc_len, LIBCFS_IOC_DATA_MAX); + RETURN(-EINVAL); + } + + LIBCFS_ALLOC(*hdr_pp, hdr.ioc_len); + if (*hdr_pp == NULL) + RETURN(-ENOMEM); + + if (copy_from_user(*hdr_pp, uhdr, hdr.ioc_len)) + GOTO(free, err = -EFAULT); + + if ((*hdr_pp)->ioc_version != hdr.ioc_version || + (*hdr_pp)->ioc_len != hdr.ioc_len) { + GOTO(free, err = -EINVAL); + } + + RETURN(0); + +free: + LIBCFS_FREE(*hdr_pp, hdr.ioc_len); + RETURN(err); +} + static int libcfs_ioctl(unsigned long cmd, void __user *uparam) { struct libcfs_ioctl_data *data = NULL; -- 1.8.3.1