186d7f5d3SJohn Marino /* $NetBSD: locking.h,v 1.1.1.2 2009/12/02 00:25:44 haad Exp $ */ 286d7f5d3SJohn Marino 386d7f5d3SJohn Marino /* 486d7f5d3SJohn Marino * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. 586d7f5d3SJohn Marino * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved. 686d7f5d3SJohn Marino * 786d7f5d3SJohn Marino * This file is part of LVM2. 886d7f5d3SJohn Marino * 986d7f5d3SJohn Marino * This copyrighted material is made available to anyone wishing to use, 1086d7f5d3SJohn Marino * modify, copy, or redistribute it subject to the terms and conditions 1186d7f5d3SJohn Marino * of the GNU Lesser General Public License v.2.1. 1286d7f5d3SJohn Marino * 1386d7f5d3SJohn Marino * You should have received a copy of the GNU Lesser General Public License 1486d7f5d3SJohn Marino * along with this program; if not, write to the Free Software Foundation, 1586d7f5d3SJohn Marino * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 1686d7f5d3SJohn Marino */ 1786d7f5d3SJohn Marino 1886d7f5d3SJohn Marino #ifndef _LVM_LOCKING_H 1986d7f5d3SJohn Marino #define _LVM_LOCKING_H 2086d7f5d3SJohn Marino 2186d7f5d3SJohn Marino #include "uuid.h" 2286d7f5d3SJohn Marino #include "config.h" 2386d7f5d3SJohn Marino 2486d7f5d3SJohn Marino int init_locking(int type, struct cmd_context *cmd); 2586d7f5d3SJohn Marino void fin_locking(void); 2686d7f5d3SJohn Marino void reset_locking(void); 2786d7f5d3SJohn Marino int vg_write_lock_held(void); 2886d7f5d3SJohn Marino int locking_is_clustered(void); 2986d7f5d3SJohn Marino 3086d7f5d3SJohn Marino int remote_lock_held(const char *vol); 3186d7f5d3SJohn Marino 3286d7f5d3SJohn Marino /* 3386d7f5d3SJohn Marino * LCK_VG: 3486d7f5d3SJohn Marino * Lock/unlock on-disk volume group data. 3586d7f5d3SJohn Marino * Use VG_ORPHANS to lock all orphan PVs. 3686d7f5d3SJohn Marino * Use VG_GLOBAL as a global lock and to wipe the internal cache. 3786d7f5d3SJohn Marino * char *vol holds volume group name. 3886d7f5d3SJohn Marino * Set the LCK_CACHE flag to invalidate 'vol' in the internal cache. 3986d7f5d3SJohn Marino * If more than one lock needs to be held simultaneously, they must be 4086d7f5d3SJohn Marino * acquired in alphabetical order of 'vol' (to avoid deadlocks). 4186d7f5d3SJohn Marino * 4286d7f5d3SJohn Marino * LCK_LV: 4386d7f5d3SJohn Marino * Lock/unlock an individual logical volume 4486d7f5d3SJohn Marino * char *vol holds lvid 4586d7f5d3SJohn Marino */ 4686d7f5d3SJohn Marino int lock_vol(struct cmd_context *cmd, const char *vol, uint32_t flags); 4786d7f5d3SJohn Marino 4886d7f5d3SJohn Marino /* 4986d7f5d3SJohn Marino * Internal locking representation. 5086d7f5d3SJohn Marino * LCK_VG: Uses prefix V_ unless the vol begins with # (i.e. #global or #orphans) 5186d7f5d3SJohn Marino * or the LCK_CACHE flag is set when it uses the prefix P_. 5286d7f5d3SJohn Marino * If LCK_CACHE is set, we do not take out a real lock. 5386d7f5d3SJohn Marino */ 5486d7f5d3SJohn Marino 5586d7f5d3SJohn Marino /* 5686d7f5d3SJohn Marino * Does the LVM1 driver have this VG active? 5786d7f5d3SJohn Marino */ 5886d7f5d3SJohn Marino int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname); 5986d7f5d3SJohn Marino 6086d7f5d3SJohn Marino /* 6186d7f5d3SJohn Marino * Lock type - these numbers are the same as VMS and the IBM DLM 6286d7f5d3SJohn Marino */ 6386d7f5d3SJohn Marino #define LCK_TYPE_MASK 0x00000007U 6486d7f5d3SJohn Marino 6586d7f5d3SJohn Marino #define LCK_NULL 0x00000000U /* LCK$_NLMODE */ 6686d7f5d3SJohn Marino #define LCK_READ 0x00000001U /* LCK$_CRMODE */ 6786d7f5d3SJohn Marino /* LCK$_CWMODE */ 6886d7f5d3SJohn Marino #define LCK_PREAD 0x00000003U /* LCK$_PRMODE */ 6986d7f5d3SJohn Marino #define LCK_WRITE 0x00000004U /* LCK$_PWMODE */ 7086d7f5d3SJohn Marino #define LCK_EXCL 0x00000005U /* LCK$_EXMODE */ 7186d7f5d3SJohn Marino #define LCK_UNLOCK 0x00000006U /* This is ours */ 7286d7f5d3SJohn Marino 7386d7f5d3SJohn Marino /* 7486d7f5d3SJohn Marino * Lock scope 7586d7f5d3SJohn Marino */ 7686d7f5d3SJohn Marino #define LCK_SCOPE_MASK 0x00000008U 7786d7f5d3SJohn Marino #define LCK_VG 0x00000000U 7886d7f5d3SJohn Marino #define LCK_LV 0x00000008U 7986d7f5d3SJohn Marino 8086d7f5d3SJohn Marino /* 8186d7f5d3SJohn Marino * Lock bits 8286d7f5d3SJohn Marino */ 8386d7f5d3SJohn Marino #define LCK_NONBLOCK 0x00000010U /* Don't block waiting for lock? */ 8486d7f5d3SJohn Marino #define LCK_HOLD 0x00000020U /* Hold lock when lock_vol returns? */ 8586d7f5d3SJohn Marino #define LCK_LOCAL 0x00000040U /* Don't propagate to other nodes */ 8686d7f5d3SJohn Marino #define LCK_CLUSTER_VG 0x00000080U /* VG is clustered */ 8786d7f5d3SJohn Marino #define LCK_CACHE 0x00000100U /* Operation on cache only using P_ lock */ 8886d7f5d3SJohn Marino 8986d7f5d3SJohn Marino /* 9086d7f5d3SJohn Marino * Additional lock bits for cluster communication 9186d7f5d3SJohn Marino */ 9286d7f5d3SJohn Marino #define LCK_PARTIAL_MODE 0x00000001U /* Partial activation? */ 9386d7f5d3SJohn Marino #define LCK_MIRROR_NOSYNC_MODE 0x00000002U /* Mirrors don't require sync */ 9486d7f5d3SJohn Marino #define LCK_DMEVENTD_MONITOR_MODE 0x00000004U /* Register with dmeventd */ 9586d7f5d3SJohn Marino #define LCK_CONVERT 0x00000008U /* Convert existing lock */ 9686d7f5d3SJohn Marino 9786d7f5d3SJohn Marino /* 9886d7f5d3SJohn Marino * Special cases of VG locks. 9986d7f5d3SJohn Marino */ 10086d7f5d3SJohn Marino #define VG_ORPHANS "#orphans" 10186d7f5d3SJohn Marino #define VG_GLOBAL "#global" 10286d7f5d3SJohn Marino 10386d7f5d3SJohn Marino /* 10486d7f5d3SJohn Marino * Common combinations 10586d7f5d3SJohn Marino */ 10686d7f5d3SJohn Marino #define LCK_NONE (LCK_VG | LCK_NULL) 10786d7f5d3SJohn Marino 10886d7f5d3SJohn Marino #define LCK_VG_READ (LCK_VG | LCK_READ | LCK_HOLD) 10986d7f5d3SJohn Marino #define LCK_VG_WRITE (LCK_VG | LCK_WRITE | LCK_HOLD) 11086d7f5d3SJohn Marino #define LCK_VG_UNLOCK (LCK_VG | LCK_UNLOCK) 11186d7f5d3SJohn Marino #define LCK_VG_DROP_CACHE (LCK_VG | LCK_WRITE | LCK_CACHE) 11286d7f5d3SJohn Marino #define LCK_VG_BACKUP (LCK_VG | LCK_CACHE) 11386d7f5d3SJohn Marino 11486d7f5d3SJohn Marino #define LCK_LV_EXCLUSIVE (LCK_LV | LCK_EXCL) 11586d7f5d3SJohn Marino #define LCK_LV_SUSPEND (LCK_LV | LCK_WRITE) 11686d7f5d3SJohn Marino #define LCK_LV_RESUME (LCK_LV | LCK_UNLOCK) 11786d7f5d3SJohn Marino #define LCK_LV_ACTIVATE (LCK_LV | LCK_READ) 11886d7f5d3SJohn Marino #define LCK_LV_DEACTIVATE (LCK_LV | LCK_NULL) 11986d7f5d3SJohn Marino 12086d7f5d3SJohn Marino #define LCK_MASK (LCK_TYPE_MASK | LCK_SCOPE_MASK) 12186d7f5d3SJohn Marino 12286d7f5d3SJohn Marino #define LCK_LV_CLUSTERED(lv) \ 12386d7f5d3SJohn Marino (vg_is_clustered((lv)->vg) ? LCK_CLUSTER_VG : 0) 12486d7f5d3SJohn Marino 12586d7f5d3SJohn Marino #define lock_lv_vol(cmd, lv, flags) \ 12686d7f5d3SJohn Marino lock_vol(cmd, (lv)->lvid.s, flags | LCK_LV_CLUSTERED(lv)) 12786d7f5d3SJohn Marino 12886d7f5d3SJohn Marino #define unlock_vg(cmd, vol) lock_vol(cmd, vol, LCK_VG_UNLOCK) 12986d7f5d3SJohn Marino #define unlock_and_release_vg(cmd, vg, vol) \ 13086d7f5d3SJohn Marino do { \ 13186d7f5d3SJohn Marino unlock_vg(cmd, vol); \ 13286d7f5d3SJohn Marino vg_release(vg); \ 13386d7f5d3SJohn Marino } while (0) 13486d7f5d3SJohn Marino 13586d7f5d3SJohn Marino #define resume_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_RESUME) 13686d7f5d3SJohn Marino #define suspend_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_SUSPEND | LCK_HOLD) 13786d7f5d3SJohn Marino #define deactivate_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE) 13886d7f5d3SJohn Marino #define activate_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_ACTIVATE | LCK_HOLD) 13986d7f5d3SJohn Marino #define activate_lv_excl(cmd, lv) \ 14086d7f5d3SJohn Marino lock_lv_vol(cmd, lv, LCK_LV_EXCLUSIVE | LCK_HOLD) 14186d7f5d3SJohn Marino #define activate_lv_local(cmd, lv) \ 14286d7f5d3SJohn Marino lock_lv_vol(cmd, lv, LCK_LV_ACTIVATE | LCK_HOLD | LCK_LOCAL) 14386d7f5d3SJohn Marino #define deactivate_lv_local(cmd, lv) \ 14486d7f5d3SJohn Marino lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE | LCK_LOCAL) 14586d7f5d3SJohn Marino #define drop_cached_metadata(vg) \ 14686d7f5d3SJohn Marino lock_vol((vg)->cmd, (vg)->name, LCK_VG_DROP_CACHE) 14786d7f5d3SJohn Marino #define remote_backup_metadata(vg) \ 14886d7f5d3SJohn Marino lock_vol((vg)->cmd, (vg)->name, LCK_VG_BACKUP) 14986d7f5d3SJohn Marino 15086d7f5d3SJohn Marino /* Process list of LVs */ 15186d7f5d3SJohn Marino int suspend_lvs(struct cmd_context *cmd, struct dm_list *lvs); 15286d7f5d3SJohn Marino int resume_lvs(struct cmd_context *cmd, struct dm_list *lvs); 15386d7f5d3SJohn Marino int activate_lvs(struct cmd_context *cmd, struct dm_list *lvs, unsigned exclusive); 15486d7f5d3SJohn Marino 15586d7f5d3SJohn Marino /* Interrupt handling */ 15686d7f5d3SJohn Marino void sigint_clear(void); 15786d7f5d3SJohn Marino void sigint_allow(void); 15886d7f5d3SJohn Marino void sigint_restore(void); 15986d7f5d3SJohn Marino int sigint_caught(void); 16086d7f5d3SJohn Marino 16186d7f5d3SJohn Marino #endif 162