mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-14 15:54:15 +08:00
btrfs: introduce try-lock semantics for exclusive op start
Add try-lock for exclusive operation start to allow callers to do more checks. The same operation must already be running. The try-lock and unlock must pair and are a substitute for btrfs_exclop_start, thus it must also pair with btrfs_exclop_finish to release the exclop context. Reviewed-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
907d2710d7
commit
578bda9e17
@ -3233,6 +3233,9 @@ void btrfs_update_ioctl_balance_args(struct btrfs_fs_info *fs_info,
|
||||
struct btrfs_ioctl_balance_args *bargs);
|
||||
bool btrfs_exclop_start(struct btrfs_fs_info *fs_info,
|
||||
enum btrfs_exclusive_operation type);
|
||||
bool btrfs_exclop_start_try_lock(struct btrfs_fs_info *fs_info,
|
||||
enum btrfs_exclusive_operation type);
|
||||
void btrfs_exclop_start_unlock(struct btrfs_fs_info *fs_info);
|
||||
void btrfs_exclop_finish(struct btrfs_fs_info *fs_info);
|
||||
|
||||
/* file.c */
|
||||
|
@ -371,6 +371,32 @@ bool btrfs_exclop_start(struct btrfs_fs_info *fs_info,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Conditionally allow to enter the exclusive operation in case it's compatible
|
||||
* with the running one. This must be paired with btrfs_exclop_start_unlock and
|
||||
* btrfs_exclop_finish.
|
||||
*
|
||||
* Compatibility:
|
||||
* - the same type is already running
|
||||
* - not BTRFS_EXCLOP_NONE - this is intentionally incompatible and the caller
|
||||
* must check the condition first that would allow none -> @type
|
||||
*/
|
||||
bool btrfs_exclop_start_try_lock(struct btrfs_fs_info *fs_info,
|
||||
enum btrfs_exclusive_operation type)
|
||||
{
|
||||
spin_lock(&fs_info->super_lock);
|
||||
if (fs_info->exclusive_operation == type)
|
||||
return true;
|
||||
|
||||
spin_unlock(&fs_info->super_lock);
|
||||
return false;
|
||||
}
|
||||
|
||||
void btrfs_exclop_start_unlock(struct btrfs_fs_info *fs_info)
|
||||
{
|
||||
spin_unlock(&fs_info->super_lock);
|
||||
}
|
||||
|
||||
void btrfs_exclop_finish(struct btrfs_fs_info *fs_info)
|
||||
{
|
||||
spin_lock(&fs_info->super_lock);
|
||||
|
Loading…
Reference in New Issue
Block a user