#define KKUC_CT_DATA_MAGIC 0x092013cea
struct kkuc_ct_data {
__u32 kcd_magic;
- struct obd_uuid kcd_uuid;
__u32 kcd_archive;
};
/* Kernel methods */
void libcfs_kkuc_init(void);
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, 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_put(const struct obd_uuid *uuid, int group, void *data);
+int libcfs_kkuc_group_add(struct file *fp, const struct obd_uuid *uuid, int uid,
+ int group, void *data, size_t data_len);
+int libcfs_kkuc_group_rem(const struct obd_uuid *uuid, int uid, int group);
+int libcfs_kkuc_group_foreach(const struct obd_uuid *uuid, int group,
+ libcfs_kkuc_cb_t cb_func, void *cb_arg);
#endif /* __LUSTRE_KERNELCOMM_H__ */
struct lu_client_fld lmv_fld;
spinlock_t lmv_lock;
struct lmv_desc desc;
- struct obd_uuid cluuid;
struct proc_dir_entry *targets_proc_entry;
struct mutex lmv_init_mutex;
exp = class_conn2export(&conn);
lmv->connected = 0;
- lmv->cluuid = *cluuid;
lmv->conn_data = *data;
if (lmv->targets_proc_entry == NULL) {
int lmv_connect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
{
struct lmv_obd *lmv = &obd->u.lmv;
- struct obd_uuid *cluuid = &lmv->cluuid;
- struct obd_uuid lmv_mdc_uuid = { "LMV_MDC_UUID" };
struct obd_device *mdc_obd;
struct obd_export *mdc_exp;
struct lu_fld_target target;
RETURN(-EINVAL);
}
- CDEBUG(D_CONFIG, "connect to %s(%s) - %s, %s FOR %s\n",
- mdc_obd->obd_name, mdc_obd->obd_uuid.uuid,
- tgt->ltd_uuid.uuid, obd->obd_uuid.uuid,
- cluuid->uuid);
+ CDEBUG(D_CONFIG, "connect to %s(%s) - %s, %s\n",
+ mdc_obd->obd_name, mdc_obd->obd_uuid.uuid,
+ tgt->ltd_uuid.uuid, obd->obd_uuid.uuid);
if (!mdc_obd->obd_set_up) {
CERROR("target %s is not set up\n", tgt->ltd_uuid.uuid);
RETURN(-EINVAL);
}
- rc = obd_connect(NULL, &mdc_exp, mdc_obd, &lmv_mdc_uuid,
- &lmv->conn_data, NULL);
+ rc = obd_connect(NULL, &mdc_exp, mdc_obd, &obd->obd_uuid,
+ &lmv->conn_data, NULL);
if (rc) {
CERROR("target %s connect error %d\n", tgt->ltd_uuid.uuid, rc);
RETURN(rc);
}
CDEBUG(D_CONFIG, "Time to connect %s to %s\n",
- lmv->cluuid.uuid, obd->obd_name);
+ obd->obd_uuid.uuid, obd->obd_name);
for (i = 0; i < lmv->desc.ld_tgt_count; i++) {
tgt = lmv->tgts[i];
RETURN(0);
}
-static int lmv_hsm_ct_unregister(struct lmv_obd *lmv, unsigned int cmd, int len,
- struct lustre_kernelcomm *lk,
+static int lmv_hsm_ct_unregister(struct obd_device *obd, unsigned int cmd,
+ int len, struct lustre_kernelcomm *lk,
void __user *uarg)
{
+ struct lmv_obd *lmv = &obd->u.lmv;
__u32 i;
int rc;
ENTRY;
* Unreached coordinators will get EPIPE on next requests
* and will unregister automatically.
*/
- rc = libcfs_kkuc_group_rem(lk->lk_uid, lk->lk_group);
+ rc = libcfs_kkuc_group_rem(&obd->obd_uuid, lk->lk_uid, lk->lk_group);
RETURN(rc);
}
-static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len,
- struct lustre_kernelcomm *lk, __user void *uarg)
+static int lmv_hsm_ct_register(struct obd_device *obd, unsigned int cmd,
+ int len, struct lustre_kernelcomm *lk,
+ void __user *uarg)
{
+ struct lmv_obd *lmv = &obd->u.lmv;
struct file *filp;
__u32 i, j;
int err;
bool any_set = false;
struct kkuc_ct_data kcd = {
.kcd_magic = KKUC_CT_DATA_MAGIC,
- .kcd_uuid = lmv->cluuid,
- .kcd_archive = lk->lk_data
+ .kcd_archive = lk->lk_data,
};
int rc = 0;
ENTRY;
if (!filp)
RETURN(-EBADF);
- rc = libcfs_kkuc_group_add(filp, lk->lk_uid, lk->lk_group,
- &kcd, sizeof(kcd));
+ rc = libcfs_kkuc_group_add(filp, &obd->obd_uuid, lk->lk_uid,
+ lk->lk_group, &kcd, sizeof(kcd));
if (rc)
GOTO(err_fput, rc);
RETURN(0);
err_kkuc_rem:
- libcfs_kkuc_group_rem(lk->lk_uid, lk->lk_group);
+ libcfs_kkuc_group_rem(&obd->obd_uuid, lk->lk_uid, lk->lk_group);
err_fput:
fput(filp);
case LL_IOC_HSM_CT_START: {
struct lustre_kernelcomm *lk = karg;
if (lk->lk_flags & LK_FLG_STOP)
- rc = lmv_hsm_ct_unregister(lmv, cmd, len, lk, uarg);
+ rc = lmv_hsm_ct_unregister(obddev, cmd, len, lk, uarg);
else
- rc = lmv_hsm_ct_register(lmv, cmd, len, lk, uarg);
+ rc = lmv_hsm_ct_register(obddev, cmd, len, lk, uarg);
break;
}
default:
static int lmv_precleanup(struct obd_device *obd)
{
ENTRY;
+ libcfs_kkuc_group_rem(&obd->obd_uuid, 0, KUC_GRP_HSM);
fld_client_proc_fini(&obd->u.lmv.lmv_fld);
lprocfs_obd_cleanup(obd);
lprocfs_free_md_stats(obd);
* @param val KUC message (kuc_hdr + hsm_action_list)
* @param len total length of message
*/
-static int mdc_hsm_copytool_send(size_t len, void *val)
+static int mdc_hsm_copytool_send(const struct obd_uuid *uuid,
+ size_t len, void *val)
{
struct kuc_hdr *lh = (struct kuc_hdr *)val;
struct hsm_action_list *hal = (struct hsm_action_list *)(lh + 1);
lh->kuc_msglen, hal->hal_count, hal->hal_fsname);
/* Broadcast to HSM listeners */
- rc = libcfs_kkuc_group_put(KUC_GRP_HSM, lh);
+ rc = libcfs_kkuc_group_put(uuid, KUC_GRP_HSM, lh);
RETURN(rc);
}
if (kcd == NULL || kcd->kcd_magic != KKUC_CT_DATA_MAGIC)
return -EPROTO;
- if (!obd_uuid_equals(&kcd->kcd_uuid, &imp->imp_obd->obd_uuid))
- return 0;
-
CDEBUG(D_HA, "%s: recover copytool registration to MDT (archive=%#x)\n",
imp->imp_obd->obd_name, kcd->kcd_archive);
rc = mdc_ioc_hsm_ct_register(imp, kcd->kcd_archive);
static int mdc_kuc_reregister(struct obd_import *imp)
{
/* re-register HSM agents */
- return libcfs_kkuc_group_foreach(KUC_GRP_HSM, mdc_hsm_ct_reregister,
- (void *)imp);
+ return libcfs_kkuc_group_foreach(&imp->imp_obd->obd_uuid, KUC_GRP_HSM,
+ mdc_hsm_ct_reregister, imp);
}
static int mdc_set_info_async(const struct lu_env *env,
RETURN(rc);
}
if (KEY_IS(KEY_HSM_COPYTOOL_SEND)) {
- rc = mdc_hsm_copytool_send(vallen, val);
+ rc = mdc_hsm_copytool_send(&imp->imp_obd->obd_uuid, vallen,
+ val);
RETURN(rc);
}
{
ENTRY;
- /* Failsafe, ok if racy */
- if (obd->obd_type->typ_refcnt <= 1)
- libcfs_kkuc_group_rem(0, KUC_GRP_HSM);
-
mdc_changelog_cdev_finish(obd);
obd_cleanup_client_import(obd);
/** A single group registration has a uid and a file pointer */
struct kkuc_reg {
struct list_head kr_chain;
+ struct obd_uuid kr_uuid;
int kr_uid;
struct file *kr_fp;
char kr_data[0];
* @param group group number
* @param data user data
*/
-int libcfs_kkuc_group_add(struct file *filp, int uid, int group,
- void *data, size_t data_len)
+int libcfs_kkuc_group_add(struct file *filp, const struct obd_uuid *uuid,
+ int uid, int group, void *data, size_t data_len)
{
struct kkuc_reg *reg;
return -EBADF;
/* freed in group_rem */
- reg = kmalloc(sizeof(*reg) + data_len, 0);
+ reg = kzalloc(sizeof(*reg) + data_len, 0);
if (reg == NULL)
return -ENOMEM;
+ reg->kr_uuid = *uuid;
reg->kr_fp = filp;
reg->kr_uid = uid;
memcpy(reg->kr_data, data, data_len);
}
EXPORT_SYMBOL(libcfs_kkuc_group_add);
-int libcfs_kkuc_group_rem(int uid, int group)
+int libcfs_kkuc_group_rem(const struct obd_uuid *uuid, int uid, int group)
{
struct kkuc_reg *reg, *next;
ENTRY;
lh.kuc_transport = KUC_TRANSPORT_GENERIC;
lh.kuc_msgtype = KUC_MSG_SHUTDOWN;
lh.kuc_msglen = sizeof(lh);
- libcfs_kkuc_group_put(group, &lh);
+ libcfs_kkuc_group_put(uuid, group, &lh);
}
down_write(&kg_sem);
list_for_each_entry_safe(reg, next, &kkuc_groups[group], kr_chain) {
- if ((uid == 0) || (uid == reg->kr_uid)) {
+ if (obd_uuid_equals(uuid, ®->kr_uuid) &&
+ (uid == 0 || uid == reg->kr_uid)) {
list_del(®->kr_chain);
CDEBUG(D_KUC, "Removed uid=%d fp=%p from group %d\n",
reg->kr_uid, reg->kr_fp, group);
}
EXPORT_SYMBOL(libcfs_kkuc_group_rem);
-int libcfs_kkuc_group_put(int group, void *payload)
+int libcfs_kkuc_group_put(const struct obd_uuid *uuid, int group, void *payload)
{
struct kkuc_reg *reg;
int rc = 0;
}
list_for_each_entry(reg, &kkuc_groups[group], kr_chain) {
- if (reg->kr_fp != NULL) {
+ if (obd_uuid_equals(uuid, ®->kr_uuid) &&
+ reg->kr_fp != NULL) {
rc = libcfs_kkuc_msg_put(reg->kr_fp, payload);
if (rc == 0)
one_success = 1;
* @param cb_func the function to be called.
* @param cb_arg extra argument to be passed to the callback function.
*/
-int libcfs_kkuc_group_foreach(int group, libcfs_kkuc_cb_t cb_func,
- void *cb_arg)
+int libcfs_kkuc_group_foreach(const struct obd_uuid *uuid, int group,
+ libcfs_kkuc_cb_t cb_func, void *cb_arg)
{
struct kkuc_reg *reg;
int rc = 0;
down_read(&kg_sem);
list_for_each_entry(reg, &kkuc_groups[group], kr_chain) {
- if (reg->kr_fp != NULL)
+ if (obd_uuid_equals(uuid, ®->kr_uuid) && reg->kr_fp != NULL)
rc = cb_func(reg->kr_data, cb_arg);
}
up_read(&kg_sem);