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,
|
||||
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);
|
||||
static LIST_HEAD(fs_uuids);
|
||||
struct list_head *btrfs_get_fs_uuids(void)
|
||||
|
|
Loading…
Reference in New Issue