]> sourceware.org Git - lvm2.git/commitdiff
report: query lvmlockd for lv_active_exclusively
authorcorubba <corubba@gmx.de>
Tue, 1 Nov 2022 21:23:47 +0000 (22:23 +0100)
committerDavid Teigland <teigland@redhat.com>
Fri, 11 Nov 2022 19:30:25 +0000 (13:30 -0600)
Query LV lock state in lvmlockd to report lv_active_exclusively
for active LVs in a shared VGs.  As with all lvmlockd state,
it is from the perspective of the local node.

Signed-off-by: corubba <corubba@gmx.de>
lib/locking/lvmlockd.c
lib/locking/lvmlockd.h
lib/report/report.c

index 7f815036558cea8cb8aa1008edd1782ca9a26252..051aa817c3def38bb7595d75bb78d3c33846f280 100644 (file)
@@ -2298,9 +2298,8 @@ int lockd_vg_update(struct volume_group *vg)
        return ret;
 }
 
-static int _query_lock_lv(struct cmd_context *cmd, struct volume_group *vg,
-                         const char *lv_name, char *lv_uuid,
-                         const char *lock_args, int *ex, int *sh)
+int lockd_query_lv(struct volume_group *vg, const char *lv_name, char *lv_uuid,
+                  const char *lock_args, int *ex, int *sh)
 {
        daemon_reply reply;
        const char *opts = NULL;
@@ -2308,6 +2307,13 @@ static int _query_lock_lv(struct cmd_context *cmd, struct volume_group *vg,
        int result;
        int ret;
 
+       if (!vg_is_shared(vg))
+               return 1;
+       if (!_use_lvmlockd)
+               return 0;
+       if (!_lvmlockd_connected)
+               return 0;
+
        log_debug("lockd query LV %s/%s", vg->name, lv_name);
 
        reply = _lockd_send("query_lock_lv",
@@ -2386,7 +2392,7 @@ int lockd_lv_name(struct cmd_context *cmd, struct volume_group *vg,
                    !strcmp(cmd->name, "lvchange") || !strcmp(cmd->name, "lvconvert")) {
                        int ex = 0, sh = 0;
 
-                       if (!_query_lock_lv(cmd, vg, lv_name, lv_uuid, lock_args, &ex, &sh))
+                       if (!lockd_query_lv(vg, lv_name, lv_uuid, lock_args, &ex, &sh))
                                return 1;
                        if (sh) {
                                log_warn("WARNING: shared LV may require refresh on other hosts where it is active.");
index 43934202fdfd5876336f8372362b9374a681d784..fcaa0a3266d9ab1d29cca16fdb622fbe84244f4a 100644 (file)
@@ -103,6 +103,9 @@ int lockd_lv_uses_lock(struct logical_volume *lv);
 
 int lockd_lv_refresh(struct cmd_context *cmd, struct lvresize_params *lp);
 
+int lockd_query_lv(struct volume_group *vg, const char *lv_name, char *lv_uuid,
+                  const char *lock_args, int *ex, int *sh);
+
 #else /* LVMLOCKD_SUPPORT */
 
 static inline void lvmlockd_set_socket(const char *sock)
@@ -258,6 +261,12 @@ static inline int lockd_lv_refresh(struct cmd_context *cmd, struct lvresize_para
        return 0;
 }
 
+static inline int lockd_query_lv(struct volume_group *vg, const char *lv_name,
+                 char *lv_uuid, const char *lock_args, int *ex, int *sh)
+{
+       return 0;
+}
+
 #endif /* LVMLOCKD_SUPPORT */
 
 #endif /* _LVMLOCKD_H */
index cb5fc93c8d57322c7a55daf744de62de7c3d9f3a..26d35ba95fe0ea9fe2e51de2faa762fdba68d1b7 100644 (file)
@@ -24,6 +24,7 @@
 #include "lib/cache/lvmcache.h"
 #include "lib/device/device-types.h"
 #include "lib/datastruct/str_list.h"
+#include "lib/locking/lvmlockd.h"
 
 #include <stddef.h> /* offsetof() */
 #include <float.h> /* DBL_MAX */
@@ -3854,13 +3855,20 @@ static int _lvactiveexclusively_disp(struct dm_report *rh, struct dm_pool *mem,
                                     const void *data, void *private)
 {
        const struct logical_volume *lv = (const struct logical_volume *) data;
-       int active_exclusively;
+       int active_exclusively, _sh = 0;
 
        if (!activation())
                return _binary_undef_disp(rh, mem, field, private);
 
        active_exclusively = lv_is_active(lv);
 
+       if (active_exclusively && vg_is_shared(lv->vg)) {
+               active_exclusively = 0;
+               if (!lockd_query_lv(lv->vg, lv->name, lv_uuid_dup(NULL, lv),
+                                   lv->lock_args, &active_exclusively, &_sh))
+                       return _binary_undef_disp(rh, mem, field, private);
+       }
+
        return _binary_disp(rh, mem, field, active_exclusively, GET_FIRST_RESERVED_NAME(lv_active_exclusively_y), private);
 }
 
This page took 0.042203 seconds and 5 git commands to generate.