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>
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,
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);
int libcfs_kkuc_group_foreach(int group, libcfs_kkuc_cb_t cb_func,
void *cb_arg);
static int lmv_hsm_ct_unregister(struct lmv_obd *lmv, unsigned int cmd, int len,
struct lustre_kernelcomm *lk, void *uarg)
{
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;
ENTRY;
/* unregister request (call from llapi_hsm_copytool_fini) */
ENTRY;
/* unregister request (call from llapi_hsm_copytool_fini) */
* Unreached coordinators will get EPIPE on next requests
* and will unregister automatically.
*/
* 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);
__u32 i, j;
int err, rc;
bool any_set = false;
__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.
ENTRY;
/* All or nothing: try to register to all MDS.
if (filp == NULL)
RETURN(-EBADF);
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);
case OBD_CLEANUP_EXPORTS:
/* Failsafe, ok if racy */
if (obd->obd_type->typ_refcnt <= 1)
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);
obd_cleanup_client_import(obd);
ptlrpc_lprocfs_unregister_obd(obd);
struct list_head kr_chain;
int kr_uid;
struct file *kr_fp;
struct list_head kr_chain;
int kr_uid;
struct file *kr_fp;
};
static struct list_head kkuc_groups[KUC_GRP_MAX+1] = {};
};
static struct list_head kkuc_groups[KUC_GRP_MAX+1] = {};
* @param group group number
* @param data user data
*/
* @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)
return -EBADF;
/* freed in group_rem */
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;
if (reg == NULL)
return -ENOMEM;
reg->kr_fp = filp;
reg->kr_uid = uid;
+ memcpy(reg->kr_data, data, data_len);
down_write(&kg_sem);
if (kkuc_groups[group].next == NULL)
down_write(&kg_sem);
if (kkuc_groups[group].next == NULL)
}
EXPORT_SYMBOL(libcfs_kkuc_group_add);
}
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;
{
struct kkuc_reg *reg, *next;
ENTRY;
reg->kr_uid, reg->kr_fp, group);
if (reg->kr_fp != NULL)
fput(reg->kr_fp);
reg->kr_uid, reg->kr_fp, group);
if (reg->kr_fp != NULL)
fput(reg->kr_fp);
- if (pdata != NULL)
- *pdata = reg->kr_data;