From 6470c383b26ade429ded2889db9a238ee135f789 Mon Sep 17 00:00:00 2001 From: Zdenek Kabelac Date: Thu, 13 Jan 2011 14:56:17 +0000 Subject: [PATCH] Skip unnecessary lock_vol() call after volume deactivation Improve condition within lock_vol so we are not calling extra unlock if the volume just has been deactivated. Patch uses lck_type and replaces negative 'and' condition to more readable 'or' condition. Few missing strace traces added. --- WHATS_NEW | 1 + lib/locking/locking.c | 25 +++++++++++++------------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/WHATS_NEW b/WHATS_NEW index b4d63142d..df4da73d1 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.81 - =================================== + Skip unnecessary lock_vol() call after volume deactivation. Extend exec_cmd params to specify, when device sync is needed. 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. diff --git a/lib/locking/locking.c b/lib/locking/locking.c index 2adf99786..645f25d57 100644 --- a/lib/locking/locking.c +++ b/lib/locking/locking.c @@ -406,6 +406,7 @@ int lock_vol(struct cmd_context *cmd, const char *vol, uint32_t flags) { char resource[258] __attribute__((aligned(8))); lv_operation_t lv_op; + int lck_type = flags & LCK_TYPE_MASK; switch (flags & (LCK_SCOPE_MASK | LCK_TYPE_MASK)) { case LCK_LV_SUSPEND: @@ -432,15 +433,15 @@ int lock_vol(struct cmd_context *cmd, const char *vol, uint32_t flags) if (is_orphan_vg(vol)) vol = VG_ORPHANS; /* VG locks alphabetical, ORPHAN lock last */ - if (((flags & LCK_TYPE_MASK) != LCK_UNLOCK) && - !(flags & LCK_CACHE) && - !lvmcache_verify_lock_order(vol)) - return 0; + if ((lck_type != LCK_UNLOCK) && + !(flags & LCK_CACHE) && + !lvmcache_verify_lock_order(vol)) + return_0; /* Lock VG to change on-disk metadata. */ /* If LVM1 driver knows about the VG, it can't be accessed. */ if (!check_lvm1_vg_inactive(cmd, vol)) - return 0; + return_0; break; case LCK_LV: /* All LV locks are non-blocking. */ @@ -455,18 +456,18 @@ int lock_vol(struct cmd_context *cmd, const char *vol, uint32_t flags) strncpy(resource, vol, sizeof(resource)); if (!_lock_vol(cmd, resource, flags, lv_op)) - return 0; + return_0; /* * If a real lock was acquired (i.e. not LCK_CACHE), * perform an immediate unlock unless LCK_HOLD was requested. */ - if (!(flags & LCK_CACHE) && !(flags & LCK_HOLD) && - ((flags & LCK_TYPE_MASK) != LCK_UNLOCK)) { - if (!_lock_vol(cmd, resource, - (flags & ~LCK_TYPE_MASK) | LCK_UNLOCK, lv_op)) - return 0; - } + if ((lck_type == LCK_NULL) || (lck_type == LCK_UNLOCK) || + (flags & (LCK_CACHE | LCK_HOLD))) + return 1; + + if (!_lock_vol(cmd, resource, (flags & ~LCK_TYPE_MASK) | LCK_UNLOCK, lv_op)) + return_0; return 1; } -- 2.43.5