diff options
author | Richard Jones <rjones@redhat.com> | 2010-05-21 14:13:24 +0100 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2010-05-21 14:51:54 +0100 |
commit | 71b02d6654395ff04689055f3820b3ad4e54ec00 (patch) | |
tree | f05c6f64ee13874a6b32ded10b24533883ee05bb | |
parent | 5e1aff7856f721bf5737815a5b65c0de23ab0b0c (diff) | |
download | libguestfs-71b02d6654395ff04689055f3820b3ad4e54ec00.tar.gz libguestfs-71b02d6654395ff04689055f3820b3ad4e54ec00.tar.xz libguestfs-71b02d6654395ff04689055f3820b3ad4e54ec00.zip |
New API: resize2fs-size to allow shrinking ext2 filesystems (RHBZ#585221).
-rw-r--r-- | daemon/ext2.c | 36 | ||||
-rwxr-xr-x | src/generator.ml | 7 |
2 files changed, 43 insertions, 0 deletions
diff --git a/daemon/ext2.c b/daemon/ext2.c index 3758f4ee..3a075e56 100644 --- a/daemon/ext2.c +++ b/daemon/ext2.c @@ -20,6 +20,7 @@ #include <stdio.h> #include <stdlib.h> +#include <inttypes.h> #include <string.h> #include <unistd.h> @@ -301,6 +302,41 @@ do_resize2fs (const char *device) } int +do_resize2fs_size (const char *device, int64_t size) +{ + char *err; + int r; + + char prog[] = "resize2fs"; + if (e2prog (prog) == -1) + return -1; + + /* resize2fs itself may impose additional limits. Since we are + * going to use the 'K' suffix however we can only work with whole + * kilobytes. + */ + if (size & 1023) { + reply_with_error ("%" PRIi64 ": size must be a round number of kilobytes", + size); + return -1; + } + size /= 1024; + + char buf[32]; + snprintf (buf, sizeof buf, "%" PRIi64 "K", size); + + r = command (NULL, &err, prog, device, buf, NULL); + if (r == -1) { + reply_with_error ("%s", err); + free (err); + return -1; + } + + free (err); + return 0; +} + +int do_e2fsck_f (const char *device) { char *err; diff --git a/src/generator.ml b/src/generator.ml index aca56a87..b2ba5139 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -4686,6 +4686,13 @@ unlikely for regular files in ordinary circumstances. See also C<guestfs_pread>."); + ("resize2fs_size", (RErr, [Device "device"; Int64 "size"]), 248, [], + [], + "resize an ext2/ext3 filesystem (with size)", + "\ +This command is the same as C<guestfs_resize2fs> except that it +allows you to specify the new size (in bytes) explicitly."); + ] let all_functions = non_daemon_functions @ daemon_functions |