btrfs-progs: inspect: add command min-dev-size
Previously in 'filesystem resize get_min_size', now 'inspect-internal min-dev-size'. We'd like to avoid cluttering the 'resize' syntax further. The test has been updated to exercise the new option. Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
934dd0e1f7
commit
5b1c5b8878
|
@ -93,7 +93,7 @@ If a newlabel optional argument is passed, the label is changed.
|
||||||
NOTE: the maximum allowable length shall be less than 256 chars
|
NOTE: the maximum allowable length shall be less than 256 chars
|
||||||
|
|
||||||
// Some wording are extracted by the resize2fs man page
|
// Some wording are extracted by the resize2fs man page
|
||||||
*resize* [<devid>:][+/-]<size>[kKmMgGtTpPeE]|[<devid>:]max|[<devid>:]get_min_size <path>::
|
*resize* [<devid>:][+/-]<size>[kKmMgGtTpPeE]|[<devid>:]max <path>::
|
||||||
Resize a mounted filesystem identified by directory <path>. A particular device
|
Resize a mounted filesystem identified by directory <path>. A particular device
|
||||||
can be resized by specifying a <devid>.
|
can be resized by specifying a <devid>.
|
||||||
+
|
+
|
||||||
|
@ -113,8 +113,6 @@ KiB, MiB, GiB, TiB, PiB, or EiB, respectively. Case does not matter.
|
||||||
+
|
+
|
||||||
If \'max' is passed, the filesystem will occupy all available space on the
|
If \'max' is passed, the filesystem will occupy all available space on the
|
||||||
device devid.
|
device devid.
|
||||||
If \'get_min_size' is passed, return the minimum size the device can be
|
|
||||||
shrunk to, without performing any resize operation.
|
|
||||||
+
|
+
|
||||||
The resize command does not manipulate the size of underlying
|
The resize command does not manipulate the size of underlying
|
||||||
partition. If you wish to enlarge/reduce a filesystem, you must make sure you
|
partition. If you wish to enlarge/reduce a filesystem, you must make sure you
|
||||||
|
|
|
@ -41,6 +41,15 @@ set inode container's size.
|
||||||
This is used to increase inode container's size in case it is
|
This is used to increase inode container's size in case it is
|
||||||
not enough to read all the resolved results. The max value one can set is 64k.
|
not enough to read all the resolved results. The max value one can set is 64k.
|
||||||
|
|
||||||
|
*min-dev-size* [options] <path>::
|
||||||
|
Return the minimum size the device can be shrunk to, without performing any
|
||||||
|
resize operation.
|
||||||
|
+
|
||||||
|
`Options`
|
||||||
|
+
|
||||||
|
--id::::
|
||||||
|
specify the device id to query, default is 1
|
||||||
|
|
||||||
*rootid* <path>::
|
*rootid* <path>::
|
||||||
For a given file or directory, return the containing tree root id. For a
|
For a given file or directory, return the containing tree root id. For a
|
||||||
subvolume return it's own tree id.
|
subvolume return it's own tree id.
|
||||||
|
|
|
@ -36,7 +36,7 @@ _btrfs()
|
||||||
commands_device='scan add delete remove ready stats usage'
|
commands_device='scan add delete remove ready stats usage'
|
||||||
commands_scrub='start cancel resume status'
|
commands_scrub='start cancel resume status'
|
||||||
commands_rescue='chunk-recover super-recover'
|
commands_rescue='chunk-recover super-recover'
|
||||||
commands_inspect_internal='inode-resolve logical-resolve subvolid-resolve rootid'
|
commands_inspect_internal='inode-resolve logical-resolve subvolid-resolve rootid min-dev-size'
|
||||||
commands_property='get set list'
|
commands_property='get set list'
|
||||||
commands_quota='enable disable rescan'
|
commands_quota='enable disable rescan'
|
||||||
commands_qgroup='assign remove create destroy show limit'
|
commands_qgroup='assign remove create destroy show limit'
|
||||||
|
|
|
@ -20,13 +20,14 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
|
||||||
#include "kerncompat.h"
|
#include "kerncompat.h"
|
||||||
#include "ioctl.h"
|
#include "ioctl.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "ctree.h"
|
#include "ctree.h"
|
||||||
#include "send-utils.h"
|
#include "send-utils.h"
|
||||||
|
#include "disk-io.h"
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
#include "btrfs-list.h"
|
#include "btrfs-list.h"
|
||||||
|
|
||||||
|
@ -481,7 +482,7 @@ static void adjust_dev_min_size(struct list_head *extents,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_min_size(int fd, DIR *dirstream, u64 devid)
|
static int print_min_dev_size(int fd, u64 devid)
|
||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
/*
|
/*
|
||||||
|
@ -572,13 +573,64 @@ static int get_min_size(int fd, DIR *dirstream, u64 devid)
|
||||||
printf("%llu bytes (%s)\n", min_size, pretty_size(min_size));
|
printf("%llu bytes (%s)\n", min_size, pretty_size(min_size));
|
||||||
ret = 0;
|
ret = 0;
|
||||||
out:
|
out:
|
||||||
close_file_or_dir(fd, dirstream);
|
|
||||||
free_dev_extent_list(&extents);
|
free_dev_extent_list(&extents);
|
||||||
free_dev_extent_list(&holes);
|
free_dev_extent_list(&holes);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char* const cmd_inspect_min_dev_size_usage[] = {
|
||||||
|
"btrfs inspect-internal min-dev-size [options] <path>",
|
||||||
|
"Get the minimum size the device can be shrunk to. The",
|
||||||
|
"device id 1 is used by default.",
|
||||||
|
"--id DEVID specify the device id to query",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static int cmd_inspect_min_dev_size(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
int fd = -1;
|
||||||
|
DIR *dirstream = NULL;
|
||||||
|
u64 devid = 1;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
int c;
|
||||||
|
enum { GETOPT_VAL_DEVID = 256 };
|
||||||
|
static const struct option long_options[] = {
|
||||||
|
{ "id", required_argument, NULL, GETOPT_VAL_DEVID },
|
||||||
|
{NULL, 0, NULL, 0}
|
||||||
|
};
|
||||||
|
|
||||||
|
c = getopt_long(argc, argv, "", long_options, NULL);
|
||||||
|
if (c < 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
switch (c) {
|
||||||
|
case GETOPT_VAL_DEVID:
|
||||||
|
devid = arg_strtou64(optarg);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage(cmd_inspect_min_dev_size_usage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (check_argc_exact(argc - optind, 1))
|
||||||
|
usage(cmd_inspect_min_dev_size_usage);
|
||||||
|
|
||||||
|
fd = open_file_or_dir(argv[optind], &dirstream);
|
||||||
|
if (fd < 0) {
|
||||||
|
fprintf(stderr, "ERROR: can't access '%s'\n", argv[optind]);
|
||||||
|
ret = -ENOENT;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = print_min_dev_size(fd, devid);
|
||||||
|
out:
|
||||||
|
close_file_or_dir(fd, dirstream);
|
||||||
|
|
||||||
|
return !!ret;
|
||||||
|
}
|
||||||
|
|
||||||
static const char inspect_cmd_group_info[] =
|
static const char inspect_cmd_group_info[] =
|
||||||
"query various internal information";
|
"query various internal information";
|
||||||
|
|
||||||
|
@ -591,6 +643,8 @@ const struct cmd_group inspect_cmd_group = {
|
||||||
{ "subvolid-resolve", cmd_subvolid_resolve,
|
{ "subvolid-resolve", cmd_subvolid_resolve,
|
||||||
cmd_subvolid_resolve_usage, NULL, 0 },
|
cmd_subvolid_resolve_usage, NULL, 0 },
|
||||||
{ "rootid", cmd_rootid, cmd_rootid_usage, NULL, 0 },
|
{ "rootid", cmd_rootid, cmd_rootid_usage, NULL, 0 },
|
||||||
|
{ "min-dev-size", cmd_inspect_min_dev_size,
|
||||||
|
cmd_inspect_min_dev_size_usage, NULL, 0 },
|
||||||
NULL_CMD_STRUCT
|
NULL_CMD_STRUCT
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,14 +9,15 @@ source $TOP/tests/common
|
||||||
check_prereq mkfs.btrfs
|
check_prereq mkfs.btrfs
|
||||||
setup_root_helper
|
setup_root_helper
|
||||||
|
|
||||||
|
# Optionally take id of the device to shrink
|
||||||
shrink_test()
|
shrink_test()
|
||||||
{
|
{
|
||||||
min_size=$($SUDO_HELPER $TOP/btrfs filesystem resize get_min_size $TEST_MNT)
|
min_size=$(run_check_stdout $SUDO_HELPER $TOP/btrfs inspect-internal min-dev-size ${1:+--id $1} $TEST_MNT)
|
||||||
if [ $? != 0 ]; then
|
|
||||||
_fail "Failed to get minimum size"
|
|
||||||
fi
|
|
||||||
min_size=$(echo $min_size | cut -d ' ' -f 1)
|
min_size=$(echo $min_size | cut -d ' ' -f 1)
|
||||||
echo "min size = ${min_size}" >> $RESULTS
|
echo "min size = ${min_size}" >> $RESULTS
|
||||||
|
if [ -z "$min_size" ]; then
|
||||||
|
_fail "Failed to parse minimum size"
|
||||||
|
fi
|
||||||
run_check $SUDO_HELPER $TOP/btrfs filesystem resize $min_size $TEST_MNT
|
run_check $SUDO_HELPER $TOP/btrfs filesystem resize $min_size $TEST_MNT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -63,7 +64,7 @@ done
|
||||||
run_check $SUDO_HELPER $TOP/btrfs balance start -mconvert=single \
|
run_check $SUDO_HELPER $TOP/btrfs balance start -mconvert=single \
|
||||||
-sconvert=single -f $TEST_MNT
|
-sconvert=single -f $TEST_MNT
|
||||||
for ((i = 1; i <= 3; i++)); do
|
for ((i = 1; i <= 3; i++)); do
|
||||||
shrink_test
|
shrink_test 1
|
||||||
done
|
done
|
||||||
|
|
||||||
run_check $SUDO_HELPER umount $TEST_MNT
|
run_check $SUDO_HELPER umount $TEST_MNT
|
||||||
|
|
Loading…
Reference in a new issue