[Libguestfs] [PATCH 2/2] Include resize2fs_P into vfs_min_size.
Pino Toscano
ptoscano at redhat.com
Mon Oct 19 16:58:07 UTC 2015
On Monday 19 October 2015 17:05:03 Maxim Perevedentsev wrote:
> ---
> daemon/daemon.h | 1 +
> daemon/ext2.c | 45 +++++++++++++++++++++++++++++++++++++++------
> daemon/fs-min-size.c | 3 +++
> generator/actions.ml | 20 ++++----------------
> src/MAX_PROC_NR | 2 +-
> 5 files changed, 48 insertions(+), 23 deletions(-)
>
> diff --git a/daemon/daemon.h b/daemon/daemon.h
> index a690152..61b61e7 100644
> --- a/daemon/daemon.h
> +++ b/daemon/daemon.h
> @@ -224,6 +224,7 @@ extern int sync_disks (void);
> #define EXT2_LABEL_MAX 16
> extern int fstype_is_extfs (const char *fstype);
> extern int ext_set_uuid_random (const char *device);
> +extern int64_t ext_min_size (const char *device);
>
> /*-- in blkid.c --*/
> extern char *get_blkid_tag (const char *device, const char *tag);
> diff --git a/daemon/ext2.c b/daemon/ext2.c
> index 0cd6a66..f00e081 100644
> --- a/daemon/ext2.c
> +++ b/daemon/ext2.c
> @@ -279,8 +279,34 @@ do_resize2fs_M (const char *device)
> return 0;
> }
>
> +static int32_t
> +get_block_size (const char *device)
> +{
> + CLEANUP_FREE_STRING_LIST char **params = NULL;
> + const char *block_pattern = "Block size";
> + size_t i;
> + int32_t block_size;
> +
> + params = do_tune2fs_l (device);
This works, yes, although maybe there should be a way to run tune2fs -l
and traverse its output to either build a return hash (i.e. what
do_tune2fs_l currently does) or just lookup one or more keys (like
needed here).
> + if (params == NULL)
> + return -1;
> +
> + for (i = 0; params[i] != NULL; i += 2) {
> + if ((!strcmp (params[i], block_pattern))) {
Please use STREQ, like use everywhere else in libguestfs.
(and the extra brackets are not needed)
> + if (sscanf (params[i + 1], "%" SCNd32, &block_size) != 1) {
> + reply_with_error("Cannot parse block size");
This could use a simplier xstrtoul/xstrtoull.
> + return -1;
> + }
> + return block_size;
> + }
> + }
> +
> + reply_with_error("No block size in tune2fs_l output. Check format.")
"missing 'Block size' in tune2fs_l output"
> + return -1;
> +}
> +
> int64_t
> -do_resize2fs_P (const char *device)
> +ext_min_size (const char *device)
> {
> CLEANUP_FREE char *err = NULL, *out = NULL;
> CLEANUP_FREE_STRING_LIST char **lines = NULL;
> @@ -288,6 +314,7 @@ do_resize2fs_P (const char *device)
> size_t i;
> char *p;
> int64_t ret;
> + int32_t block_size;
> const char *pattern = "Estimated minimum size of the filesystem: ";
>
> r = command (&out, &err, str_resize2fs, "-P", device, NULL);
> @@ -301,16 +328,22 @@ do_resize2fs_P (const char *device)
> return -1;
>
> for (i = 0; lines[i] != NULL; ++i) {
> - if (verbose)
> - fprintf (stderr, "resize2fs_P: lines[%zu] = \"%s\"\n", i, lines[i]);
> -
> if ((p = strstr (lines[i], pattern))) {
STRPREFIX here.
> - if (sscanf (p + strlen(pattern), "%" SCNd64, &ret) != 1)
> + if (sscanf (p + strlen(pattern), "%" SCNd64, &ret) != 1) {
Ditto (xstrtoul).
> + reply_with_error("Cannot parse min size");
> + return -1;
> + }
> + if ((block_size = get_block_size (device)) == -1)
> return -1;
> - return ret;
> + if (verbose) {
> + fprintf(stderr, "Minimum size in blocks: %" SCNd64 \
> + "\nBlock count: %" SCNd32 "\n", ret, block_size);
> + }
> + return ret * block_size;
Might better check ret for possible overflows before multiplying it
with block_size.
> }
> }
>
> + reply_with_error("Minimum size not found. Check output format:\n%s", out);
> return -1;
> }
>
> diff --git a/daemon/fs-min-size.c b/daemon/fs-min-size.c
> index 9c107d1..8c7287f 100644
> --- a/daemon/fs-min-size.c
> +++ b/daemon/fs-min-size.c
> @@ -35,6 +35,9 @@ do_vfs_min_size(const mountable_t *mountable)
> if (vfs_type == NULL)
> return -1;
>
> + else if (fstype_is_extfs (vfs_type))
> + r = ext_min_size (mountable->device);
> +
> else if (STREQ (vfs_type, "ntfs"))
> r = ntfs_min_size (mountable->device);
>
> diff --git a/generator/actions.ml b/generator/actions.ml
> index 0646a16..22358ef 100644
> --- a/generator/actions.ml
> +++ b/generator/actions.ml
> @@ -12752,24 +12752,12 @@ Only some filesystem types support setting UUIDs.
> To read the UUID on a filesystem, call C<guestfs_vfs_uuid>." };
>
> { defaults with
> - name = "resize2fs_P"; added = (1, 31, 17);
> - style = RInt64 "sizeinblocks", [Device "device"], [];
> - proc_nr = Some 457;
> - tests = [
> - InitBasicFS, Always, TestRun (
> - [["resize2fs_P"; "/dev/sda1"]]), [];
> - ];
> - shortdesc = "get minimum filesystem size in blocks";
> - longdesc = "\
> -Get the estimated minimum filesystem size of an ext2/3/4 filesystem in blocks.
> -
> -See also L<resize2fs(8)>." };
> -
> - { defaults with
> name = "vfs_min_size"; added = (1, 31, 18);
> style = RInt64 "sizeinbytes", [Mountable "mountable"], [];
> - proc_nr = Some 458;
> + proc_nr = Some 457;
> tests = [
> + InitBasicFS, Always, TestRun (
> + [["vfs_min_size"; "/dev/sda1"]]), [];
> InitPartition, IfAvailable "ntfsprogs", TestRun(
> [["mkfs"; "ntfs"; "/dev/sda1"; ""; "NOARG"; ""; ""; "NOARG"];
> ["vfs_min_size"; "/dev/sda1"]]), [];
> @@ -12779,7 +12767,7 @@ See also L<resize2fs(8)>." };
> Get the minimum size of filesystem in bytes.
> This is the minimum possible size for filesystem shrinking.
>
> -See also L<ntfsresize(8)>." };
> +See also L<ntfsresize(8)>, L<resize2fs(8)>." };
>
> ]
>
> diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
> index c92ddb6..de2a00c 100644
> --- a/src/MAX_PROC_NR
> +++ b/src/MAX_PROC_NR
> @@ -1 +1 @@
> -458
> +457
>
Thanks,
--
Pino Toscano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20151019/e0823ecd/attachment.sig>
More information about the Libguestfs
mailing list