From: Yang Sheng Date: Tue, 13 Nov 2018 20:17:09 +0000 (+0800) Subject: LU-11658 lov: cl_cache could miss initialize X-Git-Tag: 2.12.51~79 X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=commitdiff_plain;h=42e83c44eb5a22cbacf1ed4c6d4d6b588e07faa9;ds=sidebyside LU-11658 lov: cl_cache could miss initialize The cl_cache may be missed initialize when we mount a client with deactivate osc and then active it. Signed-off-by: Yang Sheng Change-Id: I92cd44375d70624fb55ef7a0218e7178211a8687 Reviewed-on: https://review.whamcloud.com/33650 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Patrick Farrell Reviewed-by: Oleg Drokin --- diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index 0f15c62..2965c1d 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -361,25 +361,8 @@ static int lov_set_osc_active(struct obd_device *obd, struct obd_uuid *uuid, tgt = lov->lov_tgts[index]; if (!tgt) continue; - /* - * LU-642, initially inactive OSC could miss the obd_connect, - * we make up for it here. - */ - if (ev == OBD_NOTIFY_ACTIVATE && tgt->ltd_exp == NULL && - obd_uuid_equals(uuid, &tgt->ltd_uuid)) { - struct obd_uuid lov_osc_uuid = {"LOV_OSC_UUID"}; - - obd_connect(NULL, &tgt->ltd_exp, tgt->ltd_obd, - &lov_osc_uuid, &lov->lov_ocd, NULL); - } - if (!tgt->ltd_exp) - continue; - - CDEBUG(D_INFO, "lov idx %d is %s conn %#llx\n", - index, obd_uuid2str(&tgt->ltd_uuid), - tgt->ltd_exp->exp_handle.h_cookie); - if (obd_uuid_equals(uuid, &tgt->ltd_uuid)) - break; + if (obd_uuid_equals(uuid, &tgt->ltd_uuid)) + break; } if (index == lov->desc.ld_tgt_count) @@ -388,6 +371,27 @@ static int lov_set_osc_active(struct obd_device *obd, struct obd_uuid *uuid, if (ev == OBD_NOTIFY_DEACTIVATE || ev == OBD_NOTIFY_ACTIVATE) { activate = (ev == OBD_NOTIFY_ACTIVATE) ? 1 : 0; + /* + * LU-642, initially inactive OSC could miss the obd_connect, + * we make up for it here. + */ + if (activate && !tgt->ltd_exp) { + int rc; + struct obd_uuid lov_osc_uuid = {"LOV_OSC_UUID"}; + + rc = obd_connect(NULL, &tgt->ltd_exp, tgt->ltd_obd, + &lov_osc_uuid, &lov->lov_ocd, NULL); + if (rc || tgt->ltd_exp == NULL) + GOTO(out, index = rc); + rc = obd_set_info_async(NULL, tgt->ltd_exp, + sizeof(KEY_CACHE_SET), + KEY_CACHE_SET, + sizeof(struct cl_client_cache), + lov->lov_cache, NULL); + if (rc < 0) + GOTO(out, index = rc); + } + if (lov->lov_tgts[index]->ltd_activate == activate) { CDEBUG(D_INFO, "OSC %s already %sactivate!\n", uuid->uuid, activate ? "" : "de"); @@ -422,6 +426,10 @@ static int lov_set_osc_active(struct obd_device *obd, struct obd_uuid *uuid, ev, uuid->uuid); } + if (tgt->ltd_exp) + CDEBUG(D_INFO, "%s: lov idx %d conn %llx\n", obd_uuid2str(uuid), + index, tgt->ltd_exp->exp_handle.h_cookie); + out: lov_tgts_putref(obd); RETURN(index); diff --git a/lustre/tests/conf-sanity.sh b/lustre/tests/conf-sanity.sh index 59b68f7..3b390f3 100644 --- a/lustre/tests/conf-sanity.sh +++ b/lustre/tests/conf-sanity.sh @@ -3833,14 +3833,15 @@ test_50h() { $SETSTRIPE -c -1 -i 0 $DIR/$tdir/2 || error "$SETSTRIPE $DIR/$tdir/2 failed" sleep 1 && echo "create a file after OST1 is activated" - # create some file - createmany -o $DIR/$tdir/2/$tfile-%d 1 + # doing some io, shouldn't crash + dd if=/dev/zero of=$DIR/$tdir/2/$tfile-io bs=1M count=10 # check OSC import is working stat $DIR/$tdir/2/* >/dev/null 2>&1 || error "some OSC imports are still not connected" # cleanup + rm -rf DIR/$tdir umount_client $MOUNT || error "Unable to umount client" stop_ost2 || error "Unable to stop OST2" cleanup_nocli || error "cleanup_nocli failed with $?"