btrfs: document device locking
Overview of the main locks protecting various device-related structures. Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
5c4cf6c91d
commit
9c6b1c4de1
@ -145,6 +145,71 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info,
|
|||||||
struct btrfs_bio **bbio_ret,
|
struct btrfs_bio **bbio_ret,
|
||||||
int mirror_num, int need_raid_map);
|
int mirror_num, int need_raid_map);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Device locking
|
||||||
|
* ==============
|
||||||
|
*
|
||||||
|
* There are several mutexes that protect manipulation of devices and low-level
|
||||||
|
* structures like chunks but not block groups, extents or files
|
||||||
|
*
|
||||||
|
* uuid_mutex (global lock)
|
||||||
|
* ------------------------
|
||||||
|
* protects the fs_uuids list that tracks all per-fs fs_devices, resulting from
|
||||||
|
* the SCAN_DEV ioctl registration or from mount either implicitly (the first
|
||||||
|
* device) or requested by the device= mount option
|
||||||
|
*
|
||||||
|
* the mutex can be very coarse and can cover long-running operations
|
||||||
|
*
|
||||||
|
* protects: updates to fs_devices counters like missing devices, rw devices,
|
||||||
|
* seeding, structure cloning, openning/closing devices at mount/umount time
|
||||||
|
*
|
||||||
|
* global::fs_devs - add, remove, updates to the global list
|
||||||
|
*
|
||||||
|
* does not protect: manipulation of the fs_devices::devices list!
|
||||||
|
*
|
||||||
|
* btrfs_device::name - renames (write side), read is RCU
|
||||||
|
*
|
||||||
|
* fs_devices::device_list_mutex (per-fs, with RCU)
|
||||||
|
* ------------------------------------------------
|
||||||
|
* protects updates to fs_devices::devices, ie. adding and deleting
|
||||||
|
*
|
||||||
|
* simple list traversal with read-only actions can be done with RCU protection
|
||||||
|
*
|
||||||
|
* may be used to exclude some operations from running concurrently without any
|
||||||
|
* modifications to the list (see write_all_supers)
|
||||||
|
*
|
||||||
|
* volume_mutex
|
||||||
|
* ------------
|
||||||
|
* coarse lock owned by a mounted filesystem; used to exclude some operations
|
||||||
|
* that cannot run in parallel and affect the higher-level properties of the
|
||||||
|
* filesystem like: device add/deleting/resize/replace, or balance
|
||||||
|
*
|
||||||
|
* balance_mutex
|
||||||
|
* -------------
|
||||||
|
* protects balance structures (status, state) and context accessed from
|
||||||
|
* several places (internally, ioctl)
|
||||||
|
*
|
||||||
|
* chunk_mutex
|
||||||
|
* -----------
|
||||||
|
* protects chunks, adding or removing during allocation, trim or when a new
|
||||||
|
* device is added/removed
|
||||||
|
*
|
||||||
|
* cleaner_mutex
|
||||||
|
* -------------
|
||||||
|
* a big lock that is held by the cleaner thread and prevents running subvolume
|
||||||
|
* cleaning together with relocation or delayed iputs
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Lock nesting
|
||||||
|
* ============
|
||||||
|
*
|
||||||
|
* uuid_mutex
|
||||||
|
* volume_mutex
|
||||||
|
* device_list_mutex
|
||||||
|
* chunk_mutex
|
||||||
|
* balance_mutex
|
||||||
|
*/
|
||||||
|
|
||||||
DEFINE_MUTEX(uuid_mutex);
|
DEFINE_MUTEX(uuid_mutex);
|
||||||
static LIST_HEAD(fs_uuids);
|
static LIST_HEAD(fs_uuids);
|
||||||
struct list_head *btrfs_get_fs_uuids(void)
|
struct list_head *btrfs_get_fs_uuids(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user