block: move sync_blockdev from __blkdev_put to blkdev_put
authorChristoph Hellwig <hch@lst.de>
Tue, 25 May 2021 06:12:55 +0000 (08:12 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 1 Jun 2021 13:43:32 +0000 (07:43 -0600)
Do the early unlocked syncing even earlier to move more code out of
the recursive path.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Link: https://lore.kernel.org/r/20210525061301.2242282-3-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/block_dev.c

index 2b5073e3c92361f265d908298be2caa1f692eaff..41d2d9708bf864b690d251405fdcd610e26d558a 100644 (file)
@@ -1552,16 +1552,6 @@ static void __blkdev_put(struct block_device *bdev, fmode_t mode, int for_part)
        struct gendisk *disk = bdev->bd_disk;
        struct block_device *victim = NULL;
 
-       /*
-        * Sync early if it looks like we're the last one.  If someone else
-        * opens the block device between now and the decrement of bd_openers
-        * then we did a sync that we didn't need to, but that's not the end
-        * of the world and we want to avoid long (could be several minute)
-        * syncs while holding the mutex.
-        */
-       if (bdev->bd_openers == 1)
-               sync_blockdev(bdev);
-
        mutex_lock_nested(&bdev->bd_mutex, for_part);
        if (for_part)
                bdev->bd_part_count--;
@@ -1588,6 +1578,16 @@ void blkdev_put(struct block_device *bdev, fmode_t mode)
 {
        struct gendisk *disk = bdev->bd_disk;
 
+       /*
+        * Sync early if it looks like we're the last one.  If someone else
+        * opens the block device between now and the decrement of bd_openers
+        * then we did a sync that we didn't need to, but that's not the end
+        * of the world and we want to avoid long (could be several minute)
+        * syncs while holding the mutex.
+        */
+       if (bdev->bd_openers == 1)
+               sync_blockdev(bdev);
+
        mutex_lock(&bdev->bd_mutex);
 
        if (mode & FMODE_EXCL) {