@@ -478,7 +478,7 @@ blk_mode_t file_to_blk_mode(struct file *file)
478
478
mode |= BLK_OPEN_READ ;
479
479
if (file -> f_mode & FMODE_WRITE )
480
480
mode |= BLK_OPEN_WRITE ;
481
- if (file -> f_mode & FMODE_EXCL )
481
+ if (file -> private_data )
482
482
mode |= BLK_OPEN_EXCL ;
483
483
if (file -> f_flags & O_NDELAY )
484
484
mode |= BLK_OPEN_NDELAY ;
@@ -507,12 +507,15 @@ static int blkdev_open(struct inode *inode, struct file *filp)
507
507
filp -> f_flags |= O_LARGEFILE ;
508
508
filp -> f_mode |= FMODE_NOWAIT | FMODE_BUF_RASYNC ;
509
509
510
+ /*
511
+ * Use the file private data to store the holder for exclusive openes.
512
+ * file_to_blk_mode relies on it being present to set BLK_OPEN_EXCL.
513
+ */
510
514
if (filp -> f_flags & O_EXCL )
511
- filp -> f_mode |= FMODE_EXCL ;
515
+ filp -> private_data = filp ;
512
516
513
517
bdev = blkdev_get_by_dev (inode -> i_rdev , file_to_blk_mode (filp ),
514
- (filp -> f_mode & FMODE_EXCL ) ? filp : NULL ,
515
- NULL );
518
+ filp -> private_data , NULL );
516
519
if (IS_ERR (bdev ))
517
520
return PTR_ERR (bdev );
518
521
@@ -523,8 +526,7 @@ static int blkdev_open(struct inode *inode, struct file *filp)
523
526
524
527
static int blkdev_release (struct inode * inode , struct file * filp )
525
528
{
526
- blkdev_put (I_BDEV (filp -> f_mapping -> host ),
527
- (filp -> f_mode & FMODE_EXCL ) ? filp : NULL );
529
+ blkdev_put (I_BDEV (filp -> f_mapping -> host ), filp -> private_data );
528
530
return 0 ;
529
531
}
530
532
0 commit comments