From ce2e46598ee546da919ca77d153f95bdfb8897d1 Mon Sep 17 00:00:00 2001 From: Christoph Hellwig Date: Wed, 26 Jan 2022 15:21:21 +0100 Subject: [PATCH] loop: only take lo_mutex for the last reference in lo_release lo_refcnt is only incremented in lo_open and decremented in lo_release, and thus protected by open_mutex. Only take lo_mutex when lo_release actually takes action for the final release. Signed-off-by: Christoph Hellwig --- drivers/block/loop.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index d3a7f281ce1b..43980ec69dfd 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1740,10 +1740,10 @@ static void lo_release(struct gendisk *disk, fmode_t mode) { struct loop_device *lo = disk->private_data; - mutex_lock(&lo->lo_mutex); - if (atomic_dec_return(&lo->lo_refcnt)) - goto out_unlock; + if (!atomic_dec_and_test(&lo->lo_refcnt)) + return; + mutex_lock(&lo->lo_mutex); if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) { if (lo->lo_state != Lo_bound) goto out_unlock; -- 2.50.1