Whamcloud - gitweb
LU-6485 libcfs: embed kr_data into kkuc_reg 38/14638/13
authorHongchao Zhang <hongchao.zhang@intel.com>
Tue, 16 Jun 2015 14:17:48 +0000 (22:17 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Sat, 19 Sep 2015 03:20:18 +0000 (03:20 +0000)
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 <hongchao.zhang@intel.com>
Reviewed-on: http://review.whamcloud.com/14638
Tested-by: Jenkins
Reviewed-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: frank zago <fzago@cray.com>
Reviewed-by: Robert Read <robert.read@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Henri Doreau <henri.doreau@cea.fr>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/lustre_kernelcomm.h
lustre/lmv/lmv_obd.c
lustre/mdc/mdc_request.c
lustre/obdclass/kernelcomm.c

index d9955b8..171fcc4 100644 (file)
@@ -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);
 
index b58caad..7acb440 100644 (file)
@@ -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);
 }
index 3e41015..06daca0 100644 (file)
@@ -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);
index f9763f1..f178ebc 100644 (file)
@@ -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);
                }
        }