f3probe: rebrand --debug-block-order to --block-order

The new parameter allows users to test drives with
forced block sizes.

This parameter is only meant to help testing drives whose
*real* sizes are not multiples of their block sizes;
this should be rather rare!
This commit is contained in:
Michel Machado 2014-12-17 09:42:47 -05:00
parent 490bf780a3
commit d603f2e90a
4 changed files with 36 additions and 17 deletions

View File

@ -171,7 +171,7 @@ int main(void)
22, /* Wrap. */ 22, /* Wrap. */
9, /* Block order. */ 9, /* Block order. */
false) /* Keep file? */ false) /* Keep file? */
: create_block_device("/dev/sdc", false); : create_block_device("/dev/sdc", 0, RT_MANUAL_USB);
assert(dev); assert(dev);
write_and_read_blocks(dev, first_block, last_block); write_and_read_blocks(dev, first_block, last_block);

View File

@ -35,14 +35,14 @@ static struct argp_option options[] = {
"Fake size of the emulated drive", 0}, "Fake size of the emulated drive", 0},
{"debug-wrap", 'w', "N", OPTION_HIDDEN, {"debug-wrap", 'w', "N", OPTION_HIDDEN,
"Wrap parameter of the emulated drive", 0}, "Wrap parameter of the emulated drive", 0},
{"debug-block-order", 'b', "ORDER", OPTION_HIDDEN,
"Block size the emulated drive is 2^ORDER Byte", 0},
{"debug-keep-file", 'k', NULL, OPTION_HIDDEN, {"debug-keep-file", 'k', NULL, OPTION_HIDDEN,
"Don't remove file used for emulating the drive", 0}, "Don't remove file used for emulating the drive", 0},
{"debug-unit-test", 'u', NULL, OPTION_HIDDEN, {"debug-unit-test", 'u', NULL, OPTION_HIDDEN,
"Run a unit test; it ignores all other debug options", 0}, "Run a unit test; it ignores all other debug options", 0},
{"block-order", 'b', "ORDER", 0,
"Force block size of the drive to 2^ORDER Bytes", 2},
{"destructive", 'n', NULL, 0, {"destructive", 'n', NULL, 0,
"Do not restore blocks of the device after probing it", 2}, "Do not restore blocks of the device after probing it", 0},
{"min-memory", 'l', NULL, 0, {"min-memory", 'l', NULL, 0,
"Trade speed for less use of memory", 0}, "Trade speed for less use of memory", 0},
{"reset-type", 's', "TYPE", 0, {"reset-type", 's', "TYPE", 0,
@ -159,9 +159,9 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state)
case 'b': case 'b':
ll = arg_to_long_long(state, arg); ll = arg_to_long_long(state, arg);
if (ll < 9 || ll > 20) if (ll != 0 && (ll < 9 || ll > 20))
argp_error(state, argp_error(state,
"Block order must be in the interval [9, 20]"); "Block order must be in the interval [9, 20] or be zero");
args->block_order = ll; args->block_order = ll;
args->debug = true; args->debug = true;
break; break;
@ -367,7 +367,8 @@ static int test_device(struct args *args)
? create_file_device(args->filename, args->real_size_byte, ? create_file_device(args->filename, args->real_size_byte,
args->fake_size_byte, args->wrap, args->block_order, args->fake_size_byte, args->wrap, args->block_order,
args->keep_file) args->keep_file)
: create_block_device(args->filename, args->reset_type); : create_block_device(args->filename, args->block_order,
args->reset_type);
if (!dev) { if (!dev) {
fprintf(stderr, "\nApplication cannot continue, finishing...\n"); fprintf(stderr, "\nApplication cannot continue, finishing...\n");
exit(1); exit(1);
@ -480,7 +481,7 @@ int main(int argc, char **argv)
.real_size_byte = 1ULL << 31, .real_size_byte = 1ULL << 31,
.fake_size_byte = 1ULL << 34, .fake_size_byte = 1ULL << 34,
.wrap = 31, .wrap = 31,
.block_order = 9, .block_order = 0,
}; };
/* Read parameters. */ /* Read parameters. */

View File

@ -232,9 +232,6 @@ struct device *create_file_device(const char *filename,
{ {
struct file_device *fdev; struct file_device *fdev;
if (!dev_param_valid(real_size_byte, fake_size_byte, wrap, block_order))
goto error;
fdev = malloc(sizeof(*fdev)); fdev = malloc(sizeof(*fdev));
if (!fdev) if (!fdev)
goto error; goto error;
@ -251,6 +248,18 @@ struct device *create_file_device(const char *filename,
assert(!unlink(filename)); assert(!unlink(filename));
} }
if (!block_order) {
struct stat fd_stat;
blksize_t block_size;
assert(!fstat(fdev->fd, &fd_stat));
block_size = fd_stat.st_blksize;
block_order = ilog2(block_size);
assert(block_size == (1 << block_order));
}
if (!dev_param_valid(real_size_byte, fake_size_byte, wrap, block_order))
goto keep_file;
fdev->real_size_byte = real_size_byte; fdev->real_size_byte = real_size_byte;
fdev->address_mask = (((uint64_t)1) << wrap) - 1; fdev->address_mask = (((uint64_t)1) << wrap) - 1;
@ -263,6 +272,10 @@ struct device *create_file_device(const char *filename,
return &fdev->dev; return &fdev->dev;
keep_file:
if (keep_file)
unlink(filename);
assert(!close(fdev->fd));
fdev: fdev:
free(fdev); free(fdev);
error: error:
@ -562,13 +575,13 @@ static struct udev_device *map_partition_to_disk(struct udev_device *dev)
return udev_device_ref(disk_dev); return udev_device_ref(disk_dev);
} }
struct device *create_block_device(const char *filename, enum reset_type rt) struct device *create_block_device(const char *filename, int block_order,
enum reset_type rt)
{ {
struct block_device *bdev; struct block_device *bdev;
struct udev *udev; struct udev *udev;
struct udev_device *fd_dev, *usb_dev; struct udev_device *fd_dev, *usb_dev;
const char *s; const char *s;
int block_size;
bdev = malloc(sizeof(*bdev)); bdev = malloc(sizeof(*bdev));
if (!bdev) if (!bdev)
@ -648,9 +661,13 @@ struct device *create_block_device(const char *filename, enum reset_type rt)
assert(!ioctl(bdev->fd, BLKGETSIZE64, &bdev->dev.size_byte)); assert(!ioctl(bdev->fd, BLKGETSIZE64, &bdev->dev.size_byte));
assert(!ioctl(bdev->fd, BLKBSZGET, &block_size)); if (!block_order) {
bdev->dev.block_order = ilog2(block_size); int block_size;
assert(block_size == (1 << bdev->dev.block_order)); assert(!ioctl(bdev->fd, BLKBSZGET, &block_size));
block_order = ilog2(block_size);
assert(block_size == (1 << block_order));
}
bdev->dev.block_order = block_order;
bdev->dev.read_block = bdev_read_block; bdev->dev.read_block = bdev_read_block;
bdev->dev.write_block = bdev_write_block; bdev->dev.write_block = bdev_write_block;

View File

@ -74,7 +74,8 @@ enum reset_type {
}; };
#define RT_DEFAULT RT_MANUAL_USB #define RT_DEFAULT RT_MANUAL_USB
struct device *create_block_device(const char *filename, enum reset_type rt); struct device *create_block_device(const char *filename, int block_order,
enum reset_type rt);
struct device *create_perf_device(struct device *dev); struct device *create_perf_device(struct device *dev);
void perf_device_sample(struct device *dev, void perf_device_sample(struct device *dev,