]> sourceware.org Git - lvm2.git/commitdiff
lvmlockd: skip LV unlocking with no lvmlockd or no lockspace
authorDavid Teigland <teigland@redhat.com>
Wed, 26 Jun 2024 18:57:30 +0000 (13:57 -0500)
committerDavid Teigland <teigland@redhat.com>
Thu, 27 Jun 2024 18:29:03 +0000 (13:29 -0500)
vgchange -an vg is permitted when the vg lockspace
is not available, because LVs could still be active
for some reason, and they should be inactive when not
properly locked.  In case lvmlockd was not running, or
the lockspace was not started, the command was
unnecessarily trying and failing to unlock every LV,
printing errors for every LV.  We can skip this when
the lockspace is known to not be available.

lib/locking/lvmlockd.c
lib/metadata/metadata.c
lib/metadata/vg.h

index 75dd9f2ac42d8269179d3255dcc3cbd20b0cee78..7e85016d035199601834de555d4c979fa234655e 100644 (file)
@@ -2808,9 +2808,28 @@ int lockd_lv(struct cmd_context *cmd, struct logical_volume *lv,
                return 0;
        }
 
+       if (!_lvmlockd_connected && !strcmp(def_mode, "un")) {
+               log_debug("Skip LV unlock: no lvmlockd");
+               return 1;
+       }
+
        if (!_lvmlockd_connected)
                return 0;
 
+       /*
+        * This addresses the specific case of: vgchange -an vg
+        * when vg is a shared VG that is not started.  Without
+        * this check, the command will try and fail to unlock
+        * every LV, which is wasted effort if the lockspace is
+        * not started, especially with many LVs in the VG.
+        * The command still attempts to deactivate the LVs,
+        * which it should in case they are active for some reason.
+        */
+       if (lv->vg->lockd_not_started && !strcmp(def_mode, "un")) {
+               log_debug("Skip LV unlock: no lockspace");
+               return 1;
+       }
+
        if (lv_is_thin_type(lv))
                return _lockd_lv_thin(cmd, lv, def_mode, flags);
 
index c120297e62b1a7934c57977f66fc3d4e787e9195..d21df54c582148ae56e9af1c2140be4fad8bb859 100644 (file)
@@ -3862,6 +3862,9 @@ static int _access_vg_lock_type(struct cmd_context *cmd, struct volume_group *vg
                        return 0;
                }
 
+               if (lockd_state & (LDST_FAIL_NOLS | LDST_FAIL_STARTING))
+                       vg->lockd_not_started = 1;
+
                log_warn("Reading VG %s without a lock.", vg->name);
                return 1;
        }
index 96ab6a0b28999323d7f6d29d835ecd81f2eee5e7..ae79e6162bd9bd2cdff14cfe05e2a8bc2e0febc0 100644 (file)
@@ -42,6 +42,7 @@ struct volume_group {
        struct lvmcache_vginfo *vginfo;
        uint32_t seqno;         /* Metadata sequence number */
        unsigned skip_validate_lock_args : 1;
+       unsigned lockd_not_started : 1;
        unsigned needs_backup : 1;
        unsigned needs_write_and_commit : 1;
        uint32_t write_count; /* count the number of vg_write calls */
This page took 0.306564 seconds and 5 git commands to generate.