Annotate all functions that are called with lo_mutex held with __must_hold(&lo->lo_mutex). Add a 'lo' argument to loop_validate_file() such that a __must_hold(&lo->lo_mutex) annotation can be added to this function too. Signed-off-by: Bart Van Assche --- drivers/block/loop.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 5c7f72e01345..aa40a6ed7f35 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -145,6 +145,7 @@ static int max_part; static int part_shift; static loff_t lo_calculate_size(struct loop_device *lo, struct file *file) + __must_hold(&lo->lo_mutex) { loff_t loopsize; int ret; @@ -186,6 +187,7 @@ static loff_t lo_calculate_size(struct loop_device *lo, struct file *file) * the backing device. */ static bool lo_can_use_dio(struct loop_device *lo) + __must_hold(&lo->lo_mutex) { if (!(lo->lo_backing_file->f_mode & FMODE_CAN_ODIRECT)) return false; @@ -205,6 +207,7 @@ static bool lo_can_use_dio(struct loop_device *lo) * not the originally passed in one. */ static inline void loop_update_dio(struct loop_device *lo) + __must_hold(&lo->lo_mutex) { lockdep_assert_held(&lo->lo_mutex); WARN_ON_ONCE(lo->lo_state == Lo_bound && @@ -223,6 +226,7 @@ static inline void loop_update_dio(struct loop_device *lo) * a sector_t, eg using loop_validate_size() */ static void loop_set_size(struct loop_device *lo, loff_t size) + __must_hold(&lo->lo_mutex) { if (!set_capacity_and_notify(lo->lo_disk, size)) kobject_uevent(&disk_to_dev(lo->lo_disk)->kobj, KOBJ_CHANGE); @@ -455,6 +459,7 @@ static void loop_reread_partitions(struct loop_device *lo) } static void loop_update_dio_alignment(struct loop_device *lo) + __must_hold(&lo->lo_mutex) { struct file *file = lo->lo_backing_file; struct block_device *sb_bdev = file->f_mapping->host->i_sb->s_bdev; @@ -507,7 +512,9 @@ static inline bool is_loop_device(struct file *file) } /* Returns 0 if and only if @file is not backed by loop device @bdev. */ -static int loop_validate_file(struct file *file, struct block_device *bdev) +static int loop_validate_file(struct loop_device *lo, struct file *file, + struct block_device *bdev) + __must_hold(&lo->lo_mutex) { struct inode *inode = file->f_mapping->host; struct file *f = file; @@ -535,6 +542,7 @@ static int loop_validate_file(struct file *file, struct block_device *bdev) } static void loop_assign_backing_file(struct loop_device *lo, struct file *file) + __must_hold(&lo->lo_mutex) { lo->lo_backing_file = file; lo->old_gfp_mask = mapping_gfp_mask(file->f_mapping); @@ -599,7 +607,7 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, if (!(lo->lo_flags & LO_FLAGS_READ_ONLY)) goto out_err; - error = loop_validate_file(file, bdev); + error = loop_validate_file(lo, file, bdev); if (error) goto out_err; @@ -770,6 +778,7 @@ static void loop_sysfs_exit(struct loop_device *lo) static void loop_get_discard_config(struct loop_device *lo, u32 *granularity, u32 *max_discard_sectors) + __must_hold(&lo->lo_mutex) { struct file *file = lo->lo_backing_file; struct inode *inode = file->f_mapping->host; @@ -936,6 +945,7 @@ static void loop_free_idle_workers_timer(struct timer_list *timer) static int loop_set_status_from_info(struct loop_device *lo, const struct loop_info64 *info) + __must_hold(&lo->lo_mutex) { if ((unsigned int) info->lo_encrypt_key_size > LO_KEY_SIZE) return -EINVAL; @@ -974,6 +984,7 @@ static unsigned int loop_default_blocksize(struct loop_device *lo) } static void loop_set_dma_limit(struct loop_device *lo, struct queue_limits *lim) + __must_hold(&lo->lo_mutex) { /* * Direct I/O forwards the user pages to the backing file unchanged, so @@ -988,6 +999,7 @@ static void loop_set_dma_limit(struct loop_device *lo, struct queue_limits *lim) static void loop_update_limits(struct loop_device *lo, struct queue_limits *lim, unsigned int bsize) + __must_hold(&lo->lo_mutex) { struct file *file = lo->lo_backing_file; struct inode *inode = file->f_mapping->host; @@ -1064,7 +1076,7 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, if (lo->lo_state != Lo_unbound) goto out_unlock; - error = loop_validate_file(file, bdev); + error = loop_validate_file(lo, file, bdev); if (error) goto out_unlock; @@ -1443,6 +1455,7 @@ loop_get_status64(struct loop_device *lo, struct loop_info64 __user *arg) { } static int loop_set_capacity(struct loop_device *lo) + __must_hold(&lo->lo_mutex) { loff_t size; @@ -1456,6 +1469,7 @@ static int loop_set_capacity(struct loop_device *lo) } static int loop_set_dio(struct loop_device *lo, unsigned long arg) + __must_hold(&lo->lo_mutex) { bool use_dio = !!arg; unsigned int memflags;