From cf7df5976769bbaa8cab1fc7b8fb80296bfef833 Mon Sep 17 00:00:00 2001 From: James Simmons Date: Wed, 27 Jan 2016 10:20:33 -0500 Subject: [PATCH 1/1] LU-6245 libcfs: make libcfs_ioctl.h and lnetctl.h uapi compliant For UAPI headers the policy is to only have data structures shared between user land and kernel space. All non data structures except a reference to libcfs_ioctl_data_adjust() have been removed. libcfs_ioctl_data_adjust can go away when the two module.c files for libcfs will merger. For lnetctl.h we remove userland only function prototypes.h Change-Id: I4e09041a7f0b590d7eb81eda32f0bccdfb9d28ac Signed-off-by: James Simmons Reviewed-on: http://review.whamcloud.com/17643 Reviewed-by: Bob Glossman Tested-by: Jenkins Reviewed-by: John L. Hammond Tested-by: Maloo Reviewed-by: Dmitry Eremin Reviewed-by: Oleg Drokin --- libcfs/include/libcfs/libcfs.h | 5 +- libcfs/include/libcfs/libcfs_ioctl.h | 110 +++++------------------------------ libcfs/include/libcfs/util/ioctl.h | 14 +++++ libcfs/libcfs/linux/linux-module.c | 49 ++++++++++++++++ libcfs/libcfs/util/l_ioctl.c | 12 +++- lnet/include/lnet/lnetctl.h | 62 ++------------------ lnet/utils/Makefile.am | 1 + lnet/utils/lst.c | 1 + lustre/include/lustre_ioctl.h | 6 ++ lustre/utils/lustre_cfg.c | 1 + lustre/utils/obdctl.h | 47 +++++++++++++++ 11 files changed, 151 insertions(+), 157 deletions(-) diff --git a/libcfs/include/libcfs/libcfs.h b/libcfs/include/libcfs/libcfs.h index 550e682..97be523 100644 --- a/libcfs/include/libcfs/libcfs.h +++ b/libcfs/include/libcfs/libcfs.h @@ -154,8 +154,6 @@ void lc_watchdog_delete(struct lc_watchdog *lcw); #define LNET_ACCEPTOR_MIN_RESERVED_PORT 512 #define LNET_ACCEPTOR_MAX_RESERVED_PORT 1023 -int libcfs_ioctl(unsigned long cmd, void __user *uparam); - /* * Drop into debugger, if possible. Implementation is provided by platform. */ @@ -199,6 +197,9 @@ void cfs_get_random_bytes(void *buf, int size); # include # include +int libcfs_ioctl_data_adjust(struct libcfs_ioctl_data *data); +int libcfs_ioctl(unsigned long cmd, void __user *uparam); + /* container_of depends on "likely" which is defined in libcfs_private.h */ static inline void *__container_of(const void *ptr, unsigned long shift) { diff --git a/libcfs/include/libcfs/libcfs_ioctl.h b/libcfs/include/libcfs/libcfs_ioctl.h index ee9b86b..f403e9b 100644 --- a/libcfs/include/libcfs/libcfs_ioctl.h +++ b/libcfs/include/libcfs/libcfs_ioctl.h @@ -43,6 +43,9 @@ #ifndef __LIBCFS_IOCTL_H__ #define __LIBCFS_IOCTL_H__ +#include +#include + #define LIBCFS_IOCTL_VERSION 0x0001000a #define LIBCFS_IOCTL_VERSION2 0x0001000b @@ -78,8 +81,6 @@ struct libcfs_ioctl_data { char ioc_bulk[0]; }; -#define ioc_priority ioc_u32[0] - struct libcfs_debug_ioctl_data { struct libcfs_ioctl_hdr hdr; @@ -87,20 +88,6 @@ struct libcfs_debug_ioctl_data unsigned int debug; }; -#define LIBCFS_IOC_INIT(data) \ -do { \ - memset(&data, 0, sizeof(data)); \ - data.ioc_hdr.ioc_version = LIBCFS_IOCTL_VERSION; \ - data.ioc_hdr.ioc_len = sizeof(data); \ -} while (0) - -#define LIBCFS_IOC_INIT_V2(data, hdr) \ -do { \ - memset(&(data), 0, sizeof(data)); \ - (data).hdr.ioc_version = LIBCFS_IOCTL_VERSION2; \ - (data).hdr.ioc_len = sizeof(data); \ -} while (0) - /* 'f' ioctls are defined in lustre_ioctl.h and lustre_user.h except for: */ #define LIBCFS_IOC_DEBUG_MASK _IOWR('f', 250, long) #define IOCTL_LIBCFS_TYPE long @@ -145,83 +132,18 @@ do { \ * tools which might be accessing the IOCTL numbers, a new group of IOCTL * number have been allocated. */ -#define IOCTL_CONFIG_SIZE struct lnet_ioctl_config_data -#define IOC_LIBCFS_ADD_ROUTE _IOWR(IOC_LIBCFS_TYPE, 81, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_DEL_ROUTE _IOWR(IOC_LIBCFS_TYPE, 82, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_GET_ROUTE _IOWR(IOC_LIBCFS_TYPE, 83, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_ADD_NET _IOWR(IOC_LIBCFS_TYPE, 84, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_DEL_NET _IOWR(IOC_LIBCFS_TYPE, 85, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_GET_NET _IOWR(IOC_LIBCFS_TYPE, 86, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_CONFIG_RTR _IOWR(IOC_LIBCFS_TYPE, 87, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_ADD_BUF _IOWR(IOC_LIBCFS_TYPE, 88, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_GET_BUF _IOWR(IOC_LIBCFS_TYPE, 89, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_GET_PEER_INFO _IOWR(IOC_LIBCFS_TYPE, 90, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_GET_LNET_STATS _IOWR(IOC_LIBCFS_TYPE, 91, \ - IOCTL_CONFIG_SIZE) -#define IOC_LIBCFS_MAX_NR 91 - -static inline int libcfs_ioctl_packlen(struct libcfs_ioctl_data *data) -{ - int len = sizeof(*data); - len += (data->ioc_inllen1 + 7) & ~7; - len += (data->ioc_inllen2 + 7) & ~7; - return len; -} - -static inline bool libcfs_ioctl_is_invalid(struct libcfs_ioctl_data *data) -{ - if (data->ioc_hdr.ioc_len > (1<<30)) - return 1; - - if (data->ioc_inllen1 > (1<<30)) - return 1; - - if (data->ioc_inllen2 > (1<<30)) - return 1; - - if (data->ioc_inlbuf1 && data->ioc_inllen1 == 0) - return 1; - - if (data->ioc_inlbuf2 && data->ioc_inllen2 == 0) - return 1; - - if (data->ioc_pbuf1 && data->ioc_plen1 == 0) - return 1; - - if (data->ioc_pbuf2 && data->ioc_plen2 == 0) - return 1; - - if (data->ioc_plen1 && data->ioc_pbuf1 == NULL) - return 1; - - if (data->ioc_plen2 && data->ioc_pbuf2 == NULL) - return 1; - - if ((__u32)libcfs_ioctl_packlen(data) != data->ioc_hdr.ioc_len) - return 1; - - if (data->ioc_inllen1 && - data->ioc_bulk[data->ioc_inllen1 - 1] != '\0') - return 1; - - if (data->ioc_inllen2 && - data->ioc_bulk[((data->ioc_inllen1 + 7) & ~7) + - data->ioc_inllen2 - 1] != '\0') - return 1; - - return 0; -} - -extern int libcfs_ioctl_data_adjust(struct libcfs_ioctl_data *data); +#define IOCTL_CONFIG_SIZE struct lnet_ioctl_config_data +#define IOC_LIBCFS_ADD_ROUTE _IOWR(IOC_LIBCFS_TYPE, 81, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_DEL_ROUTE _IOWR(IOC_LIBCFS_TYPE, 82, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_GET_ROUTE _IOWR(IOC_LIBCFS_TYPE, 83, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_ADD_NET _IOWR(IOC_LIBCFS_TYPE, 84, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_DEL_NET _IOWR(IOC_LIBCFS_TYPE, 85, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_GET_NET _IOWR(IOC_LIBCFS_TYPE, 86, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_CONFIG_RTR _IOWR(IOC_LIBCFS_TYPE, 87, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_ADD_BUF _IOWR(IOC_LIBCFS_TYPE, 88, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_GET_BUF _IOWR(IOC_LIBCFS_TYPE, 89, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_GET_PEER_INFO _IOWR(IOC_LIBCFS_TYPE, 90, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_GET_LNET_STATS _IOWR(IOC_LIBCFS_TYPE, 91, IOCTL_CONFIG_SIZE) +#define IOC_LIBCFS_MAX_NR 91 #endif /* __LIBCFS_IOCTL_H__ */ diff --git a/libcfs/include/libcfs/util/ioctl.h b/libcfs/include/libcfs/util/ioctl.h index 5bf447b..c8a1242 100644 --- a/libcfs/include/libcfs/util/ioctl.h +++ b/libcfs/include/libcfs/util/ioctl.h @@ -49,6 +49,20 @@ #include +#define LIBCFS_IOC_INIT(data) \ +do { \ + memset(&(data), 0, sizeof(data)); \ + (data).ioc_hdr.ioc_version = LIBCFS_IOCTL_VERSION; \ + (data).ioc_hdr.ioc_len = sizeof(data); \ +} while (0) + +#define LIBCFS_IOC_INIT_V2(data, hdr) \ +do { \ + memset(&(data), 0, sizeof(data)); \ + (data).hdr.ioc_version = LIBCFS_IOCTL_VERSION2; \ + (data).hdr.ioc_len = sizeof(data); \ +} while (0) + /* FIXME - rename these to libcfs_ */ int libcfs_ioctl_pack(struct libcfs_ioctl_data *data, char **pbuf, int max); void libcfs_ioctl_unpack(struct libcfs_ioctl_data *data, char *pbuf); diff --git a/libcfs/libcfs/linux/linux-module.c b/libcfs/libcfs/linux/linux-module.c index 377f24f..c4f578b 100644 --- a/libcfs/libcfs/linux/linux-module.c +++ b/libcfs/libcfs/linux/linux-module.c @@ -40,6 +40,55 @@ #define LNET_MINOR 240 +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; diff --git a/libcfs/libcfs/util/l_ioctl.c b/libcfs/libcfs/util/l_ioctl.c index 9dcc21d..0cf8924 100644 --- a/libcfs/libcfs/util/l_ioctl.c +++ b/libcfs/libcfs/util/l_ioctl.c @@ -146,6 +146,15 @@ unregister_ioc_dev(int dev_id) ioc_dev_list[dev_id].dev_fd = -1; } +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; +} + int libcfs_ioctl_pack(struct libcfs_ioctl_data *data, char **pbuf, int max) { @@ -175,9 +184,6 @@ int libcfs_ioctl_pack(struct libcfs_ioctl_data *data, char **pbuf, ptr += ((data->ioc_inllen2 + 7) & ~7); } - if (libcfs_ioctl_is_invalid(overlay)) - return 1; - return 0; } diff --git a/lnet/include/lnet/lnetctl.h b/lnet/include/lnet/lnetctl.h index d98a914..3d7fd27 100644 --- a/lnet/include/lnet/lnetctl.h +++ b/lnet/include/lnet/lnetctl.h @@ -124,63 +124,9 @@ struct lnet_fault_stat { /** @} lnet_fault_simulation */ -#define LNET_DEV_ID 0 -#define LNET_DEV_PATH "/dev/lnet" -#define LNET_DEV_MAJOR 10 -#define LNET_DEV_MINOR 240 -#define OBD_DEV_ID 1 -#define OBD_DEV_NAME "obd" -#define OBD_DEV_PATH "/dev/" OBD_DEV_NAME -#define OBD_DEV_MAJOR 10 -#define OBD_DEV_MINOR 241 -#define SMFS_DEV_ID 2 -#define SMFS_DEV_PATH "/dev/snapdev" -#define SMFS_DEV_MAJOR 10 -#define SMFS_DEV_MINOR 242 - -int ptl_initialize(int argc, char **argv); -int jt_ptl_network(int argc, char **argv); -int jt_ptl_list_nids(int argc, char **argv); -int jt_ptl_which_nid(int argc, char **argv); -int jt_ptl_print_interfaces(int argc, char **argv); -int jt_ptl_add_interface(int argc, char **argv); -int jt_ptl_del_interface(int argc, char **argv); -int jt_ptl_print_peers (int argc, char **argv); -int jt_ptl_add_peer (int argc, char **argv); -int jt_ptl_del_peer (int argc, char **argv); -int jt_ptl_print_connections (int argc, char **argv); -int jt_ptl_disconnect(int argc, char **argv); -int jt_ptl_push_connection(int argc, char **argv); -int jt_ptl_ping(int argc, char **argv); -int jt_ptl_mynid(int argc, char **argv); -int jt_ptl_add_uuid(int argc, char **argv); -int jt_ptl_add_uuid_old(int argc, char **argv); /* backwards compatibility */ -int jt_ptl_close_uuid(int argc, char **argv); -int jt_ptl_del_uuid(int argc, char **argv); -int jt_ptl_add_route (int argc, char **argv); -int jt_ptl_del_route (int argc, char **argv); -int jt_ptl_notify_router (int argc, char **argv); -int jt_ptl_print_routes (int argc, char **argv); -int jt_ptl_fail_nid (int argc, char **argv); -int jt_ptl_testprotocompat(int argc, char **argv); -int jt_ptl_drop_add(int argc, char **argv); -int jt_ptl_drop_del(int argc, char **argv); -int jt_ptl_drop_reset(int argc, char **argv); -int jt_ptl_drop_list(int argc, char **argv); -int jt_ptl_delay_add(int argc, char **argv); -int jt_ptl_delay_del(int argc, char **argv); -int jt_ptl_delay_reset(int argc, char **argv); -int jt_ptl_delay_list(int argc, char **argv); - -int dbg_initialize(int argc, char **argv); -int jt_dbg_filter(int argc, char **argv); -int jt_dbg_show(int argc, char **argv); -int jt_dbg_list(int argc, char **argv); -int jt_dbg_debug_kernel(int argc, char **argv); -int jt_dbg_debug_daemon(int argc, char **argv); -int jt_dbg_debug_file(int argc, char **argv); -int jt_dbg_clear_debug_buf(int argc, char **argv); -int jt_dbg_mark_debug_buf(int argc, char **argv); -int jt_dbg_modules(int argc, char **argv); +#define LNET_DEV_ID 0 +#define LNET_DEV_PATH "/dev/lnet" +#define LNET_DEV_MAJOR 10 +#define LNET_DEV_MINOR 240 #endif diff --git a/lnet/utils/Makefile.am b/lnet/utils/Makefile.am index ab9ef92..60d5f6c 100644 --- a/lnet/utils/Makefile.am +++ b/lnet/utils/Makefile.am @@ -57,6 +57,7 @@ routerstat_SOURCES = routerstat.c routerstat_LDADD = $(LIBCFS) lst_SOURCES = lst.c +lst_CPPFLAGS = -I$(top_builddir)/lustre lst_LDADD = -lptlctl $(LIBCFSUTIL) $(LIBCFS) $(LIBREADLINE) $(LIBEFENCE) lst_DEPENDENCIES = libptlctl.a diff --git a/lnet/utils/lst.c b/lnet/utils/lst.c index da14214..07c5fcb 100644 --- a/lnet/utils/lst.c +++ b/lnet/utils/lst.c @@ -54,6 +54,7 @@ #include #include #include +#include lst_sid_t LST_INVALID_SID = {LNET_NID_ANY, -1}; static lst_sid_t session_id; diff --git a/lustre/include/lustre_ioctl.h b/lustre/include/lustre_ioctl.h index 092b13f..cefbc7e 100644 --- a/lustre/include/lustre_ioctl.h +++ b/lustre/include/lustre_ioctl.h @@ -55,6 +55,12 @@ enum md_echo_cmd { ECHO_MD_ALLOC_FID = 8, /* Get FIDs from MDT */ }; +#define OBD_DEV_ID 1 +#define OBD_DEV_NAME "obd" +#define OBD_DEV_PATH "/dev/" OBD_DEV_NAME +#define OBD_DEV_MAJOR 10 +#define OBD_DEV_MINOR 241 + #define OBD_IOCTL_VERSION 0x00010004 #define OBD_DEV_BY_DEVNAME 0xffffd0de #define OBD_MAX_IOCTL_BUFFER CONFIG_LUSTRE_OBD_MAX_IOCTL_BUFFER diff --git a/lustre/utils/lustre_cfg.c b/lustre/utils/lustre_cfg.c index a588e3d..a664260 100644 --- a/lustre/utils/lustre_cfg.c +++ b/lustre/utils/lustre_cfg.c @@ -54,6 +54,7 @@ #include #include #include +#include #include #include diff --git a/lustre/utils/obdctl.h b/lustre/utils/obdctl.h index 0e8103f..7d80795 100644 --- a/lustre/utils/obdctl.h +++ b/lustre/utils/obdctl.h @@ -39,6 +39,53 @@ #define MAX_IOC_BUFLEN 8192 +/* ptlctl.a */ +int ptl_initialize(int argc, char **argv); +int jt_ptl_network(int argc, char **argv); +int jt_ptl_list_nids(int argc, char **argv); +int jt_ptl_which_nid(int argc, char **argv); +int jt_ptl_print_interfaces(int argc, char **argv); +int jt_ptl_add_interface(int argc, char **argv); +int jt_ptl_del_interface(int argc, char **argv); +int jt_ptl_print_peers(int argc, char **argv); +int jt_ptl_add_peer(int argc, char **argv); +int jt_ptl_del_peer(int argc, char **argv); +int jt_ptl_print_connections(int argc, char **argv); +int jt_ptl_disconnect(int argc, char **argv); +int jt_ptl_push_connection(int argc, char **argv); +int jt_ptl_ping(int argc, char **argv); +int jt_ptl_mynid(int argc, char **argv); +int jt_ptl_add_uuid(int argc, char **argv); +int jt_ptl_add_uuid_old(int argc, char **argv); /* backwards compatibility */ +int jt_ptl_close_uuid(int argc, char **argv); +int jt_ptl_del_uuid(int argc, char **argv); +int jt_ptl_add_route(int argc, char **argv); +int jt_ptl_del_route(int argc, char **argv); +int jt_ptl_notify_router(int argc, char **argv); +int jt_ptl_print_routes(int argc, char **argv); +int jt_ptl_fail_nid(int argc, char **argv); +int jt_ptl_testprotocompat(int argc, char **argv); +int jt_ptl_drop_add(int argc, char **argv); +int jt_ptl_drop_del(int argc, char **argv); +int jt_ptl_drop_reset(int argc, char **argv); +int jt_ptl_drop_list(int argc, char **argv); +int jt_ptl_delay_add(int argc, char **argv); +int jt_ptl_delay_del(int argc, char **argv); +int jt_ptl_delay_reset(int argc, char **argv); +int jt_ptl_delay_list(int argc, char **argv); + +/* debug.c */ +int dbg_initialize(int argc, char **argv); +int jt_dbg_filter(int argc, char **argv); +int jt_dbg_show(int argc, char **argv); +int jt_dbg_list(int argc, char **argv); +int jt_dbg_debug_kernel(int argc, char **argv); +int jt_dbg_debug_daemon(int argc, char **argv); +int jt_dbg_debug_file(int argc, char **argv); +int jt_dbg_clear_debug_buf(int argc, char **argv); +int jt_dbg_mark_debug_buf(int argc, char **argv); +int jt_dbg_modules(int argc, char **argv); + /* obd.c */ int do_disconnect(char *func, int verbose); int obd_initialize(int argc, char **argv); -- 1.8.3.1