From: Kent Overstreet Date: Sat, 18 Jun 2022 22:33:25 +0000 (-0400) Subject: cmd_dump: Use buffered IO for reading device metadata X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=03b8098d370c864422527024b24dd2c9339c74db;p=bcachefs-tools-debian cmd_dump: Use buffered IO for reading device metadata We're reading device metadat in mostly sequential order - buffered IO will be faster than O_DIRECT. Signed-off-by: Kent Overstreet --- diff --git a/cmd_dump.c b/cmd_dump.c index 895e0cd..39d28f2 100644 --- a/cmd_dump.c +++ b/cmd_dump.c @@ -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); } diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h index 2d137e5..22bae25 100644 --- a/include/linux/blk_types.h +++ b/include/linux/blk_types.h @@ -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)) diff --git a/linux/blkdev.c b/linux/blkdev.c index 762e5aa..b545e95 100644 --- a/linux/blkdev.c +++ b/linux/blkdev.c @@ -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;