/* * VG locking is by VG name. * FIXME This should become VG uuid. */ static int _lock_vol(struct cmd_context *cmd, const char *resource, uint32_t flags, lv_operation_t lv_op, struct logical_volume *lv) { uint32_t lck_type = flags & LCK_TYPE_MASK; uint32_t lck_scope = flags & LCK_SCOPE_MASK; int ret = 0; _block_signals(flags); _lock_memory(cmd, lv_op); assert(resource); if (!*resource) { log_error(INTERNAL_ERROR "Use of P_orphans is deprecated."); return 0; } if ((is_orphan_vg(resource) || is_global_vg(resource)) && (flags & LCK_CACHE)) { log_error(INTERNAL_ERROR "P_%s referenced", resource); return 0; } if (cmd->metadata_read_only && lck_type == LCK_WRITE && strcmp(resource, VG_GLOBAL)) { log_error("Operation prohibited while global/metadata_read_only is set."); return 0; } if ((ret = _locking.lock_resource(cmd, resource, flags, lv))) { if (lck_scope == LCK_VG && !(flags & LCK_CACHE)) { if (lck_type != LCK_UNLOCK) lvmcache_lock_vgname(resource, lck_type == LCK_READ); dev_reset_error_count(cmd); } _update_vg_lock_count(resource, flags); } else stack; /* If unlocking, always remove lock from lvmcache even if operation failed. */ if (lck_scope == LCK_VG && !(flags & LCK_CACHE) && lck_type == LCK_UNLOCK) { lvmcache_unlock_vgname(resource); if (!ret) _update_vg_lock_count(resource, flags); } _unlock_memory(cmd, lv_op); _unblock_signals(); return ret; }
static int _no_lock_resource(struct cmd_context *cmd, const char *resource, int flags) { switch (flags & LCK_SCOPE_MASK) { case LCK_VG: switch (flags & LCK_TYPE_MASK) { case LCK_UNLOCK: lvmcache_unlock_vgname(resource); break; default: lvmcache_lock_vgname(resource, (flags & LCK_TYPE_MASK) == LCK_READ); } break; case LCK_LV: switch (flags & LCK_TYPE_MASK) { case LCK_NULL: return lv_deactivate(cmd, resource); case LCK_UNLOCK: return lv_resume_if_active(cmd, resource); case LCK_READ: return lv_activate_with_filter(cmd, resource, 0); case LCK_WRITE: return lv_suspend_if_active(cmd, resource); case LCK_EXCL: return lv_activate_with_filter(cmd, resource, 1); default: break; } break; default: log_error("Unrecognised lock scope: %d", flags & LCK_SCOPE_MASK); return 0; } return 1; }