From 7f67aa42f9123caef3cee714f1e2cee3c6848892 Mon Sep 17 00:00:00 2001 From: Hongchao Zhang Date: Tue, 16 Jun 2015 22:17:48 +0800 Subject: [PATCH] LU-6485 libcfs: embed kr_data into kkuc_reg In struct kkuc_reg, the "kr_data" is difficult to be freed outside of libcfs, then it's better to change it to be inline data instead of the data pointer. Change-Id: Iaf5e9fbb9bad2540f51da2c4fd9c4047640d0877 Signed-off-by: Hongchao Zhang Reviewed-on: http://review.whamcloud.com/14638 Tested-by: Jenkins Reviewed-by: John L. Hammond Reviewed-by: James Simmons Reviewed-by: frank zago Reviewed-by: Robert Read Tested-by: Maloo Reviewed-by: Henri Doreau Reviewed-by: Oleg Drokin --- lustre/include/lustre_kernelcomm.h | 4 ++-- lustre/lmv/lmv_obd.c | 32 +++++++++++--------------------- lustre/mdc/mdc_request.c | 2 +- lustre/obdclass/kernelcomm.c | 13 ++++++------- 4 files changed, 20 insertions(+), 31 deletions(-) diff --git a/lustre/include/lustre_kernelcomm.h b/lustre/include/lustre_kernelcomm.h index d9955b8..171fcc4 100644 --- a/lustre/include/lustre_kernelcomm.h +++ b/lustre/include/lustre_kernelcomm.h @@ -47,8 +47,8 @@ typedef int (*libcfs_kkuc_cb_t)(void *data, void *cb_arg); int libcfs_kkuc_msg_put(struct file *fp, void *payload); int libcfs_kkuc_group_put(int group, void *payload); int libcfs_kkuc_group_add(struct file *fp, int uid, int group, - void *data); -int libcfs_kkuc_group_rem(int uid, int group, void **pdata); + void *data, size_t data_len); +int libcfs_kkuc_group_rem(int uid, int group); int libcfs_kkuc_group_foreach(int group, libcfs_kkuc_cb_t cb_func, void *cb_arg); diff --git a/lustre/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c index b58caad..7acb440 100644 --- a/lustre/lmv/lmv_obd.c +++ b/lustre/lmv/lmv_obd.c @@ -810,9 +810,8 @@ static void lmv_hsm_req_build(struct lmv_obd *lmv, static int lmv_hsm_ct_unregister(struct lmv_obd *lmv, unsigned int cmd, int len, struct lustre_kernelcomm *lk, void *uarg) { - __u32 i; - int rc; - struct kkuc_ct_data *kcd = NULL; + __u32 i; + int rc; ENTRY; /* unregister request (call from llapi_hsm_copytool_fini) */ @@ -830,9 +829,7 @@ static int lmv_hsm_ct_unregister(struct lmv_obd *lmv, unsigned int cmd, int len, * Unreached coordinators will get EPIPE on next requests * and will unregister automatically. */ - rc = libcfs_kkuc_group_rem(lk->lk_uid, lk->lk_group, (void **)&kcd); - if (kcd != NULL) - OBD_FREE_PTR(kcd); + rc = libcfs_kkuc_group_rem(lk->lk_uid, lk->lk_group); RETURN(rc); } @@ -844,7 +841,7 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, __u32 i, j; int err, rc; bool any_set = false; - struct kkuc_ct_data *kcd; + struct kkuc_ct_data kcd = { 0 }; ENTRY; /* All or nothing: try to register to all MDS. @@ -892,21 +889,14 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, if (filp == NULL) RETURN(-EBADF); - OBD_ALLOC_PTR(kcd); - if (kcd == NULL) { - fput(filp); - RETURN(-ENOMEM); - } - kcd->kcd_magic = KKUC_CT_DATA_MAGIC; - kcd->kcd_uuid = lmv->cluuid; - kcd->kcd_archive = lk->lk_data; + kcd.kcd_magic = KKUC_CT_DATA_MAGIC; + kcd.kcd_uuid = lmv->cluuid; + kcd.kcd_archive = lk->lk_data; - rc = libcfs_kkuc_group_add(filp, lk->lk_uid, lk->lk_group, kcd); - if (rc != 0) { - if (filp != NULL) - fput(filp); - OBD_FREE_PTR(kcd); - } + rc = libcfs_kkuc_group_add(filp, lk->lk_uid, lk->lk_group, + &kcd, sizeof(kcd)); + if (rc != 0) + fput(filp); RETURN(rc); } diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index 3e41015..06daca0 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -2674,7 +2674,7 @@ static int mdc_precleanup(struct obd_device *obd, enum obd_cleanup_stage stage) case OBD_CLEANUP_EXPORTS: /* Failsafe, ok if racy */ if (obd->obd_type->typ_refcnt <= 1) - libcfs_kkuc_group_rem(0, KUC_GRP_HSM, NULL); + libcfs_kkuc_group_rem(0, KUC_GRP_HSM); obd_cleanup_client_import(obd); ptlrpc_lprocfs_unregister_obd(obd); diff --git a/lustre/obdclass/kernelcomm.c b/lustre/obdclass/kernelcomm.c index f9763f1..f178ebc 100644 --- a/lustre/obdclass/kernelcomm.c +++ b/lustre/obdclass/kernelcomm.c @@ -102,7 +102,7 @@ struct kkuc_reg { struct list_head kr_chain; int kr_uid; struct file *kr_fp; - void *kr_data; + char kr_data[0]; }; static struct list_head kkuc_groups[KUC_GRP_MAX+1] = {}; @@ -115,7 +115,8 @@ static DECLARE_RWSEM(kg_sem); * @param group group number * @param data user data */ -int libcfs_kkuc_group_add(struct file *filp, int uid, int group, void *data) +int libcfs_kkuc_group_add(struct file *filp, int uid, int group, + void *data, size_t data_len) { struct kkuc_reg *reg; @@ -129,13 +130,13 @@ int libcfs_kkuc_group_add(struct file *filp, int uid, int group, void *data) return -EBADF; /* freed in group_rem */ - reg = kmalloc(sizeof(*reg), 0); + reg = kmalloc(sizeof(*reg) + data_len, 0); if (reg == NULL) return -ENOMEM; reg->kr_fp = filp; reg->kr_uid = uid; - reg->kr_data = data; + memcpy(reg->kr_data, data, data_len); down_write(&kg_sem); if (kkuc_groups[group].next == NULL) @@ -149,7 +150,7 @@ int libcfs_kkuc_group_add(struct file *filp, int uid, int group, void *data) } EXPORT_SYMBOL(libcfs_kkuc_group_add); -int libcfs_kkuc_group_rem(int uid, int group, void **pdata) +int libcfs_kkuc_group_rem(int uid, int group) { struct kkuc_reg *reg, *next; ENTRY; @@ -176,8 +177,6 @@ int libcfs_kkuc_group_rem(int uid, int group, void **pdata) reg->kr_uid, reg->kr_fp, group); if (reg->kr_fp != NULL) fput(reg->kr_fp); - if (pdata != NULL) - *pdata = reg->kr_data; kfree(reg); } } -- 1.8.3.1