Whamcloud - gitweb
LU-17643 gss: make a local copy of the sptlrpc llog 94/54394/8
authorSebastien Buisson <sbuisson@ddn.com>
Thu, 14 Mar 2024 17:15:29 +0000 (18:15 +0100)
committerOleg Drokin <green@whamcloud.com>
Mon, 15 Apr 2024 16:53:10 +0000 (16:53 +0000)
Make a local copy on server side of the sptlrpc llog, so that
the targets that do not manage to connect to the MGS know at least
which security flavor to accept from clients.
This needs to pass the super_block to config_log_find_or_add().

Add sanity-sec test_70 to check that sptlrpc llog on MDS and OSS side
is equivalent to the one from the MGS.

Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Change-Id: I81f0136746e2df7cca1b34c4a17e4b7135a43c29
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54394
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Aurelien Degremont <adegremont@nvidia.com>
Reviewed-by: Mikhail Pershin <mpershin@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/mgc/mgc_request.c
lustre/tests/sanity-sec.sh

index 100ce53..7c2c27d 100644 (file)
@@ -297,7 +297,13 @@ config_log_find_or_add(struct obd_device *obd, char *logname,
        struct config_llog_data *cld;
 
        /* Note class_config_llog_handler() depends on getting "obd" back */
-       lcfg.cfg_instance = sb ? ll_get_cfg_instance(sb) : (unsigned long)obd;
+       /* for sptlrpc, sb is only provided to be able to make a local copy,
+        * not for the instance
+        */
+       if (sb && type != MGS_CFG_T_SPTLRPC)
+               lcfg.cfg_instance = ll_get_cfg_instance(sb);
+       else
+               lcfg.cfg_instance = (unsigned long)obd;
 
        cld = config_log_find(logname, &lcfg);
        if (unlikely(cld != NULL))
@@ -347,7 +353,7 @@ config_log_add(struct obd_device *obd, char *logname,
        strcpy(seclogname + (ptr - logname), "-sptlrpc");
 
        if (cfg->cfg_sub_clds & CONFIG_SUB_SPTLRPC) {
-               sptlrpc_cld = config_log_find_or_add(obd, seclogname, NULL,
+               sptlrpc_cld = config_log_find_or_add(obd, seclogname, sb,
                                                     MGS_CFG_T_SPTLRPC, cfg);
                if (IS_ERR(sptlrpc_cld)) {
                        rc = PTR_ERR(sptlrpc_cld);
@@ -1637,6 +1643,12 @@ static int mgc_process_cfg_log(struct obd_device *mgc,
        if (cld->cld_cfg.cfg_sb)
                lsi = s2lsi(cld->cld_cfg.cfg_sb);
 
+       /* sptlrpc llog must not keep ref to sb,
+        * it was just needed to get lsi
+        */
+       if (cld_is_sptlrpc(cld))
+               cld->cld_cfg.cfg_sb = NULL;
+
        OBD_ALLOC_PTR(env);
        if (!env)
                RETURN(-ENOMEM);
index 51ca209..da0f525 100755 (executable)
@@ -6293,6 +6293,67 @@ test_69() {
 }
 run_test 69 "check upcall incorrect values"
 
+test_70() {
+       local param_mgs=$(mktemp $TMP/$tfile-mgs.XXXXXX)
+       local param_copy=$(mktemp $TMP/$tfile-copy.XXXXXX)
+
+       stack_trap "rm -f $param_mgs $param_copy" EXIT
+
+       (( $MDS1_VERSION > $(version_code 2.15.61) )) ||
+               skip "Need MDS version at least 2.15.61"
+
+       if ! $SHARED_KEY; then
+               skip "need shared key feature for this test"
+       fi
+
+       [[ "$ost1_FSTYPE" == ldiskfs ]] ||
+               skip "ldiskfs only test (using debugfs)"
+
+       # unmount then remount the Lustre filesystem, to make sure llogs
+       # are copied locally
+       export SK_NO_KEY=false
+       stopall || error "stopall failed"
+       init_gss
+       mountmgs || error "mountmgs failed"
+       mountmds || error "mountmds failed"
+       mountoss || error "mountoss failed"
+       mountcli || error "mountcli failed"
+       lfs df -h
+       unset SK_NO_KEY
+
+       do_facet mgs "sync ; sync"
+       do_facet mgs "$DEBUGFS -c -R 'ls CONFIGS/' $(mgsdevname)"
+       do_facet mgs "$DEBUGFS -c -R 'dump CONFIGS/$FSNAME-sptlrpc $param_mgs' \
+               $(mgsdevname)"
+       do_facet mgs "llog_reader $param_mgs" | grep -vE "SKIP|marker" |
+               grep "^#" > $param_mgs
+       cat $param_mgs
+
+       if ! combined_mgs_mds; then
+               do_facet mds1 "sync ; sync"
+               do_facet mds1 "$DEBUGFS -c -R 'ls CONFIGS/' $(mdsdevname 1)"
+               do_facet mds1 "$DEBUGFS -c -R 'dump CONFIGS/$FSNAME-sptlrpc \
+                       $param_copy' $(mdsdevname 1)"
+               do_facet mds1 "llog_reader $param_copy" |
+                       grep -vE "SKIP|marker" | grep "^#" > $param_copy
+               cat $param_copy
+               cmp -bl $param_mgs $param_copy ||
+                       error "sptlrpc llog differ in mds"
+               rm -f $param_copy
+       fi
+
+       do_facet ost1 "sync ; sync"
+       do_facet ost1 "$DEBUGFS -c -R 'ls CONFIGS/' $(ostdevname 1)"
+       do_facet ost1 "$DEBUGFS -c -R 'dump CONFIGS/$FSNAME-sptlrpc \
+               $param_copy' $(ostdevname 1)"
+       do_facet ost1 "llog_reader $param_copy" | grep -vE "SKIP|marker" |
+               grep "^#" > $param_copy
+       cat $param_copy
+       cmp -bl $param_mgs $param_copy ||
+               error "sptlrpc llog differ in oss"
+}
+run_test 70 "targets have local copy of sptlrpc llog"
+
 log "cleanup: ======================================================"
 
 sec_unsetup() {