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_open is
called the first time, as only for the first open there is any affect
on the driver state (incremental opens on partitions don't end up in
lo_open at all already).
Signed-off-by: Christoph Hellwig <hch@lst.de>
struct loop_device *lo = bdev->bd_disk->private_data;
int err;
+ if (atomic_inc_return(&lo->lo_refcnt) > 1)
+ return 0;
+
err = mutex_lock_killable(&lo->lo_mutex);
if (err)
return err;
- if (lo->lo_state == Lo_deleting)
+ if (lo->lo_state == Lo_deleting) {
+ atomic_dec(&lo->lo_refcnt);
err = -ENXIO;
- else
- atomic_inc(&lo->lo_refcnt);
+ }
mutex_unlock(&lo->lo_mutex);
return err;
}