1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00
lvm2/lib/locking/locking.h

119 lines
3.7 KiB
C
Raw Normal View History

2002-02-08 17:30:37 +03:00
/*
2004-03-30 23:35:44 +04:00
* Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.
* Copyright (C) 2004 Red Hat, Inc. All rights reserved.
2002-02-08 17:30:37 +03:00
*
2004-03-30 23:35:44 +04:00
* This file is part of LVM2.
2002-02-08 17:30:37 +03:00
*
2004-03-30 23:35:44 +04:00
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU General Public License v.2.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2002-02-08 17:30:37 +03:00
*/
#ifndef _LVM_LOCKING_H
#define _LVM_LOCKING_H
2002-02-08 17:30:37 +03:00
#include "uuid.h"
#include "config.h"
2002-11-18 17:01:16 +03:00
int init_locking(int type, struct config_tree *cf);
2002-02-08 17:30:37 +03:00
void fin_locking(void);
2003-05-06 16:03:13 +04:00
void reset_locking(void);
int vg_write_lock_held(void);
int locking_is_clustered(void);
2002-02-08 17:30:37 +03:00
/*
* LCK_VG:
2002-02-08 17:30:37 +03:00
* Lock/unlock on-disk volume group data
* Use "" to lock orphan PVs
* char *vol holds volume group name
*
* LCK_LV:
2002-02-08 17:30:37 +03:00
* Lock/unlock an individual logical volume
* char *vol holds lvid
2002-02-08 17:30:37 +03:00
*/
int lock_vol(struct cmd_context *cmd, const char *vol, int flags);
2002-02-08 17:30:37 +03:00
/*
* Does the LVM1 driver have this VG active?
*/
int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
2002-02-08 17:30:37 +03:00
/*
* Lock type - these numbers are the same as VMS and the IBM DLM
2002-02-08 17:30:37 +03:00
*/
2003-11-06 20:08:18 +03:00
#define LCK_TYPE_MASK 0x00000007
#define LCK_NULL 0x00000000 /* LCK$_NLMODE */
#define LCK_READ 0x00000001 /* LCK$_CRMODE */
/* LCK$_CWMODE */
/* LCK$_PRMODE */
#define LCK_WRITE 0x00000004 /* LCK$_PWMODE */
#define LCK_EXCL 0x00000005 /* LCK$_EXMODE */
2003-11-06 20:08:18 +03:00
#define LCK_UNLOCK 0x00000006 /* This is ours */
2002-02-08 17:30:37 +03:00
/*
* Lock scope
*/
2003-11-06 20:08:18 +03:00
#define LCK_SCOPE_MASK 0x00000008
2002-02-08 17:30:37 +03:00
#define LCK_VG 0x00000000
2003-11-06 20:08:18 +03:00
#define LCK_LV 0x00000008
2002-02-08 17:30:37 +03:00
/*
* Lock bits
*/
2003-11-06 20:08:18 +03:00
#define LCK_NONBLOCK 0x00000010 /* Don't block waiting for lock? */
#define LCK_HOLD 0x00000020 /* Hold lock when lock_vol returns? */
2004-06-16 21:13:41 +04:00
#define LCK_LOCAL 0x00000040 /* Don't propagate to other nodes */
#define LCK_CLUSTER_VG 0x00000080 /* VG is clustered */
2002-02-08 17:30:37 +03:00
2006-03-10 01:34:13 +03:00
/*
* Additional lock bits for cluster communication
*/
#define LCK_PARTIAL_MODE 0x00000001 /* Running in partial mode */
2006-05-11 23:05:21 +04:00
#define LCK_MIRROR_NOSYNC_MODE 0x00000002 /* Mirrors don't require sync */
#define LCK_DMEVENTD_REGISTER_MODE 0x00000004 /* Register with dmeventd */
2006-03-10 01:34:13 +03:00
/*
* Common combinations
*/
#define LCK_VG_READ (LCK_VG | LCK_READ | LCK_HOLD)
#define LCK_VG_WRITE (LCK_VG | LCK_WRITE | LCK_HOLD)
2002-04-04 15:18:45 +04:00
#define LCK_VG_UNLOCK (LCK_VG | LCK_UNLOCK)
2004-05-05 16:03:07 +04:00
#define LCK_LV_EXCLUSIVE (LCK_LV | LCK_EXCL | LCK_NONBLOCK)
#define LCK_LV_SUSPEND (LCK_LV | LCK_WRITE | LCK_NONBLOCK)
2004-03-27 00:46:01 +03:00
#define LCK_LV_RESUME (LCK_LV | LCK_UNLOCK | LCK_NONBLOCK)
2004-05-05 16:03:07 +04:00
#define LCK_LV_ACTIVATE (LCK_LV | LCK_READ | LCK_NONBLOCK)
#define LCK_LV_DEACTIVATE (LCK_LV | LCK_NULL | LCK_NONBLOCK)
#define LCK_LV_CLUSTERED(lv) \
(((lv)->vg->status & CLUSTERED) ? LCK_CLUSTER_VG : 0)
#define lock_lv_vol(cmd, lv, flags) \
lock_vol(cmd, (lv)->lvid.s, flags | LCK_LV_CLUSTERED(lv))
#define unlock_vg(cmd, vol) lock_vol(cmd, vol, LCK_VG_UNLOCK)
2004-03-26 23:49:35 +03:00
#define resume_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_RESUME)
#define suspend_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_SUSPEND | LCK_HOLD)
#define deactivate_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE)
#define activate_lv(cmd, lv) lock_lv_vol(cmd, lv, LCK_LV_ACTIVATE | LCK_HOLD)
#define activate_lv_excl(cmd, lv) \
lock_lv_vol(cmd, lv, LCK_LV_EXCLUSIVE | LCK_HOLD)
#define activate_lv_local(cmd, lv) \
lock_lv_vol(cmd, lv, LCK_LV_ACTIVATE | LCK_HOLD | LCK_LOCAL)
#define deactivate_lv_local(cmd, lv) \
lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE | LCK_LOCAL)
2004-05-05 16:03:07 +04:00
2004-03-26 23:49:35 +03:00
/* Process list of LVs */
2004-05-05 16:03:07 +04:00
int suspend_lvs(struct cmd_context *cmd, struct list *lvs);
int resume_lvs(struct cmd_context *cmd, struct list *lvs);
int activate_lvs_excl(struct cmd_context *cmd, struct list *lvs);
2004-03-26 23:49:35 +03:00
#endif