* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, 2013, Intel Corporation.
+ * Copyright (c) 2015, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
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] = {};
* @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;
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)
}
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;
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);
}
}
ENTRY;
down_write(&kg_sem);
+
+ if (unlikely(kkuc_groups[group].next == NULL) ||
+ unlikely(OBD_FAIL_CHECK(OBD_FAIL_MDS_HSM_CT_REGISTER_NET))) {
+ /* no agent have fully registered, CDT will retry */
+ up_write(&kg_sem);
+ RETURN(-EAGAIN);
+ }
+
list_for_each_entry(reg, &kkuc_groups[group], kr_chain) {
if (reg->kr_fp != NULL) {
rc = libcfs_kkuc_msg_put(reg->kr_fp, payload);