]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
cmd_dump: Use buffered IO for reading device metadata
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 18 Jun 2022 22:33:25 +0000 (18:33 -0400)
committerKent Overstreet <kent.overstreet@gmail.com>
Sat, 18 Jun 2022 22:33:25 +0000 (18:33 -0400)
We're reading device metadat in mostly sequential order - buffered IO
will be faster than O_DIRECT.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
cmd_dump.c
include/linux/blk_types.h
linux/blkdev.c

index 895e0cd010bc1b8d9ecf970934c806f2057ce35c..39d28f2ace5eb10c618d12a572df661c91b52f08 100644 (file)
@@ -99,7 +99,7 @@ static void dump_one_device(struct bch_fs *c, struct bch_dev *ca, int fd,
                bch2_trans_exit(&trans);
        }
 
-       qcow2_write_image(ca->disk_sb.bdev->bd_fd, fd, &data,
+       qcow2_write_image(ca->disk_sb.bdev->bd_buffered_fd, fd, &data,
                          max_t(unsigned, btree_bytes(c) / 8, block_bytes(c)));
        darray_exit(&data);
 }
index 2d137e50d2103903500c65431268f6ed7996130b..22bae25fb3442c544eb56b94fa600c39f6df5373 100644 (file)
@@ -40,6 +40,7 @@ struct block_device {
        struct gendisk          __bd_disk;
        int                     bd_fd;
        int                     bd_sync_fd;
+       int                     bd_buffered_fd;
 };
 
 #define bdev_kobj(_bdev) (&((_bdev)->kobj))
index 762e5aa02a530e9a8b63e3da8da5227d87198f53..b545e95da8772dc1e0c7d69e20e32144b90b6976 100644 (file)
@@ -168,7 +168,7 @@ struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
                                        void *holder)
 {
        struct block_device *bdev;
-       int fd, sync_fd, flags = O_DIRECT;
+       int fd, sync_fd, buffered_fd, flags = 0;
 
        if ((mode & (FMODE_READ|FMODE_WRITE)) == (FMODE_READ|FMODE_WRITE))
                flags = O_RDWR;
@@ -183,16 +183,12 @@ struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
                flags |= O_EXCL;
 #endif
 
-       fd = open(path, flags);
+       fd = open(path, flags|O_DIRECT);
        if (fd < 0)
                return ERR_PTR(-errno);
 
-       sync_fd = open(path, flags|O_SYNC);
-       if (sync_fd < 0) {
-               assert(0);
-               close(fd);
-               return ERR_PTR(-errno);
-       }
+       sync_fd = xopen(path, flags|O_DIRECT|O_SYNC);
+       buffered_fd = xopen(path, flags);
 
        bdev = malloc(sizeof(*bdev));
        memset(bdev, 0, sizeof(*bdev));
@@ -203,6 +199,7 @@ struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
        bdev->bd_dev            = xfstat(fd).st_rdev;
        bdev->bd_fd             = fd;
        bdev->bd_sync_fd        = sync_fd;
+       bdev->bd_buffered_fd    = buffered_fd;
        bdev->bd_holder         = holder;
        bdev->bd_disk           = &bdev->__bd_disk;
        bdev->bd_disk->bdi      = &bdev->bd_disk->__bdi;