Flush device caches in buffered util cmds

Add calls to our new device cache flushing helper in commands that use
buffered reads.

Signed-off-by: Zach Brown <zab@versity.com>
This commit is contained in:
Zach Brown
2023-01-18 10:44:14 -08:00
parent ddb5cce2a5
commit 3363b4fb79
3 changed files with 40 additions and 24 deletions

View File

@@ -623,11 +623,9 @@ space of the volume making the output much more useful for inspection.
.TP .TP
.B "META-DEVICE" .B "META-DEVICE"
The path to the metadata device for the filesystem whose metadata will be The path to the metadata device for the filesystem whose metadata will be
printed. Since this command reads via the host's buffer cache, it may not printed. An attempt will be made to flush the host's buffer cache for
reflect the current blocks in the filesystem possibly written to the shared this device with the BLKFLSBUF ioctl, or with posix_fadvise() if
block devices from another host, unless the path refers to a regular file.
.B blockdev \--flushbufs
command is used first.
.RE .RE
.PD .PD

View File

@@ -118,6 +118,33 @@ struct mkfs_args {
struct scoutfs_quorum_slot slots[SCOUTFS_QUORUM_MAX_SLOTS]; struct scoutfs_quorum_slot slots[SCOUTFS_QUORUM_MAX_SLOTS];
}; };
static int open_mkfs_dev(struct mkfs_args *args, char *path, mode_t mode, char *which)
{
int ret;
int fd = -1;
fd = open(path, mode);
if (fd < 0) {
ret = -errno;
fprintf(stderr, "failed to open %s dev '%s': %s (%d)\n",
which, path, strerror(errno), errno);
goto out;
}
ret = flush_device(fd);
if (ret < 0)
goto out;
if (!args->force)
ret = check_bdev(fd, path, which);
out:
if (ret < 0 && fd >= 0)
close(fd);
return ret ?: fd;
}
/* /*
* Make a new file system by writing: * Make a new file system by writing:
* - super blocks * - super blocks
@@ -156,32 +183,17 @@ static int do_mkfs(struct mkfs_args *args)
gettimeofday(&tv, NULL); gettimeofday(&tv, NULL);
pseudo_random_bytes(&fsid, sizeof(fsid)); pseudo_random_bytes(&fsid, sizeof(fsid));
meta_fd = open(args->meta_device, O_RDWR | O_EXCL); meta_fd = open_mkfs_dev(args, args->meta_device, O_RDWR | O_EXCL, "meta");
if (meta_fd < 0) { if (meta_fd < 0) {
ret = -errno; ret = meta_fd;
fprintf(stderr, "failed to open '%s': %s (%d)\n",
args->meta_device, strerror(errno), errno);
goto out; goto out;
} }
if (!args->force) {
ret = check_bdev(meta_fd, args->meta_device, "meta");
if (ret)
return ret;
}
data_fd = open(args->data_device, O_RDWR | O_EXCL); data_fd = open_mkfs_dev(args, args->data_device, O_RDWR | O_EXCL, "data");
if (data_fd < 0) { if (data_fd < 0) {
ret = -errno; ret = data_fd;
fprintf(stderr, "failed to open '%s': %s (%d)\n",
args->data_device, strerror(errno), errno);
goto out; goto out;
} }
if (!args->force) {
ret = check_bdev(data_fd, args->data_device, "data");
if (ret)
return ret;
}
super = calloc(1, SCOUTFS_BLOCK_SM_SIZE); super = calloc(1, SCOUTFS_BLOCK_SM_SIZE);
bt = calloc(1, SCOUTFS_BLOCK_LG_SIZE); bt = calloc(1, SCOUTFS_BLOCK_LG_SIZE);

View File

@@ -27,6 +27,7 @@
#include "avl.h" #include "avl.h"
#include "srch.h" #include "srch.h"
#include "leaf_item_hash.h" #include "leaf_item_hash.h"
#include "dev.h"
static void print_block_header(struct scoutfs_block_header *hdr, int size) static void print_block_header(struct scoutfs_block_header *hdr, int size)
{ {
@@ -1107,7 +1108,12 @@ static int do_print(struct print_args *args)
return ret; return ret;
} }
ret = flush_device(fd);
if (ret < 0)
goto out;
ret = print_volume(fd, args); ret = print_volume(fd, args);
out:
close(fd); close(fd);
return ret; return ret;
}; };