Re: [Regression] [Bisected] Errors when ejecting USB storage drives since v5.10

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

 



On 2/22/21 5:44 AM, Christoph Hellwig wrote:

> Ok, let's try something else entirely, which restores the full revalidation
> that BLKRRPART previously caused by accident:
>
> diff --git a/block/ioctl.c b/block/ioctl.c
> index d61d652078f41c..06b2ecdce593c6 100644
> --- a/block/ioctl.c
> +++ b/block/ioctl.c
> @@ -81,20 +81,25 @@ static int compat_blkpg_ioctl(struct block_device *bdev,
>  }
>  #endif
>  
> -static int blkdev_reread_part(struct block_device *bdev)
> +static int blkdev_reread_part(struct block_device *bdev, fmode_t mode)
>  {
> -	int ret;
> +	struct block_device *tmp;
>  
>  	if (!disk_part_scan_enabled(bdev->bd_disk) || bdev_is_partition(bdev))
>  		return -EINVAL;
>  	if (!capable(CAP_SYS_ADMIN))
>  		return -EACCES;
>  
> -	mutex_lock(&bdev->bd_mutex);
> -	ret = bdev_disk_changed(bdev, false);
> -	mutex_unlock(&bdev->bd_mutex);
> -
> -	return ret;
> +	/*
> +	 * Reopen the device to revalidate the driver state and force a
> +	 * partition rescan.
> +	 */
> +	set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state);
> +	tmp = blkdev_get_by_dev(bdev->bd_dev, mode, NULL);
> +	if (IS_ERR(tmp))
> +		return PTR_ERR(tmp);
> +	blkdev_put(tmp, mode);
> +	return 0;
>  }
>  
>  static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode,
> @@ -498,7 +503,7 @@ static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode,
>  		bdev->bd_bdi->ra_pages = (arg * 512) / PAGE_SIZE;
>  		return 0;
>  	case BLKRRPART:
> -		return blkdev_reread_part(bdev);
> +		return blkdev_reread_part(bdev, mode & ~FMODE_EXCL);
>  	case BLKTRACESTART:
>  	case BLKTRACESTOP:
>  	case BLKTRACETEARDOWN:
I can confirm the above patch results in my USB drives being unmounted cleanly
and there are no errors in dmesg afterwards. One minor nit I have noticed is
that after ejecting the device, the kernel still reports:

"sde: detected capacity change from 0 to 62333952"

This appears to be reversed from what was previously reported by the kernel in
v5.9 and earlier. I would expect that after ejection it would report:

"sde: detected capacity change from 62333952 to 0"

This appears to be purely cosmetic and it is not something your above patch
introduced so you can add Tested-by: Tom Seewald <tseewald@xxxxxxxxx> if you
wish. Thank you again for your help.



[Index of Archives]     [Linux RAID]     [Linux SCSI]     [Linux ATA RAID]     [IDE]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Device Mapper]

  Powered by Linux