master - udev: add support for "NOSCAN" flag
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=2f5ddfbadea5da...
Commit: 2f5ddfbadea5dae6b2fc236d4f243bd88d955aa8
Parent: ce7489ed228da22c2a355d0b403a1e5dc6d8c0e0
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Oct 8 13:33:28 2013 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Oct 8 13:43:14 2013 +0200
udev: add support for "NOSCAN" flag
Recognize DM_SUBSYSTEM_UDEV_FLAG0 which for LVM is the "LVM_NOSCAN"
flag that causes the scanning to be skipped (mainly blkid) and
also directs all the foreign rules to be skipped as well.
Important thing here is that the "watch" udev rules is still set
as well as the /dev/disk/by-id content created (which does not
require any scanning to be done). Also, the flag is dropped on
any subsequent event and scanning done...
---
WHATS_NEW | 1 +
udev/11-dm-lvm.rules.in | 15 +++++++++++++++
udev/13-dm-disk.rules.in | 3 ++-
udev/69-dm-lvm-metad.rules.in | 2 ++
4 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 098f348..7450f04 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.104
===================================
+ Recognize new flag to skip udev scanning in udev rules and act appropriately.
Add support for flagging an LV to skip udev scanning during activation.
Improve message when unable to change discards setting on active thin pool.
Run full scan before vgrename operation to avoid any cache name collision.
diff --git a/udev/11-dm-lvm.rules.in b/udev/11-dm-lvm.rules.in
index f21d0aa..5032280 100644
--- a/udev/11-dm-lvm.rules.in
+++ b/udev/11-dm-lvm.rules.in
@@ -20,6 +20,21 @@ ENV{DM_UUID}!="LVM-?*", GOTO="lvm_end"
# Use DM name and split it up into its VG/LV/layer constituents.
IMPORT{program}="(DM_EXEC)/dmsetup splitname --nameprefixes --noheadings --rows $env{DM_NAME}"
+# DM_SUBSYSTEM_UDEV_FLAG0 is the 'NOSCAN' flag for LVM subsystem.
+# This flag is used to temporarily disable selected rules to prevent any
+# processing or scanning done on the LVM volume before LVM has any chance
+# to zero any stale metadata found within the LV data area. Such stale
+# metadata could cause false claim of the LV device, keeping it open etc.
+#
+# If the NOSCAN flag is present, backup selected existing flags used to
+# disable rules, then set them firmly so those selected rules are surely skipped.
+# Restore these flags once the NOSCAN flag is dropped (which is normally any
+# uevent that follows for this LV, even an artificially generated one).
+ENV{DM_SUBSYSTEM_UDEV_FLAG0}=="1", ENV{DM_NOSCAN}="1", ENV{DM_DISABLE_OTHER_RULES_FLAG_OLD}="$env{DM_UDEV_DISABLE_OTHER_RULES_FLAG}", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1"
+ENV{DM_SUBSYSTEM_UDEV_FLAG0}!="1", IMPORT{db}="DM_NOSCAN", IMPORT{db}="DM_DISABLE_OTHER_RULES_FLAG_OLD"
+ENV{DM_SUBSYSTEM_UDEV_FLAG0}!="1", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="$env{DM_DISABLE_OTHER_RULES_FLAG_OLD}", \
+ ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG_OLD}="", ENV{DM_NOSCAN}=""
+
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}=="1", GOTO="lvm_end"
OPTIONS+="event_timeout=180"
diff --git a/udev/13-dm-disk.rules.in b/udev/13-dm-disk.rules.in
index 1920260..4b64dd6 100644
--- a/udev/13-dm-disk.rules.in
+++ b/udev/13-dm-disk.rules.in
@@ -18,6 +18,7 @@ SYMLINK+="disk/by-id/dm-name-$env{DM_NAME}"
ENV{DM_UUID}=="?*", SYMLINK+="disk/by-id/dm-uuid-$env{DM_UUID}"
ENV{DM_SUSPENDED}=="1", GOTO="dm_end"
+ENV{DM_NOSCAN}=="1", GOTO="dm_watch"
(BLKID_RULE)
ENV{DM_UDEV_LOW_PRIORITY_FLAG}=="1", OPTIONS="link_priority=-100"
@@ -32,7 +33,7 @@ ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk
# (like creating a filesystem, changing filesystem label etc.).
#
# But let's use this until we have something better...
-
+LABEL="dm_watch"
OPTIONS+="watch"
LABEL="dm_end"
diff --git a/udev/69-dm-lvm-metad.rules.in b/udev/69-dm-lvm-metad.rules.in
index ba43396..3303f4d 100644
--- a/udev/69-dm-lvm-metad.rules.in
+++ b/udev/69-dm-lvm-metad.rules.in
@@ -17,6 +17,8 @@
SUBSYSTEM!="block", GOTO="lvm_end"
(LVM_EXEC_RULE)
+ENV{DM_NOSCAN}=="1", GOTO="lvm_end"
+
# If the PV label got lost, inform lvmetad immediately.
# Detect the lost PV label by comparing previous ID_FS_TYPE value with current one.
ENV{.ID_FS_TYPE_NEW}="$env{ID_FS_TYPE}"
10 years, 6 months
master - activation: add support for flagging an LV to skip udev scanning during activation
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=ce7489ed228da2...
Commit: ce7489ed228da22c2a355d0b403a1e5dc6d8c0e0
Parent: 273373bf53b34817481ef2c395c84a7cdf4f1998
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Oct 8 13:27:21 2013 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Oct 8 13:43:14 2013 +0200
activation: add support for flagging an LV to skip udev scanning during activation
A common scenario is during new LV creation when we need to wipe the
newly created LV and avoid any udev scanning before this stage otherwise
it could cause the device (the LV) to be claimed by some other subsystem
for which there were stale metadata within LV data.
This patch adds possibility to mark the LV we're just about to wipe with
a flag that gets passed to udev via DM_COOKIE as a subsystem specific
flag - DM_SUBSYSTEM_UDEV_FLAG0 (in this case the subsystem is "LVM")
so LVM udev rules will take care of handling that.
---
WHATS_NEW | 1 +
daemons/clvmd/lvm-functions.c | 2 +-
lib/activate/activate.c | 20 ++++++++++++--------
lib/activate/activate.h | 5 +++--
lib/activate/dev_manager.c | 15 +++++++++++----
lib/locking/file_locking.c | 4 ++--
lib/locking/no_locking.c | 4 ++--
lib/metadata/lv_manip.c | 6 ++++++
lib/metadata/metadata-exported.h | 1 +
9 files changed, 39 insertions(+), 19 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index cd9f00a..098f348 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.104
===================================
+ Add support for flagging an LV to skip udev scanning during activation.
Improve message when unable to change discards setting on active thin pool.
Run full scan before vgrename operation to avoid any cache name collision.
Fix lvconvert when converting to a thin pool and thin LV at once.
diff --git a/daemons/clvmd/lvm-functions.c b/daemons/clvmd/lvm-functions.c
index da7d335..f544218 100644
--- a/daemons/clvmd/lvm-functions.c
+++ b/daemons/clvmd/lvm-functions.c
@@ -401,7 +401,7 @@ static int do_activate_lv(char *resource, unsigned char command, unsigned char l
}
/* Now activate it */
- if (!lv_activate(cmd, resource, exclusive, NULL))
+ if (!lv_activate(cmd, resource, exclusive, 0, NULL))
goto error;
return 0;
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 28549fc..c077113 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -337,12 +337,13 @@ int lv_activation_filter(struct cmd_context *cmd, const char *lvid_s,
{
return 1;
}
-int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, struct logical_volume *lv)
+int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, int noscan,
+ struct logical_volume *lv)
{
return 1;
}
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive,
- struct logical_volume *lv)
+ int noscan, struct logical_volume *lv)
{
return 1;
}
@@ -2027,9 +2028,10 @@ static int _lv_activate(struct cmd_context *cmd, const char *lvid_s,
if (filter)
laopts->read_only = _passes_readonly_filter(cmd, lv);
- log_debug_activation("Activating %s/%s%s%s.", lv->vg->name, lv->name,
+ log_debug_activation("Activating %s/%s%s%s%s.", lv->vg->name, lv->name,
laopts->exclusive ? " exclusively" : "",
- laopts->read_only ? " read-only" : "");
+ laopts->read_only ? " read-only" : "",
+ laopts->noscan ? " noscan" : "");
if (!lv_info(cmd, lv, 0, &info, 0, 0))
goto_out;
@@ -2066,9 +2068,10 @@ out:
}
/* Activate LV */
-int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, struct logical_volume *lv)
+int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive,
+ int noscan, struct logical_volume *lv)
{
- struct lv_activate_opts laopts = { .exclusive = exclusive };
+ struct lv_activate_opts laopts = { .exclusive = exclusive, .noscan = noscan };
if (!_lv_activate(cmd, lvid_s, &laopts, 0, lv))
return_0;
@@ -2077,9 +2080,10 @@ int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, stru
}
/* Activate LV only if it passes filter */
-int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive, struct logical_volume *lv)
+int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive,
+ int noscan, struct logical_volume *lv)
{
- struct lv_activate_opts laopts = { .exclusive = exclusive };
+ struct lv_activate_opts laopts = { .exclusive = exclusive, .noscan = noscan };
if (!_lv_activate(cmd, lvid_s, &laopts, 1, lv))
return_0;
diff --git a/lib/activate/activate.h b/lib/activate/activate.h
index f34d376..4eac320 100644
--- a/lib/activate/activate.h
+++ b/lib/activate/activate.h
@@ -38,6 +38,7 @@ struct lv_activate_opts {
int skip_in_use;
unsigned revert;
unsigned read_only;
+ unsigned noscan;
};
/* target attribute flags */
@@ -80,9 +81,9 @@ int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s, unsigned o
int lv_resume(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only, struct logical_volume *lv);
int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s,
unsigned origin_only, unsigned exclusive, unsigned revert, struct logical_volume *lv);
-int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, struct logical_volume *lv);
+int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, int noscan, struct logical_volume *lv);
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s,
- int exclusive, struct logical_volume *lv);
+ int exclusive, int noscan, struct logical_volume *lv);
int lv_deactivate(struct cmd_context *cmd, const char *lvid_s, struct logical_volume *lv);
int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv);
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index b8233bf..0f5a04c 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -30,6 +30,7 @@
#include <dirent.h>
#define MAX_TARGET_PARAMSIZE 50000
+#define LVM_UDEV_NOSCAN_FLAG DM_SUBSYSTEM_UDEV_FLAG0
typedef enum {
PRELOAD,
@@ -1399,7 +1400,7 @@ static int _check_udev_fallback(struct cmd_context *cmd)
#endif /* UDEV_SYNC_SUPPORT */
static uint16_t _get_udev_flags(struct dev_manager *dm, struct logical_volume *lv,
- const char *layer)
+ const char *layer, uint16_t flags)
{
uint16_t udev_flags = 0;
@@ -1447,6 +1448,11 @@ static uint16_t _get_udev_flags(struct dev_manager *dm, struct logical_volume *l
udev_flags |= DM_UDEV_DISABLE_DM_RULES_FLAG |
DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG;
+ /*
+ * Firmly set requested flags.
+ */
+ udev_flags |= flags;
+
return udev_flags;
}
@@ -1493,7 +1499,7 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
}
if (info.exists && !dm_tree_add_dev_with_udev_flags(dtree, info.major, info.minor,
- _get_udev_flags(dm, lv, layer))) {
+ _get_udev_flags(dm, lv, layer, 0))) {
log_error("Failed to add device (%" PRIu32 ":%" PRIu32") to dtree",
info.major, info.minor);
return 0;
@@ -2334,7 +2340,7 @@ static int _set_udev_flags_for_children(struct dev_manager *dm,
}
dm_tree_node_set_udev_flags(child,
- _get_udev_flags(dm, lvl->lv, NULL));
+ _get_udev_flags(dm, lvl->lv, NULL, 0));
}
return 1;
@@ -2411,7 +2417,8 @@ static int _add_new_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
read_only_lv(lv, laopts),
((lv->vg->status & PRECOMMITTED) | laopts->revert) ? 1 : 0,
lvlayer,
- _get_udev_flags(dm, lv, layer))))
+ _get_udev_flags(dm, lv, layer,
+ laopts->noscan ? LVM_UDEV_NOSCAN_FLAG : 0))))
return_0;
/* Store existing name so we can do rename later */
diff --git a/lib/locking/file_locking.c b/lib/locking/file_locking.c
index 5e49bc4..b6b2b10 100644
--- a/lib/locking/file_locking.c
+++ b/lib/locking/file_locking.c
@@ -305,7 +305,7 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
break;
case LCK_READ:
log_very_verbose("Locking LV %s (R)", resource);
- if (!lv_activate_with_filter(cmd, resource, 0, lv_ondisk(lv)))
+ if (!lv_activate_with_filter(cmd, resource, 0, lv->status & LV_NOSCAN ? 1 : 0, lv_ondisk(lv)))
return 0;
break;
case LCK_PREAD:
@@ -318,7 +318,7 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
break;
case LCK_EXCL:
log_very_verbose("Locking LV %s (EX)", resource);
- if (!lv_activate_with_filter(cmd, resource, 1, lv_ondisk(lv)))
+ if (!lv_activate_with_filter(cmd, resource, 1, lv->status & LV_NOSCAN ? 1 : 0, lv_ondisk(lv)))
return 0;
break;
default:
diff --git a/lib/locking/no_locking.c b/lib/locking/no_locking.c
index 5f3f0b6..4772706 100644
--- a/lib/locking/no_locking.c
+++ b/lib/locking/no_locking.c
@@ -48,11 +48,11 @@ static int _no_lock_resource(struct cmd_context *cmd, const char *resource,
case LCK_UNLOCK:
return lv_resume_if_active(cmd, resource, (flags & LCK_ORIGIN_ONLY) ? 1: 0, 0, (flags & LCK_REVERT) ? 1 : 0, lv_ondisk(lv));
case LCK_READ:
- return lv_activate_with_filter(cmd, resource, 0, lv_ondisk(lv));
+ return lv_activate_with_filter(cmd, resource, 0, lv->status & LV_NOSCAN ? 1 : 0, lv_ondisk(lv));
case LCK_WRITE:
return lv_suspend_if_active(cmd, resource, (flags & LCK_ORIGIN_ONLY) ? 1 : 0, 0, lv_ondisk(lv), lv);
case LCK_EXCL:
- return lv_activate_with_filter(cmd, resource, 1, lv_ondisk(lv));
+ return lv_activate_with_filter(cmd, resource, 1, lv->status & LV_NOSCAN ? 1 : 0, lv_ondisk(lv));
default:
break;
}
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index f42db1d..22327d7 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5421,6 +5421,8 @@ int set_lv(struct cmd_context *cmd, struct logical_volume *lv,
if (!dev_close_immediate(dev))
stack;
+ lv->status &= ~LV_NOSCAN;
+
return 1;
}
@@ -5977,6 +5979,10 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
goto out;
}
+ /* Do not scan this LV until properly zeroed. */
+ if (lp->zero)
+ lv->status |= LV_NOSCAN;
+
if (lv_is_thin_pool(lv)) {
if (is_change_activating(lp->activate)) {
if (vg_is_clustered(lv->vg)) {
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 308dcfe..1e9543a 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -102,6 +102,7 @@
#define LV_WRITEMOSTLY UINT64_C(0x0000020000000000) /* LV (RAID1) */
#define LV_ACTIVATION_SKIP UINT64_C(0x0000040000000000) /* LV */
+#define LV_NOSCAN UINT64_C(0x0000080000000000) /* LV */
/* Format features flags */
#define FMT_SEGMENTS 0x00000001U /* Arbitrary segment params? */
10 years, 6 months
master - udev: add support for "NOSCAN" flag
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=6a80d753811040...
Commit: 6a80d7538110405dc4f8fc5fe5ae462b32dfe562
Parent: 57d2daff6e6f8758fbfe5758b283fdb6d43e713a
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Oct 8 13:33:28 2013 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Oct 8 13:42:23 2013 +0200
udev: add support for "NOSCAN" flag
Recognize DM_SUBSYSTEM_UDEV_FLAG0 which for LVM is the "LVM_NOSCAN"
flag that causes the scanning to be skipped (mainly blkid) and
also directs all the foreign rules to be skipped as well.
Important thing here is that the "watch" udev rules is still set
as well as the /dev/disk/by-id content created (which does not
require any scanning to be done). Also, the flag is dropped on
any subsequent event and scanning done...
---
WHATS_NEW | 1 +
udev/11-dm-lvm.rules.in | 15 +++++++++++++++
udev/13-dm-disk.rules.in | 3 ++-
udev/69-dm-lvm-metad.rules.in | 2 ++
4 files changed, 20 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 5957924..cd239dd 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.104
===================================
+ Recognize new flag to skip udev scanning in udev rules and act appropriately.
Add support for flagging an LV to skip udev scanning during activation.
Improve message when unable to change discards setting on active thin pool.
diff --git a/udev/11-dm-lvm.rules.in b/udev/11-dm-lvm.rules.in
index f21d0aa..5032280 100644
--- a/udev/11-dm-lvm.rules.in
+++ b/udev/11-dm-lvm.rules.in
@@ -20,6 +20,21 @@ ENV{DM_UUID}!="LVM-?*", GOTO="lvm_end"
# Use DM name and split it up into its VG/LV/layer constituents.
IMPORT{program}="(DM_EXEC)/dmsetup splitname --nameprefixes --noheadings --rows $env{DM_NAME}"
+# DM_SUBSYSTEM_UDEV_FLAG0 is the 'NOSCAN' flag for LVM subsystem.
+# This flag is used to temporarily disable selected rules to prevent any
+# processing or scanning done on the LVM volume before LVM has any chance
+# to zero any stale metadata found within the LV data area. Such stale
+# metadata could cause false claim of the LV device, keeping it open etc.
+#
+# If the NOSCAN flag is present, backup selected existing flags used to
+# disable rules, then set them firmly so those selected rules are surely skipped.
+# Restore these flags once the NOSCAN flag is dropped (which is normally any
+# uevent that follows for this LV, even an artificially generated one).
+ENV{DM_SUBSYSTEM_UDEV_FLAG0}=="1", ENV{DM_NOSCAN}="1", ENV{DM_DISABLE_OTHER_RULES_FLAG_OLD}="$env{DM_UDEV_DISABLE_OTHER_RULES_FLAG}", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="1"
+ENV{DM_SUBSYSTEM_UDEV_FLAG0}!="1", IMPORT{db}="DM_NOSCAN", IMPORT{db}="DM_DISABLE_OTHER_RULES_FLAG_OLD"
+ENV{DM_SUBSYSTEM_UDEV_FLAG0}!="1", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}="$env{DM_DISABLE_OTHER_RULES_FLAG_OLD}", \
+ ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG_OLD}="", ENV{DM_NOSCAN}=""
+
ENV{DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG}=="1", GOTO="lvm_end"
OPTIONS+="event_timeout=180"
diff --git a/udev/13-dm-disk.rules.in b/udev/13-dm-disk.rules.in
index 1920260..4b64dd6 100644
--- a/udev/13-dm-disk.rules.in
+++ b/udev/13-dm-disk.rules.in
@@ -18,6 +18,7 @@ SYMLINK+="disk/by-id/dm-name-$env{DM_NAME}"
ENV{DM_UUID}=="?*", SYMLINK+="disk/by-id/dm-uuid-$env{DM_UUID}"
ENV{DM_SUSPENDED}=="1", GOTO="dm_end"
+ENV{DM_NOSCAN}=="1", GOTO="dm_watch"
(BLKID_RULE)
ENV{DM_UDEV_LOW_PRIORITY_FLAG}=="1", OPTIONS="link_priority=-100"
@@ -32,7 +33,7 @@ ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk
# (like creating a filesystem, changing filesystem label etc.).
#
# But let's use this until we have something better...
-
+LABEL="dm_watch"
OPTIONS+="watch"
LABEL="dm_end"
diff --git a/udev/69-dm-lvm-metad.rules.in b/udev/69-dm-lvm-metad.rules.in
index ba43396..3303f4d 100644
--- a/udev/69-dm-lvm-metad.rules.in
+++ b/udev/69-dm-lvm-metad.rules.in
@@ -17,6 +17,8 @@
SUBSYSTEM!="block", GOTO="lvm_end"
(LVM_EXEC_RULE)
+ENV{DM_NOSCAN}=="1", GOTO="lvm_end"
+
# If the PV label got lost, inform lvmetad immediately.
# Detect the lost PV label by comparing previous ID_FS_TYPE value with current one.
ENV{.ID_FS_TYPE_NEW}="$env{ID_FS_TYPE}"
10 years, 6 months
master - activation: add support for flagging an LV to skip udev scanning during activation
by Peter Rajnoha
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=57d2daff6e6f87...
Commit: 57d2daff6e6f8758fbfe5758b283fdb6d43e713a
Parent: 4806f38d703c2d7cd01e0adc49505ccb7d010a17
Author: Peter Rajnoha <prajnoha(a)redhat.com>
AuthorDate: Tue Oct 8 13:27:21 2013 +0200
Committer: Peter Rajnoha <prajnoha(a)redhat.com>
CommitterDate: Tue Oct 8 13:40:27 2013 +0200
activation: add support for flagging an LV to skip udev scanning during activation
A common scenario is during new LV creation when we need to wipe the
newly created LV and avoid any udev scanning before this stage otherwise
it could cause the device (the LV) to be claimed by some other subsystem
for which there were stale metadata within LV data.
This patch adds possibility to mark the LV we're just about to wipe with
a flag that gets passed to udev via DM_COOKIE as a subsystem specific
flag - DM_SUBSYSTEM_UDEV_FLAG0 (in this case the subsystem is "LVM")
so LVM udev rules will take care of handling that.
---
WHATS_NEW | 1 +
daemons/clvmd/lvm-functions.c | 2 +-
lib/activate/activate.c | 20 ++++++++++++--------
lib/activate/activate.h | 5 +++--
lib/activate/dev_manager.c | 15 +++++++++++----
lib/locking/file_locking.c | 4 ++--
lib/locking/no_locking.c | 4 ++--
lib/metadata/lv_manip.c | 6 ++++++
lib/metadata/metadata-exported.h | 1 +
9 files changed, 39 insertions(+), 19 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 5b35890..5957924 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.104
===================================
+ Add support for flagging an LV to skip udev scanning during activation.
Improve message when unable to change discards setting on active thin pool.
Version 2.02.103 - 4th October 2013
diff --git a/daemons/clvmd/lvm-functions.c b/daemons/clvmd/lvm-functions.c
index da7d335..f544218 100644
--- a/daemons/clvmd/lvm-functions.c
+++ b/daemons/clvmd/lvm-functions.c
@@ -401,7 +401,7 @@ static int do_activate_lv(char *resource, unsigned char command, unsigned char l
}
/* Now activate it */
- if (!lv_activate(cmd, resource, exclusive, NULL))
+ if (!lv_activate(cmd, resource, exclusive, 0, NULL))
goto error;
return 0;
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 28549fc..c077113 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -337,12 +337,13 @@ int lv_activation_filter(struct cmd_context *cmd, const char *lvid_s,
{
return 1;
}
-int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, struct logical_volume *lv)
+int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, int noscan,
+ struct logical_volume *lv)
{
return 1;
}
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive,
- struct logical_volume *lv)
+ int noscan, struct logical_volume *lv)
{
return 1;
}
@@ -2027,9 +2028,10 @@ static int _lv_activate(struct cmd_context *cmd, const char *lvid_s,
if (filter)
laopts->read_only = _passes_readonly_filter(cmd, lv);
- log_debug_activation("Activating %s/%s%s%s.", lv->vg->name, lv->name,
+ log_debug_activation("Activating %s/%s%s%s%s.", lv->vg->name, lv->name,
laopts->exclusive ? " exclusively" : "",
- laopts->read_only ? " read-only" : "");
+ laopts->read_only ? " read-only" : "",
+ laopts->noscan ? " noscan" : "");
if (!lv_info(cmd, lv, 0, &info, 0, 0))
goto_out;
@@ -2066,9 +2068,10 @@ out:
}
/* Activate LV */
-int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, struct logical_volume *lv)
+int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive,
+ int noscan, struct logical_volume *lv)
{
- struct lv_activate_opts laopts = { .exclusive = exclusive };
+ struct lv_activate_opts laopts = { .exclusive = exclusive, .noscan = noscan };
if (!_lv_activate(cmd, lvid_s, &laopts, 0, lv))
return_0;
@@ -2077,9 +2080,10 @@ int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, stru
}
/* Activate LV only if it passes filter */
-int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive, struct logical_volume *lv)
+int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s, int exclusive,
+ int noscan, struct logical_volume *lv)
{
- struct lv_activate_opts laopts = { .exclusive = exclusive };
+ struct lv_activate_opts laopts = { .exclusive = exclusive, .noscan = noscan };
if (!_lv_activate(cmd, lvid_s, &laopts, 1, lv))
return_0;
diff --git a/lib/activate/activate.h b/lib/activate/activate.h
index f34d376..4eac320 100644
--- a/lib/activate/activate.h
+++ b/lib/activate/activate.h
@@ -38,6 +38,7 @@ struct lv_activate_opts {
int skip_in_use;
unsigned revert;
unsigned read_only;
+ unsigned noscan;
};
/* target attribute flags */
@@ -80,9 +81,9 @@ int lv_suspend_if_active(struct cmd_context *cmd, const char *lvid_s, unsigned o
int lv_resume(struct cmd_context *cmd, const char *lvid_s, unsigned origin_only, struct logical_volume *lv);
int lv_resume_if_active(struct cmd_context *cmd, const char *lvid_s,
unsigned origin_only, unsigned exclusive, unsigned revert, struct logical_volume *lv);
-int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, struct logical_volume *lv);
+int lv_activate(struct cmd_context *cmd, const char *lvid_s, int exclusive, int noscan, struct logical_volume *lv);
int lv_activate_with_filter(struct cmd_context *cmd, const char *lvid_s,
- int exclusive, struct logical_volume *lv);
+ int exclusive, int noscan, struct logical_volume *lv);
int lv_deactivate(struct cmd_context *cmd, const char *lvid_s, struct logical_volume *lv);
int lv_mknodes(struct cmd_context *cmd, const struct logical_volume *lv);
diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c
index b8233bf..0f5a04c 100644
--- a/lib/activate/dev_manager.c
+++ b/lib/activate/dev_manager.c
@@ -30,6 +30,7 @@
#include <dirent.h>
#define MAX_TARGET_PARAMSIZE 50000
+#define LVM_UDEV_NOSCAN_FLAG DM_SUBSYSTEM_UDEV_FLAG0
typedef enum {
PRELOAD,
@@ -1399,7 +1400,7 @@ static int _check_udev_fallback(struct cmd_context *cmd)
#endif /* UDEV_SYNC_SUPPORT */
static uint16_t _get_udev_flags(struct dev_manager *dm, struct logical_volume *lv,
- const char *layer)
+ const char *layer, uint16_t flags)
{
uint16_t udev_flags = 0;
@@ -1447,6 +1448,11 @@ static uint16_t _get_udev_flags(struct dev_manager *dm, struct logical_volume *l
udev_flags |= DM_UDEV_DISABLE_DM_RULES_FLAG |
DM_UDEV_DISABLE_SUBSYSTEM_RULES_FLAG;
+ /*
+ * Firmly set requested flags.
+ */
+ udev_flags |= flags;
+
return udev_flags;
}
@@ -1493,7 +1499,7 @@ static int _add_dev_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
}
if (info.exists && !dm_tree_add_dev_with_udev_flags(dtree, info.major, info.minor,
- _get_udev_flags(dm, lv, layer))) {
+ _get_udev_flags(dm, lv, layer, 0))) {
log_error("Failed to add device (%" PRIu32 ":%" PRIu32") to dtree",
info.major, info.minor);
return 0;
@@ -2334,7 +2340,7 @@ static int _set_udev_flags_for_children(struct dev_manager *dm,
}
dm_tree_node_set_udev_flags(child,
- _get_udev_flags(dm, lvl->lv, NULL));
+ _get_udev_flags(dm, lvl->lv, NULL, 0));
}
return 1;
@@ -2411,7 +2417,8 @@ static int _add_new_lv_to_dtree(struct dev_manager *dm, struct dm_tree *dtree,
read_only_lv(lv, laopts),
((lv->vg->status & PRECOMMITTED) | laopts->revert) ? 1 : 0,
lvlayer,
- _get_udev_flags(dm, lv, layer))))
+ _get_udev_flags(dm, lv, layer,
+ laopts->noscan ? LVM_UDEV_NOSCAN_FLAG : 0))))
return_0;
/* Store existing name so we can do rename later */
diff --git a/lib/locking/file_locking.c b/lib/locking/file_locking.c
index 5e49bc4..b6b2b10 100644
--- a/lib/locking/file_locking.c
+++ b/lib/locking/file_locking.c
@@ -305,7 +305,7 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
break;
case LCK_READ:
log_very_verbose("Locking LV %s (R)", resource);
- if (!lv_activate_with_filter(cmd, resource, 0, lv_ondisk(lv)))
+ if (!lv_activate_with_filter(cmd, resource, 0, lv->status & LV_NOSCAN ? 1 : 0, lv_ondisk(lv)))
return 0;
break;
case LCK_PREAD:
@@ -318,7 +318,7 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
break;
case LCK_EXCL:
log_very_verbose("Locking LV %s (EX)", resource);
- if (!lv_activate_with_filter(cmd, resource, 1, lv_ondisk(lv)))
+ if (!lv_activate_with_filter(cmd, resource, 1, lv->status & LV_NOSCAN ? 1 : 0, lv_ondisk(lv)))
return 0;
break;
default:
diff --git a/lib/locking/no_locking.c b/lib/locking/no_locking.c
index 5f3f0b6..4772706 100644
--- a/lib/locking/no_locking.c
+++ b/lib/locking/no_locking.c
@@ -48,11 +48,11 @@ static int _no_lock_resource(struct cmd_context *cmd, const char *resource,
case LCK_UNLOCK:
return lv_resume_if_active(cmd, resource, (flags & LCK_ORIGIN_ONLY) ? 1: 0, 0, (flags & LCK_REVERT) ? 1 : 0, lv_ondisk(lv));
case LCK_READ:
- return lv_activate_with_filter(cmd, resource, 0, lv_ondisk(lv));
+ return lv_activate_with_filter(cmd, resource, 0, lv->status & LV_NOSCAN ? 1 : 0, lv_ondisk(lv));
case LCK_WRITE:
return lv_suspend_if_active(cmd, resource, (flags & LCK_ORIGIN_ONLY) ? 1 : 0, 0, lv_ondisk(lv), lv);
case LCK_EXCL:
- return lv_activate_with_filter(cmd, resource, 1, lv_ondisk(lv));
+ return lv_activate_with_filter(cmd, resource, 1, lv->status & LV_NOSCAN ? 1 : 0, lv_ondisk(lv));
default:
break;
}
diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c
index f42db1d..22327d7 100644
--- a/lib/metadata/lv_manip.c
+++ b/lib/metadata/lv_manip.c
@@ -5421,6 +5421,8 @@ int set_lv(struct cmd_context *cmd, struct logical_volume *lv,
if (!dev_close_immediate(dev))
stack;
+ lv->status &= ~LV_NOSCAN;
+
return 1;
}
@@ -5977,6 +5979,10 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg,
goto out;
}
+ /* Do not scan this LV until properly zeroed. */
+ if (lp->zero)
+ lv->status |= LV_NOSCAN;
+
if (lv_is_thin_pool(lv)) {
if (is_change_activating(lp->activate)) {
if (vg_is_clustered(lv->vg)) {
diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h
index 308dcfe..1e9543a 100644
--- a/lib/metadata/metadata-exported.h
+++ b/lib/metadata/metadata-exported.h
@@ -102,6 +102,7 @@
#define LV_WRITEMOSTLY UINT64_C(0x0000020000000000) /* LV (RAID1) */
#define LV_ACTIVATION_SKIP UINT64_C(0x0000040000000000) /* LV */
+#define LV_NOSCAN UINT64_C(0x0000080000000000) /* LV */
/* Format features flags */
#define FMT_SEGMENTS 0x00000001U /* Arbitrary segment params? */
10 years, 6 months
master - tests: lvconvert more thin extorg conversions
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=273373bf53b348...
Commit: 273373bf53b34817481ef2c395c84a7cdf4f1998
Parent: 7edf61186b6afdcc7ab8b44072818995cef3702b
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Oct 8 13:30:21 2013 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Oct 8 13:42:10 2013 +0200
tests: lvconvert more thin extorg conversions
Add test for conversion of pool and thin lv at the same time.
---
test/shell/lvconvert-thin-external.sh | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/test/shell/lvconvert-thin-external.sh b/test/shell/lvconvert-thin-external.sh
index a700b37..d9d4d19 100644
--- a/test/shell/lvconvert-thin-external.sh
+++ b/test/shell/lvconvert-thin-external.sh
@@ -144,5 +144,13 @@ lvs -a -o+origin_size,seg_size,segtype $vg
lvremove -f $vg/extorg2
# Only pool is left
check vg_field $vg lv_count 1
+lvremove -ff $vg
+
+# Test conversion to the pool and thin external at the same time (rhbz #1003461)
+lvcreate -l50 -n pool $vg
+lvcreate -l100 -n thin $vg
+lvconvert --thin --thinpool $vg/pool $vg/thin --originname thin-origin
+check lv_field $vg/thin segtype thin
+check lv_field $vg/thin-origin segtype linear
vgremove -ff $vg
10 years, 6 months
master - tests: vgrename duplicate rename
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=7edf61186b6afd...
Commit: 7edf61186b6afdcc7ab8b44072818995cef3702b
Parent: 92bafade6051f95d49b35a53c77d0fc25a1fb7ec
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Oct 8 11:16:00 2013 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Oct 8 13:42:09 2013 +0200
tests: vgrename duplicate rename
Test for rename of duplicated vgname (with different UUID)
---
test/shell/vgrename-usage.sh | 15 +++++++++++++++
1 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/test/shell/vgrename-usage.sh b/test/shell/vgrename-usage.sh
index 2b8ac5a..59576ac 100644
--- a/test/shell/vgrename-usage.sh
+++ b/test/shell/vgrename-usage.sh
@@ -38,3 +38,18 @@ vgcreate $vg1 "$dev1"
vgcreate $vg2 "$dev2"
not vgrename $vg1 $vg2
vgremove $vg1 $vg2
+
+# vgrename duplicate name
+vgcreate $vg1 "$dev1"
+aux disable_dev "$dev1"
+vgcreate $vg1 "$dev2"
+UUID=$(vgs --noheading -o vg_uuid $vg1)
+aux enable_dev "$dev1"
+
+not vgrename $vg1 $vg2
+vgrename $UUID $vg2
+not vgrename $UUID $vg1
+
+vgs
+
+vgremove $vg1 $vg2
10 years, 6 months
master - thin: fix lvconvert in external origin conversion
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=92bafade6051f9...
Commit: 92bafade6051f95d49b35a53c77d0fc25a1fb7ec
Parent: 30746f31dd1db63e0c83e6f8c7ae65dab3f69a4b
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Oct 8 13:24:22 2013 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Oct 8 13:41:06 2013 +0200
thin: fix lvconvert in external origin conversion
Patch 562ad293fd52b8f3096b28bcac20e32aa1e8c1b0 introduced code regression
when LV was converted to a thin LV with external origin and at the same time,
conversion of LV to a thin pool has been requested.
(RHBZ: #997704)
data_lv needs to be assigned after test for external conversion find pool.
---
WHATS_NEW | 1 +
tools/lvconvert.c | 3 ++-
2 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 93a156a..cd9f00a 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -2,6 +2,7 @@ Version 2.02.104
===================================
Improve message when unable to change discards setting on active thin pool.
Run full scan before vgrename operation to avoid any cache name collision.
+ Fix lvconvert when converting to a thin pool and thin LV at once.
Version 2.02.103 - 4th October 2013
===================================
diff --git a/tools/lvconvert.c b/tools/lvconvert.c
index 49881fa..1970ca3 100644
--- a/tools/lvconvert.c
+++ b/tools/lvconvert.c
@@ -2266,7 +2266,7 @@ static int _lvconvert_thinpool(struct cmd_context *cmd,
int r = 0;
const char *old_name;
struct lv_segment *seg;
- struct logical_volume *data_lv = pool_lv;
+ struct logical_volume *data_lv;
struct logical_volume *metadata_lv;
struct logical_volume *pool_metadata_lv;
struct logical_volume *external_lv = NULL;
@@ -2304,6 +2304,7 @@ static int _lvconvert_thinpool(struct cmd_context *cmd,
}
}
+ data_lv = pool_lv;
if (lv_is_thin_type(pool_lv) && !lp->pool_metadata_lv_name) {
log_error("Can't use thin logical volume %s/%s for thin pool data.",
pool_lv->vg->name, pool_lv->name);
10 years, 6 months
master - vgrename: run fullscan
by Zdenek Kabelac
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=30746f31dd1db6...
Commit: 30746f31dd1db63e0c83e6f8c7ae65dab3f69a4b
Parent: 4806f38d703c2d7cd01e0adc49505ccb7d010a17
Author: Zdenek Kabelac <zkabelac(a)redhat.com>
AuthorDate: Tue Oct 8 11:15:05 2013 +0200
Committer: Zdenek Kabelac <zkabelac(a)redhat.com>
CommitterDate: Tue Oct 8 13:39:11 2013 +0200
vgrename: run fullscan
For vgrename run full scan so the command is able to properly
detect name collision.
---
WHATS_NEW | 1 +
tools/vgrename.c | 2 ++
2 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index 5b35890..93a156a 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,6 +1,7 @@
Version 2.02.104
===================================
Improve message when unable to change discards setting on active thin pool.
+ Run full scan before vgrename operation to avoid any cache name collision.
Version 2.02.103 - 4th October 2013
===================================
diff --git a/tools/vgrename.c b/tools/vgrename.c
index 154a6f3..b5e778f 100644
--- a/tools/vgrename.c
+++ b/tools/vgrename.c
@@ -83,6 +83,8 @@ static int vg_rename_path(struct cmd_context *cmd, const char *old_vg_path,
if (!lvmetad_vg_list_to_lvmcache(cmd))
stack;
+ lvmcache_label_scan(cmd, 2);
+
/* Avoid duplicates */
if (!(vgids = get_vgids(cmd, 0)) || dm_list_empty(vgids)) {
log_error("No complete volume groups found");
10 years, 6 months
master - lvchange: improve discards when pool active error
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=4806f38d703c2d...
Commit: 4806f38d703c2d7cd01e0adc49505ccb7d010a17
Parent: 761b5245193be548698495f2b2d2c089a5a72975
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Mon Oct 7 23:50:09 2013 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Mon Oct 7 23:50:09 2013 +0100
lvchange: improve discards when pool active error
Existing message deemed misleading:
Cannot change discards state for active pool volume
https://bugzilla.redhat.com/show_bug.cgi?id=994315
---
WHATS_NEW | 1 +
tools/lvchange.c | 3 +--
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/WHATS_NEW b/WHATS_NEW
index ef2181d..5b35890 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.104
===================================
+ Improve message when unable to change discards setting on active thin pool.
Version 2.02.103 - 4th October 2013
===================================
diff --git a/tools/lvchange.c b/tools/lvchange.c
index 1d4f0a5..6ae9720 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -120,8 +120,7 @@ static int lvchange_pool_update(struct cmd_context *cmd,
if (((discards == THIN_DISCARDS_IGNORE) ||
(first_seg(lv)->discards == THIN_DISCARDS_IGNORE)) &&
pool_is_active(lv))
- log_error("Cannot change discards state for active "
- "pool volume \"%s\".", lv->name);
+ log_error("Cannot change support for discards while pool volume \"%s\" is active.", lv->name);
else {
first_seg(lv)->discards = discards;
update++;
10 years, 6 months
master - post-release
by Alasdair Kergon
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=761b5245193be5...
Commit: 761b5245193be548698495f2b2d2c089a5a72975
Parent: 04d9a526843dcb93fc0110e6e9dfbb12143a3930
Author: Alasdair G Kergon <agk(a)redhat.com>
AuthorDate: Fri Oct 4 14:41:32 2013 +0100
Committer: Alasdair G Kergon <agk(a)redhat.com>
CommitterDate: Fri Oct 4 14:41:32 2013 +0100
post-release
---
VERSION | 2 +-
VERSION_DM | 2 +-
WHATS_NEW | 3 +++
WHATS_NEW_DM | 3 +++
4 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/VERSION b/VERSION
index f4bbdb9..8e798d0 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.02.103(2)-git (2013-10-04)
+2.02.104(2)-git (2013-10-04)
diff --git a/VERSION_DM b/VERSION_DM
index f4e8c0b..0e6eddb 100644
--- a/VERSION_DM
+++ b/VERSION_DM
@@ -1 +1 @@
-1.02.82-git (2013-10-04)
+1.02.83-git (2013-10-04)
diff --git a/WHATS_NEW b/WHATS_NEW
index d69e74e..ef2181d 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,3 +1,6 @@
+Version 2.02.104
+===================================
+
Version 2.02.103 - 4th October 2013
===================================
Ensure vgid matches before removing vgname entry from lvmetad cache.
diff --git a/WHATS_NEW_DM b/WHATS_NEW_DM
index 9dfd9bf..6287fb4 100644
--- a/WHATS_NEW_DM
+++ b/WHATS_NEW_DM
@@ -1,3 +1,6 @@
+Version 1.02.83
+==================================
+
Version 1.02.82 - 4th October 2013
==================================
Define symbolic names for subsystem udev flags in libdevmapper for easier use.
10 years, 6 months