Whamcloud - gitweb
LU-11658 lov: cl_cache could miss initialize 50/33650/9
authorYang Sheng <ys@whamcloud.com>
Tue, 13 Nov 2018 20:17:09 +0000 (04:17 +0800)
committerOleg Drokin <green@whamcloud.com>
Fri, 4 Jan 2019 04:47:50 +0000 (04:47 +0000)
The cl_cache may be missed initialize when we mount
a client with deactivate osc and then active it.

Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: I92cd44375d70624fb55ef7a0218e7178211a8687
Reviewed-on: https://review.whamcloud.com/33650
Tested-by: Jenkins
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Patrick Farrell <paf@cray.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/lov/lov_obd.c
lustre/tests/conf-sanity.sh

index 0f15c62..2965c1d 100644 (file)
@@ -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;
                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)
         }
 
         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;
 
         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");
                 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);
        }
 
                       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);
  out:
        lov_tgts_putref(obd);
        RETURN(index);
index 59b68f7..3b390f3 100644 (file)
@@ -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"
        $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
 
        # 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 $?"
        umount_client $MOUNT || error "Unable to umount client"
        stop_ost2 || error "Unable to stop OST2"
        cleanup_nocli || error "cleanup_nocli failed with $?"