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 .
2011-02-18 17:16:11 +03:00
* Copyright ( C ) 2004 - 2011 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
2007-08-21 00:55:30 +04:00
* of the GNU Lesser General Public License v .2 .1 .
2004-03-30 23:35:44 +04:00
*
2007-08-21 00:55:30 +04:00
* You should have received a copy of the GNU Lesser General Public License
2004-03-30 23:35:44 +04:00
* along with this program ; if not , write to the Free Software Foundation ,
2016-01-21 13:49:46 +03:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 USA
2002-02-08 17:30:37 +03:00
*/
2006-05-10 01:23:51 +04:00
# ifndef _LVM_LOCKING_H
# define _LVM_LOCKING_H
2018-05-14 12:30:20 +03:00
# include "lib/uuid/uuid.h"
# include "lib/config/config.h"
2002-02-08 17:30:37 +03:00
2013-03-18 00:29:58 +04:00
struct logical_volume ;
Rework lock-override options and locking_type settings
The last commit related to this was incomplete:
"Implement lock-override options without locking type"
This is further reworking and reduction of the locking.[ch]
layer which handled all clustering, but is now only used
for file locking. The "locking types" that this layer
implemented were removed previously, leaving only the
standard file locking. (Some cluster-related artifacts
remain to be cleared out later.)
Command options to override or modify locking behavior
are reimplemented here without using the locking types.
Also, deprecated locking_type values are recognized,
and implemented as if one of the equivalent override
options was set.
Options that override file locking are:
. --nolocking disables all file locking.
. --readonly grants read lock requests without actually
taking a file lock, and refuses write lock requests.
. --ignorelockingfailure tries to set up file locks and
uses them normally if possible. When not possible, it
behaves like --readonly, but allows activation.
. --sysinit is the same as ignorelockingfailure.
. global/metadata_read_only acquires actual read file
locks, and refuses write lock requests.
(Some of these options could probably be deprecated
because they were added as workarounds to various
locking_type behaviors that are now deprecated.)
The locking_type setting now has one valid value: 1 which
refers to standard file locking. Configs that contain
deprecated values are recognized and still work in
largely the same way:
. 0 disabled all locking, now implemented like --nolocking
is set. Allow the nolocking option in all commands.
. 1 is the normal file locking setting and is unchanged.
. 2 was for external locking which was not used, and
reverts to normal file locking.
. 3 was for cluster/clvm. This reverts to normal file
locking, and prints messages about lvmlockd.
. 4 was equivalent to readonly, now implemented like
--readonly is set.
. 5 disabled all locking, now implemented like
--nolocking is set.
2018-06-07 23:33:02 +03:00
int init_locking ( struct cmd_context * cmd , int file_locking_sysinit , int file_locking_readonly , int file_locking_ignorefail ) ;
2002-02-08 17:30:37 +03:00
void fin_locking ( void ) ;
2003-05-06 16:03:13 +04:00
void reset_locking ( void ) ;
2003-11-21 22:54:40 +03:00
int vg_write_lock_held ( void ) ;
2009-05-19 14:38:58 +04:00
2002-02-08 17:30:37 +03:00
/*
2008-05-09 23:26:58 +04:00
* Lock / unlock on - disk volume group data .
* Use VG_ORPHANS to lock all orphan PVs .
* Use VG_GLOBAL as a global lock and to wipe the internal cache .
* char * vol holds volume group name .
2009-09-03 01:34:11 +04:00
* If more than one lock needs to be held simultaneously , they must be
2010-05-19 05:49:08 +04:00
* acquired in alphabetical order of ' vol ' ( to avoid deadlocks ) , with
* VG_ORPHANS last .
2002-02-08 17:30:37 +03:00
*/
2014-09-22 17:50:07 +04:00
int lock_vol ( struct cmd_context * cmd , const char * vol , uint32_t flags , const struct logical_volume * lv ) ;
2002-02-08 17:30:37 +03:00
2007-08-22 18:38:18 +04:00
# define LCK_TYPE_MASK 0x00000007U
2018-06-08 22:34:50 +03:00
# define LCK_READ 0x00000001U
# define LCK_WRITE 0x00000004U
# define LCK_UNLOCK 0x00000006U
2002-02-08 17:30:37 +03:00
/*
2011-12-08 22:09:48 +04:00
* Lock bits .
* Bottom 8 bits except LCK_LOCAL form args [ 0 ] in cluster comms .
2002-02-08 17:30:37 +03:00
*/
2007-08-22 18:38:18 +04:00
# define LCK_NONBLOCK 0x00000010U /* Don't block waiting for lock? */
2006-05-12 23:16:48 +04:00
2007-08-23 19:02:26 +04:00
/*
* Special cases of VG locks .
*/
# define VG_ORPHANS "#orphans"
# define VG_GLOBAL "#global"
2006-03-10 01:34:13 +03:00
2018-06-08 22:34:50 +03:00
# define LCK_VG_READ LCK_READ
# define LCK_VG_WRITE LCK_WRITE
# define LCK_VG_UNLOCK LCK_UNLOCK
2002-02-27 15:26:41 +03:00
lvmetad: two phase vg_update
Previously, a command sent lvmetad new VG metadata in vg_commit().
In vg_commit(), devices are suspended, so any memory allocation
done by the command while sending to lvmetad, or by lvmetad while
updating its cache could deadlock if memory reclaim was triggered.
Now lvmetad is updated in unlock_vg(), after devices are resumed.
The new method for updating VG metadata in lvmetad is in two phases:
1. In vg_write(), before devices are suspended, the command sends
lvmetad a short message ("set_vg_info") telling it what the new
VG seqno will be. lvmetad sees that the seqno is newer than
the seqno of its cached VG, so it sets the INVALID flag for the
cached VG. If sending the message to lvmetad fails, the command
fails before the metadata is committed and the change is not made.
If sending the message succeeds, vg_commit() is called.
2. In unlock_vg(), after devices are resumed, the command sends
lvmetad the standard vg_update message with the new metadata.
lvmetad sees that the seqno in the new metadata matches the
seqno it saved from set_vg_info, and knows it has the latest
copy, so it clears the INVALID flag for the cached VG.
If a command fails between 1 and 2 (after committing the VG on disk,
but before sending lvmetad the new metadata), the cached VG retains
the INVALID flag in lvmetad. A subsequent command will read the
cached VG from lvmetad, see the INVALID flag, ignore the cached
copy, read the VG from disk instead, update the lvmetad copy
with the latest copy from disk, (this clears the INVALID flag
in lvmetad), and use the correct VG metadata for the command.
(This INVALID mechanism already existed for use by lvmlockd.)
2016-06-08 22:42:03 +03:00
# define unlock_vg(cmd, vg, vol) \
2011-02-04 22:18:16 +03:00
do { \
2018-06-08 20:15:22 +03:00
if ( is_real_vg ( vol ) & & ! sync_local_dev_names ( cmd ) ) \
2015-06-30 20:54:38 +03:00
stack ; \
if ( ! lock_vol ( cmd , vol , LCK_VG_UNLOCK , NULL ) ) \
stack ; \
2011-02-04 22:18:16 +03:00
} while ( 0 )
2011-08-11 00:25:29 +04:00
# define unlock_and_release_vg(cmd, vg, vol) \
2009-05-21 07:04:52 +04:00
do { \
lvmetad: two phase vg_update
Previously, a command sent lvmetad new VG metadata in vg_commit().
In vg_commit(), devices are suspended, so any memory allocation
done by the command while sending to lvmetad, or by lvmetad while
updating its cache could deadlock if memory reclaim was triggered.
Now lvmetad is updated in unlock_vg(), after devices are resumed.
The new method for updating VG metadata in lvmetad is in two phases:
1. In vg_write(), before devices are suspended, the command sends
lvmetad a short message ("set_vg_info") telling it what the new
VG seqno will be. lvmetad sees that the seqno is newer than
the seqno of its cached VG, so it sets the INVALID flag for the
cached VG. If sending the message to lvmetad fails, the command
fails before the metadata is committed and the change is not made.
If sending the message succeeds, vg_commit() is called.
2. In unlock_vg(), after devices are resumed, the command sends
lvmetad the standard vg_update message with the new metadata.
lvmetad sees that the seqno in the new metadata matches the
seqno it saved from set_vg_info, and knows it has the latest
copy, so it clears the INVALID flag for the cached VG.
If a command fails between 1 and 2 (after committing the VG on disk,
but before sending lvmetad the new metadata), the cached VG retains
the INVALID flag in lvmetad. A subsequent command will read the
cached VG from lvmetad, see the INVALID flag, ignore the cached
copy, read the VG from disk instead, update the lvmetad copy
with the latest copy from disk, (this clears the INVALID flag
in lvmetad), and use the correct VG metadata for the command.
(This INVALID mechanism already existed for use by lvmlockd.)
2016-06-08 22:42:03 +03:00
unlock_vg ( cmd , vg , vol ) ; \
2011-08-11 00:25:29 +04:00
release_vg ( vg ) ; \
2009-05-21 07:04:52 +04:00
} while ( 0 )
2004-03-26 23:49:35 +03:00
2011-02-18 17:16:11 +03:00
int sync_local_dev_names ( struct cmd_context * cmd ) ;
2004-05-05 16:03:07 +04:00
2004-03-26 23:49:35 +03:00
/* Process list of LVs */
2011-09-27 21:09:42 +04:00
struct volume_group ;
2018-01-31 12:53:09 +03:00
int activate_lvs ( struct cmd_context * cmd , struct dm_list * lvs , unsigned exclusive ) ;
2004-03-26 23:49:35 +03:00
2006-05-10 01:23:51 +04:00
# endif