block: mark bdev files as FMODE_NOWAIT if underlying device supports it
authorJens Axboe <axboe@kernel.dk>
Tue, 9 May 2023 15:19:09 +0000 (09:19 -0600)
committerJens Axboe <axboe@kernel.dk>
Mon, 15 May 2023 16:12:27 +0000 (10:12 -0600)
We set this unconditionally, but it really should be dependent on if
the underlying device is nowait compliant.

Cc: linux-block@vger.kernel.org
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20230509151910.183637-3-axboe@kernel.dk
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/fops.c

index d2e6be4e3d1c7da029d0a38bd18cf9b069f901e2..ab750e8a040f7dbd8a0fd5df55370a4079efa772 100644 (file)
@@ -481,7 +481,7 @@ static int blkdev_open(struct inode *inode, struct file *filp)
         * during an unstable branch.
         */
        filp->f_flags |= O_LARGEFILE;
-       filp->f_mode |= FMODE_NOWAIT | FMODE_BUF_RASYNC;
+       filp->f_mode |= FMODE_BUF_RASYNC;
 
        if (filp->f_flags & O_NDELAY)
                filp->f_mode |= FMODE_NDELAY;
@@ -494,6 +494,9 @@ static int blkdev_open(struct inode *inode, struct file *filp)
        if (IS_ERR(bdev))
                return PTR_ERR(bdev);
 
+       if (bdev_nowait(bdev))
+               filp->f_mode |= FMODE_NOWAIT;
+
        filp->private_data = bdev;
        filp->f_mapping = bdev->bd_inode->i_mapping;
        filp->f_wb_err = filemap_sample_wb_err(filp->f_mapping);