zram: don't bother with reopening - just use O_EXCL for open
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 28 Apr 2024 22:55:47 +0000 (18:55 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 2 May 2024 21:39:26 +0000 (17:39 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
drivers/block/zram/zram_drv.c
drivers/block/zram/zram_drv.h

index f0639df6cd184a1ca0da9c6a12b92c61a06d62e9..58c3466dcb1789c7453e4f77ea2abcd68634e4f5 100644 (file)
@@ -426,11 +426,10 @@ static void reset_bdev(struct zram *zram)
        if (!zram->backing_dev)
                return;
 
-       fput(zram->bdev_file);
        /* hope filp_close flush all of IO */
        filp_close(zram->backing_dev, NULL);
        zram->backing_dev = NULL;
-       zram->bdev_file = NULL;
+       zram->bdev = NULL;
        zram->disk->fops = &zram_devops;
        kvfree(zram->bitmap);
        zram->bitmap = NULL;
@@ -473,10 +472,8 @@ static ssize_t backing_dev_store(struct device *dev,
        size_t sz;
        struct file *backing_dev = NULL;
        struct inode *inode;
-       struct address_space *mapping;
        unsigned int bitmap_sz;
        unsigned long nr_pages, *bitmap = NULL;
-       struct file *bdev_file = NULL;
        int err;
        struct zram *zram = dev_to_zram(dev);
 
@@ -497,15 +494,14 @@ static ssize_t backing_dev_store(struct device *dev,
        if (sz > 0 && file_name[sz - 1] == '\n')
                file_name[sz - 1] = 0x00;
 
-       backing_dev = filp_open(file_name, O_RDWR|O_LARGEFILE, 0);
+       backing_dev = filp_open(file_name, O_RDWR | O_LARGEFILE | O_EXCL, 0);
        if (IS_ERR(backing_dev)) {
                err = PTR_ERR(backing_dev);
                backing_dev = NULL;
                goto out;
        }
 
-       mapping = backing_dev->f_mapping;
-       inode = mapping->host;
+       inode = backing_dev->f_mapping->host;
 
        /* Support only block device in this moment */
        if (!S_ISBLK(inode->i_mode)) {
@@ -513,14 +509,6 @@ static ssize_t backing_dev_store(struct device *dev,
                goto out;
        }
 
-       bdev_file = bdev_file_open_by_dev(inode->i_rdev,
-                               BLK_OPEN_READ | BLK_OPEN_WRITE, zram, NULL);
-       if (IS_ERR(bdev_file)) {
-               err = PTR_ERR(bdev_file);
-               bdev_file = NULL;
-               goto out;
-       }
-
        nr_pages = i_size_read(inode) >> PAGE_SHIFT;
        bitmap_sz = BITS_TO_LONGS(nr_pages) * sizeof(long);
        bitmap = kvzalloc(bitmap_sz, GFP_KERNEL);
@@ -531,7 +519,7 @@ static ssize_t backing_dev_store(struct device *dev,
 
        reset_bdev(zram);
 
-       zram->bdev_file = bdev_file;
+       zram->bdev = I_BDEV(inode);
        zram->backing_dev = backing_dev;
        zram->bitmap = bitmap;
        zram->nr_pages = nr_pages;
@@ -544,9 +532,6 @@ static ssize_t backing_dev_store(struct device *dev,
 out:
        kvfree(bitmap);
 
-       if (bdev_file)
-               fput(bdev_file);
-
        if (backing_dev)
                filp_close(backing_dev, NULL);
 
@@ -587,7 +572,7 @@ static void read_from_bdev_async(struct zram *zram, struct page *page,
 {
        struct bio *bio;
 
-       bio = bio_alloc(file_bdev(zram->bdev_file), 1, parent->bi_opf, GFP_NOIO);
+       bio = bio_alloc(zram->bdev, 1, parent->bi_opf, GFP_NOIO);
        bio->bi_iter.bi_sector = entry * (PAGE_SIZE >> 9);
        __bio_add_page(bio, page, PAGE_SIZE, 0);
        bio_chain(bio, parent);
@@ -703,7 +688,7 @@ static ssize_t writeback_store(struct device *dev,
                        continue;
                }
 
-               bio_init(&bio, file_bdev(zram->bdev_file), &bio_vec, 1,
+               bio_init(&bio, zram->bdev, &bio_vec, 1,
                         REQ_OP_WRITE | REQ_SYNC);
                bio.bi_iter.bi_sector = blk_idx * (PAGE_SIZE >> 9);
                __bio_add_page(&bio, page, PAGE_SIZE, 0);
@@ -785,7 +770,7 @@ static void zram_sync_read(struct work_struct *work)
        struct bio_vec bv;
        struct bio bio;
 
-       bio_init(&bio, file_bdev(zw->zram->bdev_file), &bv, 1, REQ_OP_READ);
+       bio_init(&bio, zw->zram->bdev, &bv, 1, REQ_OP_READ);
        bio.bi_iter.bi_sector = zw->entry * (PAGE_SIZE >> 9);
        __bio_add_page(&bio, zw->page, PAGE_SIZE, 0);
        zw->error = submit_bio_wait(&bio);
index 37bf29f34d26f0c068bf29f7084bc87534416d8f..35e322144629224741c922618123ab5847023b79 100644 (file)
@@ -132,7 +132,7 @@ struct zram {
        spinlock_t wb_limit_lock;
        bool wb_limit_enable;
        u64 bd_wb_limit;
-       struct file *bdev_file;
+       struct block_device *bdev;
        unsigned long *bitmap;
        unsigned long nr_pages;
 #endif