From edd747a09060dd191277f1bcae827a94939cfb9d Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 12 Jul 2011 18:16:40 +0100 Subject: [PATCH] New API: ntfsresize-opts (RHBZ#685009). This is a more comprehensive fix for RHBZ#685009. Add a new API which allows the --force flag to be passed, allowing multiple NTFS resize operations in a single session. --- daemon/ntfs.c | 52 +++++++++++++++++++++++++++--------------- generator/generator_actions.ml | 36 +++++++++++++++++++++++++++-- src/MAX_PROC_NR | 2 +- 3 files changed, 69 insertions(+), 21 deletions(-) diff --git a/daemon/ntfs.c b/daemon/ntfs.c index 909ea18..5891263 100644 --- a/daemon/ntfs.c +++ b/daemon/ntfs.c @@ -60,13 +60,37 @@ do_ntfs_3g_probe (int rw, const char *device) return r; } +/* Takes optional arguments, consult optargs_bitmask. */ int -do_ntfsresize (const char *device) +do_ntfsresize_opts (const char *device, int64_t size, int force) { char *err; int r; + const char *argv[16]; + size_t i = 0; + char size_str[32]; + + argv[i++] = "ntfsresize"; + argv[i++] = "-P"; + + if (optargs_bitmask & GUESTFS_NTFSRESIZE_OPTS_SIZE_BITMASK) { + if (size <= 0) { + reply_with_error ("size is zero or negative"); + return -1; + } + + snprintf (size_str, sizeof size_str, "%" PRIi64, size); + argv[i++] = "--size"; + argv[i++] = size_str; + } + + if (optargs_bitmask & GUESTFS_NTFSRESIZE_OPTS_FORCE_BITMASK && force) + argv[i++] = "--force"; - r = command (NULL, &err, "ntfsresize", "-P", device, NULL); + argv[i++] = device; + argv[i++] = NULL; + + r = commandv (NULL, &err, argv); if (r == -1) { reply_with_error ("%s: %s", device, err); free (err); @@ -78,22 +102,14 @@ do_ntfsresize (const char *device) } int -do_ntfsresize_size (const char *device, int64_t size) +do_ntfsresize (const char *device) { - char *err; - int r; - - char buf[32]; - snprintf (buf, sizeof buf, "%" PRIi64, size); - - r = command (NULL, &err, "ntfsresize", "-P", "--size", buf, - device, NULL); - if (r == -1) { - reply_with_error ("%s: %s", device, err); - free (err); - return -1; - } + return do_ntfsresize_opts (device, 0, 0); +} - free (err); - return 0; +int +do_ntfsresize_size (const char *device, int64_t size) +{ + optargs_bitmask = GUESTFS_NTFSRESIZE_OPTS_SIZE_BITMASK; + return do_ntfsresize_opts (device, size, 0); } diff --git a/generator/generator_actions.ml b/generator/generator_actions.ml index 6b53c34..8592a39 100644 --- a/generator/generator_actions.ml +++ b/generator/generator_actions.ml @@ -5218,7 +5218,7 @@ I tar file) into C."); This command packs the contents of C and downloads it to local file C (as an xz compressed tar archive)."); - ("ntfsresize", (RErr, [Device "device"], []), 231, [Optional "ntfsprogs"], + ("ntfsresize", (RErr, [Device "device"], []), 231, [Optional "ntfsprogs"; DeprecatedBy "ntfsresize_opts"], [], "resize an NTFS filesystem", "\ @@ -5456,7 +5456,7 @@ allows you to specify the new size (in bytes) explicitly."); This command is the same as C except that it allows you to specify the new size (in bytes) explicitly."); - ("ntfsresize_size", (RErr, [Device "device"; Int64 "size"], []), 250, [Optional "ntfsprogs"], + ("ntfsresize_size", (RErr, [Device "device"; Int64 "size"], []), 250, [Optional "ntfsprogs"; DeprecatedBy "ntfsresize_opts"], [], "resize an NTFS filesystem (with size)", "\ @@ -6011,6 +6011,38 @@ Device mapper devices which correspond to logical volumes are I returned in this list. Call C if you want to list logical volumes."); + ("ntfsresize_opts", (RErr, [Device "device"], [Int64 "size"; Bool "force"]), 288, [Optional "ntfsprogs"], + [], + "resize an NTFS filesystem", + "\ +This command resizes an NTFS filesystem, expanding or +shrinking it to the size of the underlying device. + +The optional parameters are: + +=over 4 + +=item C + +The new size (in bytes) of the filesystem. If omitted, the filesystem +is resized to fit the container (eg. partition). + +=item C + +If this option is true, then force the resize of the filesystem +even if the filesystem is marked as requiring a consistency check. + +After the resize operation, the filesystem is always marked +as requiring a consistency check (for safety). You have to boot +into Windows to perform this check and clear this condition. +If you I set the C option then it is not +possible to call C multiple times on a +single filesystem without booting into Windows between each resize. + +=back + +See also L."); + ] let all_functions = non_daemon_functions @ daemon_functions diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index 209ac45..ea80947 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -287 +288 -- 1.8.3.1