xref: /dflybsd-src/contrib/lvm2/dist/include/locking.h (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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