Patch "btrfs: return accurate error code on open failure in open_fs_devices()" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    btrfs: return accurate error code on open failure in open_fs_devices()

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     btrfs-return-accurate-error-code-on-open-failure-in-.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 58bb56f574a7c067773f70cc4de815e8b38fca52
Author: Anand Jain <anand.jain@xxxxxxxxxx>
Date:   Tue Mar 19 08:28:18 2024 +0530

    btrfs: return accurate error code on open failure in open_fs_devices()
    
    [ Upstream commit 2f1aeab9fca1a5f583be1add175d1ee95c213cfa ]
    
    When attempting to exclusive open a device which has no exclusive open
    permission, such as a physical device associated with the flakey dm
    device, the open operation will fail, resulting in a mount failure.
    
    In this particular scenario, we erroneously return -EINVAL instead of the
    correct error code provided by the bdev_open_by_path() function, which is
    -EBUSY.
    
    Fix this, by returning error code from the bdev_open_by_path() function.
    With this correction, the mount error message will align with that of
    ext4 and xfs.
    
    Reviewed-by: Boris Burkov <boris@xxxxxx>
    Signed-off-by: Anand Jain <anand.jain@xxxxxxxxxx>
    Reviewed-by: David Sterba <dsterba@xxxxxxxx>
    Signed-off-by: David Sterba <dsterba@xxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 453d037987fb3..d0bbb05d4c081 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -1224,23 +1224,30 @@ static int open_fs_devices(struct btrfs_fs_devices *fs_devices,
 	struct btrfs_device *device;
 	struct btrfs_device *latest_dev = NULL;
 	struct btrfs_device *tmp_device;
+	int ret = 0;
 
 	list_for_each_entry_safe(device, tmp_device, &fs_devices->devices,
 				 dev_list) {
-		int ret;
+		int ret2;
 
-		ret = btrfs_open_one_device(fs_devices, device, flags, holder);
-		if (ret == 0 &&
+		ret2 = btrfs_open_one_device(fs_devices, device, flags, holder);
+		if (ret2 == 0 &&
 		    (!latest_dev || device->generation > latest_dev->generation)) {
 			latest_dev = device;
-		} else if (ret == -ENODATA) {
+		} else if (ret2 == -ENODATA) {
 			fs_devices->num_devices--;
 			list_del(&device->dev_list);
 			btrfs_free_device(device);
 		}
+		if (ret == 0 && ret2 != 0)
+			ret = ret2;
 	}
-	if (fs_devices->open_devices == 0)
+
+	if (fs_devices->open_devices == 0) {
+		if (ret)
+			return ret;
 		return -EINVAL;
+	}
 
 	fs_devices->opened = 1;
 	fs_devices->latest_dev = latest_dev;




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux