From bdb04079570dd2de3b9310221e0206d64efb9ecc Mon Sep 17 00:00:00 2001 From: Henri Doreau Date: Wed, 23 Aug 2017 17:16:25 +0200 Subject: [PATCH] LU-9416 hsm: add kkuc before sending registration RPCs This avoids a situation where the registration completes and the CDT sends HSM actions just before the kkuc registration happens. In this case the client drops the actions because there are no CT pipes in the kkuc list. Change-Id: Icbd6575f04c0ca7e8f731ee8481ec72a9ff4f2e1 Signed-off-by: Henri Doreau Reviewed-on: https://review.whamcloud.com/28751 Reviewed-by: John L. Hammond Reviewed-by: Faccini Bruno Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/lmv/lmv_obd.c | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/lustre/lmv/lmv_obd.c b/lustre/lmv/lmv_obd.c index 19bbe64..754c96f 100644 --- a/lustre/lmv/lmv_obd.c +++ b/lustre/lmv/lmv_obd.c @@ -821,11 +821,25 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, { struct file *filp; __u32 i, j; - int err, rc; + int err; bool any_set = false; - struct kkuc_ct_data kcd = { 0 }; + struct kkuc_ct_data kcd = { + .kcd_magic = KKUC_CT_DATA_MAGIC, + .kcd_uuid = lmv->cluuid, + .kcd_archive = lk->lk_data + }; + int rc = 0; ENTRY; + filp = fget(lk->lk_wfd); + if (!filp) + RETURN(-EBADF); + + rc = libcfs_kkuc_group_add(filp, lk->lk_uid, lk->lk_group, + &kcd, sizeof(kcd)); + if (rc) + GOTO(err_fput, rc); + /* All or nothing: try to register to all MDS. * In case of failure, unregister from previous MDS, * except if it because of inactive target. */ @@ -834,6 +848,7 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, if (tgt == NULL || tgt->ltd_exp == NULL) continue; + err = obd_iocontrol(cmd, tgt->ltd_exp, len, lk, uarg); if (err) { if (tgt->ltd_active) { @@ -852,7 +867,7 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, obd_iocontrol(cmd, tgt->ltd_exp, len, lk, uarg); } - RETURN(rc); + GOTO(err_kkuc_rem, rc); } /* else: transient error. * kuc will register to the missing MDT @@ -864,23 +879,16 @@ static int lmv_hsm_ct_register(struct lmv_obd *lmv, unsigned int cmd, int len, if (!any_set) /* no registration done: return error */ - RETURN(-ENOTCONN); + GOTO(err_kkuc_rem, rc = -ENOTCONN); - /* at least one registration done, with no failure */ - filp = fget(lk->lk_wfd); - if (filp == NULL) - RETURN(-EBADF); + RETURN(0); - kcd.kcd_magic = KKUC_CT_DATA_MAGIC; - kcd.kcd_uuid = lmv->cluuid; - kcd.kcd_archive = lk->lk_data; +err_kkuc_rem: + libcfs_kkuc_group_rem(lk->lk_uid, lk->lk_group); - rc = libcfs_kkuc_group_add(filp, lk->lk_uid, lk->lk_group, - &kcd, sizeof(kcd)); - if (rc != 0) - fput(filp); - - RETURN(rc); +err_fput: + fput(filp); + return rc; } -- 1.8.3.1