struct obd_device *obd, struct obd_uuid *cluuid,
struct obd_connect_data *data, void *localdata)
{
- struct client_obd *cli = &obd->u.cli;
- struct obd_import *imp = cli->cl_import;
- struct obd_connect_data *ocd;
- struct lustre_handle conn = { 0 };
- int rc;
- ENTRY;
+ struct client_obd *cli = &obd->u.cli;
+ struct obd_import *imp = cli->cl_import;
+ struct obd_connect_data *ocd;
+ struct lustre_handle conn = { 0 };
+ int rc;
+ ENTRY;
*exp = NULL;
down_write(&cli->cl_sem);
out_sem:
up_write(&cli->cl_sem);
- return rc;
+ return rc;
}
EXPORT_SYMBOL(client_connect_import);
CDEBUG(D_INFO, "Searching in lov %p for uuid %s event(%d)\n",
lov, uuid->uuid, ev);
- obd_getref(obd);
- for (index = 0; index < lov->desc.ld_tgt_count; index++) {
- tgt = lov->lov_tgts[index];
- if (!tgt || !tgt->ltd_exp)
- continue;
+ obd_getref(obd);
+ for (index = 0; index < lov->desc.ld_tgt_count; index++) {
+ 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 "LPX64"\n",
index, obd_uuid2str(&tgt->ltd_uuid),
if (val < 0 || val > 1)
return -ERANGE;
- LPROCFS_CLIMP_CHECK(dev);
/* opposite senses */
if (dev->u.cli.cl_import->imp_deactive == val)
rc = ptlrpc_set_import_active(dev->u.cli.cl_import, val);
else
CDEBUG(D_CONFIG, "activate %d: ignoring repeat request\n", val);
- LPROCFS_CLIMP_EXIT(dev);
return count;
}
}
run_test 50g "deactivated OST should not cause panic====================="
+# LU-642
+test_50h() {
+ # prepare MDT/OST, make OSC inactive for OST1
+ [ "$OSTCOUNT" -lt "2" ] && skip_env "$OSTCOUNT < 2, skipping" && return
+ do_facet ost1 "$TUNEFS --param osc.active=0 `ostdevname 1`" ||
+ error "tunefs OST1 failed"
+ start_mds || error "Unable to start MDT"
+ start_ost || error "Unable to start OST1"
+ start_ost2 || error "Unable to start OST2"
+ mount_client $MOUNT || error "client start failed"
+
+ mkdir -p $DIR/$tdir
+
+ # activatate OSC for OST1
+ local TEST="$LCTL get_param -n osc.${FSNAME}-OST0000-osc-[!M]*.active"
+ set_conf_param_and_check client \
+ "$TEST" "${FSNAME}-OST0000.osc.active" 1 ||
+ error "Unable to activate OST1"
+
+ mkdir -p $DIR/$tdir/2
+ $LFS setstripe -c -1 -i 0 $DIR/$tdir/2
+ sleep 1 && echo "create a file after OST1 is activated"
+ # create some file
+ createmany -o $DIR/$tdir/2/$tfile-%d 1
+
+ # check OSC import is working
+ stat $DIR/$tdir/2/* >/dev/null 2>&1 ||
+ error "some OSC imports are still not connected"
+
+ # cleanup
+ umount_client $MOUNT || error "Unable to umount client"
+ stop_ost2 || error "Unable to stop OST2"
+ cleanup_nocli
+}
+run_test 50h "LU-642: activate deactivated OST ==="
+
test_51() {
local LOCAL_TIMEOUT=20