On Fri, Nov 25, 2016 at 11:22:27AM +0100, Pino Toscano wrote:
 Handle the swap partition on their own, rebuilding them using the
 existing UUID and label.
  resize/resize.ml       | 35 ++++++++++++++++++++++++++++-------
  resize/virt-resize.pod |  8 ++++++++
  2 files changed, 36 insertions(+), 7 deletions(-)
 
 diff --git a/resize/resize.ml b/resize/resize.ml
 index 7d06f18..59ee5bf 100644
 --- a/resize/resize.ml
 +++ b/resize/resize.ml
 @@ -60,6 +60,7 @@ and partition_content =
    | ContentPV of int64           (* physical volume (size of PV) *)
    | ContentFS of string * int64  (* mountable filesystem (FS type, FS size) *)
    | ContentExtendedPartition     (* MBR extended partition *)
 +  | ContentSwap                  (* Swap partition *)
  and partition_operation =
    | OpCopy                       (* copy it as-is, no resizing *)
    | OpIgnore                     (* ignore it (create on target, but don't
 @@ -104,11 +105,13 @@ and string_of_partition_content = function
    | ContentPV sz -> sprintf "LVM PV (%Ld bytes)" sz
    | ContentFS (fs, sz) -> sprintf "filesystem %s (%Ld bytes)" fs sz
    | ContentExtendedPartition -> "extended partition"
 +  | ContentSwap -> "swap"
  and string_of_partition_content_no_size = function
    | ContentUnknown -> "unknown data"
    | ContentPV _ -> "LVM PV"
    | ContentFS (fs, _) -> sprintf "filesystem %s" fs
    | ContentExtendedPartition -> "extended partition"
 +  | ContentSwap -> "swap"
  
  (* Data structure describing LVs on the source disk.  This is only
   * used if the user gave the --lv-expand option.
 @@ -130,6 +133,7 @@ let debug_logvol lv =
  
  type expand_content_method =
    | PVResize | Resize2fs | NTFSResize | BtrfsFilesystemResize | XFSGrowFS
 +  | Mkswap
  
  let string_of_expand_content_method = function
    | PVResize -> s_"pvresize"
 @@ -137,6 +141,7 @@ let string_of_expand_content_method = function
    | NTFSResize -> s_"ntfsresize"
    | BtrfsFilesystemResize -> s_"btrfs-filesystem-resize"
    | XFSGrowFS -> s_"xfs_growfs"
 +  | Mkswap -> s_"mkswap"
  
  type unknown_filesystems_mode =
    | UnknownFsIgnore
 @@ -414,6 +419,8 @@ read the man page virt-resize(1).
          let fs = g#vfs_type dev in
          if fs = "unknown" then
            ContentUnknown
 +        else if fs = "swap" then
 +          ContentSwap
          else if fs = "LVM2_member" then (
            let rec loop = function
              | [] ->
 @@ -531,7 +538,7 @@ read the man page virt-resize(1).
          assert (
            match typ with
            | ContentPV _ | ContentExtendedPartition -> false
 -          | ContentUnknown | ContentFS _ -> true
 +          | ContentUnknown | ContentFS _ | ContentSwap -> true
          );
  
          { lv_name = name; lv_type = typ; lv_operation = LVOpNone }
 @@ -558,6 +565,7 @@ read the man page virt-resize(1).
        | ContentFS (("xfs"), _) when !xfs_available -> true
        | ContentFS _ -> false
        | ContentExtendedPartition -> false
 +      | ContentSwap -> true
      else
        fun _ -> false
  
 @@ -572,6 +580,7 @@ read the man page virt-resize(1).
        | ContentFS (("xfs"), _) when !xfs_available -> XFSGrowFS
        | ContentFS _ -> assert false
        | ContentExtendedPartition -> assert false
 +      | ContentSwap -> Mkswap
      else
        fun _ -> assert false
    in
 @@ -665,6 +674,7 @@ read the man page virt-resize(1).
          | ContentExtendedPartition ->
            error (f_"%s: This extended partition contains logical partitions which
might be damaged by shrinking it.  If you want to shrink this partition, you need to use
the '--resize-force' option, but that could destroy logical partitions within this
partition.  (This error came from '%s' option on the command line.)")
              name option
 +        | ContentSwap -> ()
        );
  
        p.p_operation <- OpResize newsize
 @@ -831,7 +841,8 @@ read the man page virt-resize(1).
              (match p.p_type with
              | ContentUnknown
              | ContentPV _
 -            | ContentExtendedPartition -> ()
 +            | ContentExtendedPartition
 +            | ContentSwap -> ()
              | ContentFS (fs, _) ->
                error (f_"unknown/unavailable method for expanding the %s filesystem
on %s")
                  fs p.p_name
 @@ -848,7 +859,8 @@ read the man page virt-resize(1).
              (match lv.lv_type with
              | ContentUnknown
              | ContentPV _
 -            | ContentExtendedPartition -> ()
 +            | ContentExtendedPartition
 +            | ContentSwap -> ()
              | ContentFS (fs, _) ->
                error (f_"unknown/unavailable method for expanding the %s filesystem
on %s")
                  fs lv.lv_name;
 @@ -886,7 +898,8 @@ read the man page virt-resize(1).
                (match p.p_type with
                | ContentUnknown
                | ContentPV _
 -              | ContentExtendedPartition -> ()
 +              | ContentExtendedPartition
 +              | ContentSwap -> ()
                | ContentFS (fs, _) ->
                  warning (f_"unknown/unavailable method for expanding the %s
filesystem on %s")
                    fs p.p_name;
 @@ -916,7 +929,8 @@ read the man page virt-resize(1).
                  (match lv.lv_type with
                  | ContentUnknown
                  | ContentPV _
 -                | ContentExtendedPartition -> ()
 +                | ContentExtendedPartition
 +                | ContentSwap -> ()
                  | ContentFS (fs, _) ->
                    warning (f_"unknown/unavailable method for expanding the %s
filesystem on %s")
                      fs name;
 @@ -1199,7 +1213,7 @@ read the man page virt-resize(1).
          message (f_"Copying %s") source;
  
          (match p.p_type with
 -         | ContentUnknown | ContentPV _ | ContentFS _ ->
 +         | ContentUnknown | ContentPV _ | ContentFS _ | ContentSwap ->
             g#copy_device_to_device ~size:copysize ~sparse source target
  
           | ContentExtendedPartition ->
 @@ -1255,7 +1269,7 @@ read the man page virt-resize(1).
  
      | { p_type =
          (ContentFS _|ContentUnknown|ContentPV _
 -            |ContentExtendedPartition) } :: _
 +            |ContentExtendedPartition|ContentSwap) } :: _
      | [] -> ()
    );
  
 @@ -1312,6 +1326,13 @@ read the man page virt-resize(1).
        | NTFSResize -> g#ntfsresize ~force:ntfsresize_force target
        | BtrfsFilesystemResize -> with_mounted target g#btrfs_filesystem_resize
        | XFSGrowFS -> with_mounted target g#xfs_growfs
 +      | Mkswap ->
 +        (* Rebuild the swap using the UUID and label of the existing
 +         * swap partition.
 +         *)
 +        let uuid = g#vfs_uuid target in
 +        let label = g#vfs_label target in
 +        g#mkswap ~uuid ~label target
      in
  
      (* Expand partition content as required. *)
 diff --git a/resize/virt-resize.pod b/resize/virt-resize.pod
 index aa01849..2344056 100644
 --- a/resize/virt-resize.pod
 +++ b/resize/virt-resize.pod
 @@ -398,6 +398,14 @@ Btrfs filesystems, if libguestfs was compiled with support for
btrfs.
  
  XFS filesystems, if libguestfs was compiled with support for XFS.
  
 +=item *
 +
 +Linux swap partitions.
 +
 +Please note that libguestfs I<destroys> the existing swap content
 +by recreating it with C<mkswap>, so this should not be used when
 +the guest is suspended.
 +
  =back
  
  Note that you cannot use I<--expand> and I<--shrink> together. 
ACK.
Rich.
-- 
Richard Jones, Virtualization Group, Red Hat 
http://people.redhat.com/~rjones
Read my programming and virtualization blog: 
http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines.  Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v