]> sourceware.org Git - lvm2.git/commitdiff
Replace fs_unlock by sync_local_dev_names to notify local clvmd. (2.02.80)
authorAlasdair Kergon <agk@redhat.com>
Wed, 12 Jan 2011 20:42:50 +0000 (20:42 +0000)
committerAlasdair Kergon <agk@redhat.com>
Wed, 12 Jan 2011 20:42:50 +0000 (20:42 +0000)
Introduce sync_local_dev_names and CLVMD_CMD_SYNC_NAMES to issue fs_unlock.

16 files changed:
WHATS_NEW
daemons/clvmd/clvm.h
daemons/clvmd/clvmd-command.c
daemons/clvmd/lvm-functions.c
lib/activate/fs.c
lib/locking/cluster_locking.c
lib/locking/file_locking.c
lib/locking/locking.c
lib/locking/locking.h
lib/locking/no_locking.c
lib/metadata/lv_manip.c
lib/metadata/metadata-exported.h
lib/metadata/metadata.c
lib/misc/lvm-exec.c
libdm/libdm-common.c
tools/polldaemon.c

index 33536590211b9d3b45d3a7cec2bd4fd9d4124534..d28f9709ed100a4050c3a1e6d8da008832f989a8 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,7 @@
 Version 2.02.81 -
 ===================================
+  Replace fs_unlock by sync_local_dev_names to notify local clvmd. (2.02.80)
+  Introduce sync_local_dev_names and CLVMD_CMD_SYNC_NAMES to issue fs_unlock.
   Accept fusion fio in device type filter.
   Add disk to mirrored log type conversion.
 
index c9ea10c49d4a2022299495625e09fa2ae47fb28d..8922a19c989a9bd5a6bb27ebf89609ea390c183b 100644 (file)
@@ -71,4 +71,5 @@ static const char CLVMD_SOCKNAME[]= DEFAULT_RUN_DIR "/clvmd.sock";
 #define CLVMD_CMD_SET_DEBUG        42
 #define CLVMD_CMD_VG_BACKUP        43
 #define CLVMD_CMD_RESTART          44
+#define CLVMD_CMD_SYNC_NAMES       45
 #endif
index bd6f348fe6c17334b8f7807694440e052f220f53..eee5bc3e36339d4cab45529b26bd34a3b4b2c34e 100644 (file)
@@ -139,6 +139,10 @@ int do_command(struct local_client *client, struct clvm_header *msg, int msglen,
                do_refresh_cache();
                break;
 
+       case CLVMD_CMD_SYNC_NAMES:
+               lvm_do_fs_unlock();
+               break;
+
        case CLVMD_CMD_SET_DEBUG:
                debug = args[0];
                break;
@@ -275,6 +279,7 @@ int do_pre_command(struct local_client *client)
        case CLVMD_CMD_GET_CLUSTERNAME:
        case CLVMD_CMD_SET_DEBUG:
        case CLVMD_CMD_VG_BACKUP:
+       case CLVMD_CMD_SYNC_NAMES:
        case CLVMD_CMD_LOCK_QUERY:
        case CLVMD_CMD_RESTART:
                break;
@@ -307,6 +312,7 @@ int do_post_command(struct local_client *client)
 
        case CLVMD_CMD_LOCK_VG:
        case CLVMD_CMD_VG_BACKUP:
+       case CLVMD_CMD_SYNC_NAMES:
        case CLVMD_CMD_LOCK_QUERY:
                /* Nothing to do here */
                break;
index cba6f445d46637982b16719f3d79815501ee3733..f06657d9ec177eb1cb5012fcc7d04ddca9aa659c 100644 (file)
@@ -897,6 +897,7 @@ struct dm_hash_node *get_next_excl_lock(struct dm_hash_node *v, char **name)
 void lvm_do_fs_unlock(void)
 {
        pthread_mutex_lock(&lvm_lock);
+       DEBUGLOG("Syncing device names\n");
        fs_unlock();
        pthread_mutex_unlock(&lvm_lock);
 }
index a3770905f5a34f798acdad7a937a1d321439f326..ae94763ea1dc434c399c26a761ec66bd852b7a02 100644 (file)
@@ -403,6 +403,7 @@ int fs_rename_lv(struct logical_volume *lv, const char *dev,
 void fs_unlock(void)
 {
        if (!memlock()) {
+               log_debug("Syncing device names");
                /* Wait for all processed udev devices */
                if (!dm_udev_wait(_fs_cookie))
                        stack;
index 8b7fe99989fdda4f5dc0824f9da7cf0916a24d09..5ed8a339a3cbbe590c76dbec953571264bf923ba 100644 (file)
@@ -345,14 +345,15 @@ static int _lock_for_cluster(struct cmd_context *cmd, unsigned char clvmd_cmd,
         * locks are cluster-wide.
         * Also, if the lock is exclusive it makes no sense to try to
         * acquire it on all nodes, so just do that on the local node too.
-        * One exception, is that P_ locks /do/ get distributed across
-        * the cluster because they might have side-effects.
+        * One exception, is that P_ locks (except VG_SYNC_NAMES) /do/ get 
+        * distributed across the cluster because they might have side-effects.
         */
-       if (strncmp(name, "P_", 2) &&
-           (clvmd_cmd == CLVMD_CMD_LOCK_VG ||
-            (flags & LCK_TYPE_MASK) == LCK_EXCL ||
-            (flags & LCK_LOCAL) ||
-            !(flags & LCK_CLUSTER_VG)))
+       if ((strncmp(name, "P_", 2) &&
+            (clvmd_cmd == CLVMD_CMD_LOCK_VG ||
+             (flags & LCK_TYPE_MASK) == LCK_EXCL ||
+             (flags & LCK_LOCAL) ||
+             !(flags & LCK_CLUSTER_VG))) ||
+           (clvmd_cmd == CLVMD_CMD_SYNC_NAMES && (flags & LCK_LOCAL)))
                node = ".";
 
        status = _cluster_request(clvmd_cmd, node, args, len,
@@ -401,6 +402,11 @@ int lock_resource(struct cmd_context *cmd, const char *resource, uint32_t flags)
 
        switch (flags & LCK_SCOPE_MASK) {
        case LCK_VG:
+               if (!strcmp(resource, VG_SYNC_NAMES)) {
+                       log_very_verbose("Requesting sync names.");
+                       return _lock_for_cluster(cmd, CLVMD_CMD_SYNC_NAMES,
+                                                flags & ~LCK_HOLD, resource);
+               }
                if (flags == LCK_VG_BACKUP) {
                        log_very_verbose("Requesting backup of VG metadata for %s",
                                         resource);
index 434bd92b3825126d4be17de11ba1a647dfd48e04..0c8bbed4f766ee63ad315da70dcbcb79ea592d88 100644 (file)
@@ -265,6 +265,9 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
                if (strcmp(resource, VG_GLOBAL))
                        lvmcache_drop_metadata(resource, 0);
 
+               if (!strcmp(resource, VG_SYNC_NAMES))
+                       fs_unlock();
+
                /* LCK_CACHE does not require a real lock */
                if (flags & LCK_CACHE)
                        break;
index 60eaab3ec53bde21d58e79c7e1aba6b92f0359d1..2adf99786f704620891d3631b9082dffeb0ced4d 100644 (file)
@@ -325,7 +325,7 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname)
        char path[PATH_MAX];
 
        /* We'll allow operations on orphans */
-       if (is_orphan_vg(vgname) || is_global_vg(vgname))
+       if (!is_real_vg(vgname))
                return 1;
 
        /* LVM1 is only present in 2.4 kernels. */
index 88935004f7472f72fdc28cd997285c896c501ca8..1b5e1fc028dc9c6499d9db849d5bd5c65dd32935 100644 (file)
@@ -109,6 +109,7 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
  */
 #define VG_ORPHANS     "#orphans"
 #define VG_GLOBAL      "#global"
+#define VG_SYNC_NAMES  "#sync_names"
 
 /*
  * Common combinations
@@ -169,6 +170,8 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
        lock_vol((vg)->cmd, (vg)->name, LCK_VG_REVERT)
 #define remote_backup_metadata(vg)     \
        lock_vol((vg)->cmd, (vg)->name, LCK_VG_BACKUP)
+#define sync_local_dev_names(cmd)      \
+       lock_vol(cmd, VG_SYNC_NAMES, LCK_NONE | LCK_CACHE | LCK_LOCAL)
 
 /* Process list of LVs */
 int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs);
index 8c4110f543abe68e192d7d514eb945b184b6a999..3ad0d38b27e72bcb96d7c4f2de69e4642ec071a2 100644 (file)
@@ -38,6 +38,8 @@ static int _no_lock_resource(struct cmd_context *cmd, const char *resource,
 {
        switch (flags & LCK_SCOPE_MASK) {
        case LCK_VG:
+               if (!strcmp(resource, VG_SYNC_NAMES))
+                       fs_unlock();
                break;
        case LCK_LV:
                switch (flags & LCK_TYPE_MASK) {
index 5f79994b01f4baf1a0a91f29211cc83f2448396f..a2ae30e319dbcde0284ae72d8762f1efea04cf30 100644 (file)
@@ -3021,7 +3021,7 @@ int set_lv(struct cmd_context *cmd, struct logical_volume *lv,
                return 0;
        }
 
-       fs_unlock();  /* Wait until devices are available */
+       sync_local_dev_names(cmd);  /* Wait until devices are available */
 
        log_verbose("Clearing start of logical volume \"%s\"", lv->name);
 
index 6994e0c1f3e4338fdcd749ff633de45eeb70f0a9..a9709d60f137f11b809253d46fdf45cd5fdde220 100644 (file)
@@ -362,6 +362,7 @@ int move_pvs_used_by_lv(struct volume_group *vg_from,
                        const char *lv_name);
 int is_global_vg(const char *vg_name);
 int is_orphan_vg(const char *vg_name);
+int is_real_vg(const char *vg_name);
 int vg_missing_pv_count(const struct volume_group *vg);
 int vgs_are_compatible(struct cmd_context *cmd,
                       struct volume_group *vg_from,
index 27abaea38c75ef76378d24f1bfdb93031aa275c2..771cdb08affde8d35d58aeec1bf6036fb78f6aa8 100644 (file)
@@ -3560,6 +3560,14 @@ int is_orphan_vg(const char *vg_name)
        return (vg_name && !strncmp(vg_name, ORPHAN_PREFIX, sizeof(ORPHAN_PREFIX) - 1)) ? 1 : 0;
 }
 
+/*
+ * Exclude pseudo VG names used for locking.
+ */
+int is_real_vg(const char *vg_name)
+{
+       return (vg_name && *vg_name != '#');
+}
+
 /*
  * Returns:
  *  0 - fail
index eed3f393ec4e15fcf11c8ecf484a60f71eba7cdd..79291259d7468ae472104bbadf0eb12d1e5e988b 100644 (file)
@@ -55,7 +55,7 @@ int exec_cmd(struct cmd_context *cmd, const char *const argv[], int *rstatus)
 
        log_verbose("Executing: %s", _verbose_args(argv, buf, sizeof(buf)));
 
-       fs_unlock(); /* Flush oops and ensure cookie is not shared */
+       sync_local_dev_names(cmd); /* Flush ops and reset dm cookie */
 
        if ((pid = fork()) == -1) {
                log_error("fork failed: %s", strerror(errno));
index 6d8bcbd8afcaf569e58deb12c8dfb6f65586040f..a181c5f07b375a850fcdce5929fb42d9eaf70a54 100644 (file)
@@ -507,7 +507,7 @@ static int _add_dev_node(const char *dev_name, uint32_t major, uint32_t minor,
        (void) dm_prepare_selinux_context(path, S_IFBLK);
        old_mask = umask(0);
        if (mknod(path, S_IFBLK | mode, dev) < 0) {
-               log_error("Unable to make device node for '%s'", dev_name);
+               log_error("%s: mknod for %s failed: %s", path, dev_name, strerror(errno));
                umask(old_mask);
                (void) dm_prepare_selinux_context(NULL, 0);
                return 0;
index 0ee7a8c596425d8320e601931edf92881697201f..aac9c17fabc5717944282e4b5c21a6e185f8ac34 100644 (file)
@@ -42,7 +42,7 @@ static int _become_daemon(struct cmd_context *cmd)
 
        sigaction(SIGCHLD, &act, NULL);
 
-       fs_unlock(); /* Flush oops and ensure cookie is not shared */
+       sync_local_dev_names(cmd); /* Flush ops and reset dm cookie */
 
        if ((pid = fork()) == -1) {
                log_error("fork failed: %s", strerror(errno));
This page took 0.062031 seconds and 5 git commands to generate.