@@ -473,11 +473,14 @@ static int compat_hdio_getgeo(struct block_device *bdev,
473473#endif
474474
475475/* set the logical block size */
476- static int blkdev_bszset (struct block_device * bdev , blk_mode_t mode ,
476+ static int blkdev_bszset (struct file * file , blk_mode_t mode ,
477477 int __user * argp )
478478{
479+ // this one might be file_inode(file)->i_rdev - a rare valid
480+ // use of file_inode() for those.
481+ dev_t dev = I_BDEV (file -> f_mapping -> host )-> bd_dev ;
482+ struct file * excl_file ;
479483 int ret , n ;
480- struct file * file ;
481484
482485 if (!capable (CAP_SYS_ADMIN ))
483486 return - EACCES ;
@@ -487,13 +490,13 @@ static int blkdev_bszset(struct block_device *bdev, blk_mode_t mode,
487490 return - EFAULT ;
488491
489492 if (mode & BLK_OPEN_EXCL )
490- return set_blocksize (bdev , n );
493+ return set_blocksize (file , n );
491494
492- file = bdev_file_open_by_dev (bdev -> bd_dev , mode , & bdev , NULL );
493- if (IS_ERR (file ))
495+ excl_file = bdev_file_open_by_dev (dev , mode , & dev , NULL );
496+ if (IS_ERR (excl_file ))
494497 return - EBUSY ;
495- ret = set_blocksize (bdev , n );
496- fput (file );
498+ ret = set_blocksize (excl_file , n );
499+ fput (excl_file );
497500 return ret ;
498501}
499502
@@ -621,7 +624,7 @@ long blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
621624 case BLKBSZGET : /* get block device soft block size (cf. BLKSSZGET) */
622625 return put_int (argp , block_size (bdev ));
623626 case BLKBSZSET :
624- return blkdev_bszset (bdev , mode , argp );
627+ return blkdev_bszset (file , mode , argp );
625628 case BLKGETSIZE64 :
626629 return put_u64 (argp , bdev_nr_bytes (bdev ));
627630
@@ -681,7 +684,7 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
681684 case BLKBSZGET_32 : /* get the logical block size (cf. BLKSSZGET) */
682685 return put_int (argp , bdev_logical_block_size (bdev ));
683686 case BLKBSZSET_32 :
684- return blkdev_bszset (bdev , mode , argp );
687+ return blkdev_bszset (file , mode , argp );
685688 case BLKGETSIZE64_32 :
686689 return put_u64 (argp , bdev_nr_bytes (bdev ));
687690
0 commit comments