summaryrefslogtreecommitdiff
path: root/linux/blkdev.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-06-18 18:33:25 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2022-06-18 18:33:25 -0400
commit03b8098d370c864422527024b24dd2c9339c74db (patch)
tree5f833e2b92aeb1f07215224a9c0bf33f2cf6a8ff /linux/blkdev.c
parenta232478f355c112c775c734182363f9e9b1688f8 (diff)
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>
Diffstat (limited to 'linux/blkdev.c')
-rw-r--r--linux/blkdev.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/linux/blkdev.c b/linux/blkdev.c
index 762e5aa0..b545e95d 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;