[lvm-devel] main - deactivation: reduce ioctl count
Zdenek Kabelac
zkabelac at sourceware.org
Mon Mar 8 14:46:45 UTC 2021
Gitweb: https://sourceware.org/git/?p=lvm2.git;a=commitdiff;h=dceef4709d7ee5d06fb61120cc15fc29feb3e6b8
Commit: dceef4709d7ee5d06fb61120cc15fc29feb3e6b8
Parent: 936c7b5104e4fb6fb489845b87d9ba2cd1a69d0a
Author: Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate: Sun Mar 7 01:54:50 2021 +0100
Committer: Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Mon Mar 8 15:30:18 2021 +0100
deactivation: reduce ioctl count
When LV is deactivativate, we check for presence, and later
for some LV types also for being in use.
We can however do this check in 1 step for them a remove extra ioctl.
Add return value '2' to lv_check_not_in_use() to recognize LV is not
present.
Existing users were just testing for 0, so no change for them.
---
lib/activate/activate.c | 70 ++++++++++++++++++++++++++-----------------------
1 file changed, 37 insertions(+), 33 deletions(-)
diff --git a/lib/activate/activate.c b/lib/activate/activate.c
index 75248aa63..a56227118 100644
--- a/lib/activate/activate.c
+++ b/lib/activate/activate.c
@@ -828,13 +828,14 @@ int lv_info_with_seg_status(struct cmd_context *cmd,
#define OPEN_COUNT_CHECK_USLEEP_DELAY 200000
/* Only report error if error_if_used is set */
+/* Returns 0 if in use, 1 if it is unused, 2 when it is not present in table */
int lv_check_not_in_use(const struct logical_volume *lv, int error_if_used)
{
struct lvinfo info;
unsigned int open_count_check_retries;
if (!lv_info(lv->vg->cmd, lv, 0, &info, 1, 0) || !info.exists || !info.open_count)
- return 1;
+ return !info.exists ? 2 : 1;
/* If sysfs is not used, use open_count information only. */
if (dm_sysfs_dir()) {
@@ -2408,44 +2409,47 @@ int lv_deactivate(struct cmd_context *cmd, const char *lvid_s, const struct logi
log_debug_activation("Deactivating %s.", display_lvname(lv));
- if (!lv_info(cmd, lv, 0, &info, 0, 0))
- goto_out;
-
- if (!info.exists) {
- r = 1;
- /* Check attached snapshot segments are also inactive */
- dm_list_iterate(snh, &lv->snapshot_segs) {
- if (!lv_info(cmd, dm_list_struct_base(snh, struct lv_segment, origin_list)->cow,
- 0, &info, 0, 0))
- goto_out;
- if (info.exists) {
- r = 0; /* Snapshot left in table? */
- break;
- }
+ if (lv_is_visible(lv) || lv_is_virtual_origin(lv) ||
+ lv_is_merging_thin_snapshot(lv)) {
+ switch (lv_check_not_in_use(lv, 1)) {
+ case 0: goto_out;
+ case 2: goto no_exists;
}
- if (lv_is_vdo_pool(lv)) {
- /* If someone has remove 'linear' mapping over VDO device
- * we may still be able to deactivate the rest of the tree
- * i.e. in test-suite we simulate this via 'dmsetup remove' */
- if (!lv_info(cmd, lv, 1, &info, 1, 0))
- goto_out;
+ if (lv_is_origin(lv) && _lv_has_open_snapshots(lv))
+ goto_out;
+ } else {
+ if (!lv_info(cmd, lv, 0, &info, 0, 0))
+ goto_out;
- if (info.exists && !info.open_count)
- r = 0; /* Unused VDO device left in table? */
- }
+ if (!info.exists) {
+ no_exists:
+ r = 1;
+ /* Check attached snapshot segments are also inactive */
+ dm_list_iterate(snh, &lv->snapshot_segs) {
+ if (!lv_info(cmd, dm_list_struct_base(snh, struct lv_segment, origin_list)->cow,
+ 0, &info, 0, 0))
+ goto_out;
+ if (info.exists) {
+ r = 0; /* Snapshot left in table? */
+ break;
+ }
+ }
- if (r)
- goto out;
- }
+ if (lv_is_vdo_pool(lv)) {
+ /* If someone has remove 'linear' mapping over VDO device
+ * we may still be able to deactivate the rest of the tree
+ * i.e. in test-suite we simulate this via 'dmsetup remove' */
+ if (!lv_info(cmd, lv, 1, &info, 1, 0))
+ goto_out;
- if (lv_is_visible(lv) || lv_is_virtual_origin(lv) ||
- lv_is_merging_thin_snapshot(lv)) {
- if (!lv_check_not_in_use(lv, 1))
- goto_out;
+ if (info.exists && !info.open_count)
+ r = 0; /* Unused VDO device left in table? */
+ }
- if (lv_is_origin(lv) && _lv_has_open_snapshots(lv))
- goto_out;
+ if (r)
+ goto out;
+ }
}
if (!monitor_dev_for_events(cmd, lv, &laopts, 0))
More information about the lvm-devel
mailing list