mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-23 00:00:02 +03:00
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 <kent.overstreet@gmail.com>
This commit is contained in:
parent
a232478f35
commit
03b8098d37
@ -99,7 +99,7 @@ static void dump_one_device(struct bch_fs *c, struct bch_dev *ca, int fd,
|
|||||||
bch2_trans_exit(&trans);
|
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)));
|
max_t(unsigned, btree_bytes(c) / 8, block_bytes(c)));
|
||||||
darray_exit(&data);
|
darray_exit(&data);
|
||||||
}
|
}
|
||||||
|
@ -40,6 +40,7 @@ struct block_device {
|
|||||||
struct gendisk __bd_disk;
|
struct gendisk __bd_disk;
|
||||||
int bd_fd;
|
int bd_fd;
|
||||||
int bd_sync_fd;
|
int bd_sync_fd;
|
||||||
|
int bd_buffered_fd;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define bdev_kobj(_bdev) (&((_bdev)->kobj))
|
#define bdev_kobj(_bdev) (&((_bdev)->kobj))
|
||||||
|
@ -168,7 +168,7 @@ struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
|
|||||||
void *holder)
|
void *holder)
|
||||||
{
|
{
|
||||||
struct block_device *bdev;
|
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))
|
if ((mode & (FMODE_READ|FMODE_WRITE)) == (FMODE_READ|FMODE_WRITE))
|
||||||
flags = O_RDWR;
|
flags = O_RDWR;
|
||||||
@ -183,16 +183,12 @@ struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
|
|||||||
flags |= O_EXCL;
|
flags |= O_EXCL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
fd = open(path, flags);
|
fd = open(path, flags|O_DIRECT);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return ERR_PTR(-errno);
|
return ERR_PTR(-errno);
|
||||||
|
|
||||||
sync_fd = open(path, flags|O_SYNC);
|
sync_fd = xopen(path, flags|O_DIRECT|O_SYNC);
|
||||||
if (sync_fd < 0) {
|
buffered_fd = xopen(path, flags);
|
||||||
assert(0);
|
|
||||||
close(fd);
|
|
||||||
return ERR_PTR(-errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
bdev = malloc(sizeof(*bdev));
|
bdev = malloc(sizeof(*bdev));
|
||||||
memset(bdev, 0, 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_dev = xfstat(fd).st_rdev;
|
||||||
bdev->bd_fd = fd;
|
bdev->bd_fd = fd;
|
||||||
bdev->bd_sync_fd = sync_fd;
|
bdev->bd_sync_fd = sync_fd;
|
||||||
|
bdev->bd_buffered_fd = buffered_fd;
|
||||||
bdev->bd_holder = holder;
|
bdev->bd_holder = holder;
|
||||||
bdev->bd_disk = &bdev->__bd_disk;
|
bdev->bd_disk = &bdev->__bd_disk;
|
||||||
bdev->bd_disk->bdi = &bdev->bd_disk->__bdi;
|
bdev->bd_disk->bdi = &bdev->bd_disk->__bdi;
|
||||||
|
Loading…
Reference in New Issue
Block a user