[Libguestfs] [PATCH V2 1/2] NEW API:ext:mke2fs

Wanlong Gao gaowanlong at cn.fujitsu.com
Mon Sep 3 05:50:58 UTC 2012


New api mke2fs for full configuration of filesystem.

Signed-off-by: Wanlong Gao <gaowanlong at cn.fujitsu.com>
---
 daemon/ext2.c        | 452 +++++++++++++++++++++++++++++++++++++++++++++++++++
 generator/actions.ml |  18 ++
 gobject/Makefile.inc |   6 +-
 src/MAX_PROC_NR      |   2 +-
 4 files changed, 475 insertions(+), 3 deletions(-)

diff --git a/daemon/ext2.c b/daemon/ext2.c
index 40b36d2..7108547 100644
--- a/daemon/ext2.c
+++ b/daemon/ext2.c
@@ -811,3 +811,455 @@ do_set_e2generation (const char *filename, int64_t generation)
 
   return 0;
 }
+
+int
+do_mke2fs (const char *device,
+           int checkbadblock, const char *badblockfile,
+           int64_t blocksize, int directwrite,
+           int64_t fragsize, int forcecreate,
+           int64_t blockspergroup, int64_t numberofgroups,
+           int64_t bytesperinode, int64_t inodesize,
+           int withjournal, int64_t journalsize,
+           const char *journaldevice, const char *newvolumelabel,
+           int reservedblockspercentage, const char *lastmounteddir,
+           int64_t numberofinodes, const char *creatoros,
+           int writesbandgrouponly,
+           const char *fstype, const char *usagetype,
+           const char *fsuuid, int mmpupdateinterval,
+           int64_t stridesize, int64_t stripewidth,
+           int64_t maxonlineresize, int lazyitableinit,
+           int lazyjournalinit, int testfs,
+           int discard, int quotatype,
+           int dirindex, int extent, int filetype,
+           int flexbg, int hasjournal, int journaldev,
+           int largefile, int quota, int resizeinode,
+           int sparsesuper, int uninitbg,
+           int64_t blockscount)
+{
+  int r;
+  char *err = NULL;
+  const char *argv[MAX_ARGS];
+  char blocksize_s[64];
+  char fragsize_s[64];
+  char blockspergroup_s[64];
+  char numberofgroups_s[64];
+  char bytesperinode_s[64];
+  char inodesize_s[64];
+  char journalsize_s[64];
+  char journaldevice_s[256];
+  char reservedblockspercentage_s[64];
+  char numberofinodes_s[64];
+  char mmpupdateinterval_s[84];
+  char stridesize_s[74];
+  char stripewidth_s[84];
+  char maxonlineresize_s[74];
+  char blockscount_s[64];
+  size_t i = 0;
+  int feature = 0;
+  char features[256];
+
+  ADD_ARG (argv, i, str_mke2fs);
+
+  if (optargs_bitmask & GUESTFS_MKE2FS_CHECKBADBLOCK_BITMASK) {
+    if (checkbadblock)
+      ADD_ARG (argv, i, "-c");
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_BADBLOCKFILE_BITMASK) {
+    if (badblockfile) {
+      ADD_ARG (argv, i, "-l");
+      ADD_ARG (argv, i, badblockfile);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_BLOCKSIZE_BITMASK) {
+    if (blocksize < 0) {
+      reply_with_error ("blocksize must be >= 0");
+      goto error;
+    }
+    snprintf (blocksize_s, sizeof blocksize_s, "%" PRIi64, blocksize);
+    ADD_ARG (argv, i, "-b");
+    ADD_ARG (argv, i, blocksize_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_DIRECTWRITE_BITMASK) {
+    if (directwrite)
+      ADD_ARG (argv, i, "-D");
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_FRAGSIZE_BITMASK) {
+    if (fragsize < 0) {
+      reply_with_error ("fragsize must be >= 0");
+      goto error;
+    }
+    snprintf (fragsize_s, sizeof fragsize_s, "%" PRIi64, fragsize);
+    ADD_ARG (argv, i, "-f");
+    ADD_ARG (argv, i, fragsize_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_FORCECREATE_BITMASK) {
+    if (forcecreate)
+      ADD_ARG (argv, i, "-F");
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_BLOCKSPERGROUP_BITMASK) {
+    if (blockspergroup < 0) {
+      reply_with_error ("blockspergroup must be >= 0");
+      goto error;
+    }
+    snprintf (blockspergroup_s, sizeof blockspergroup_s,
+              "%" PRIi64, blockspergroup);
+    ADD_ARG (argv, i, "-g");
+    ADD_ARG (argv, i, blockspergroup_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_NUMBEROFGROUPS_BITMASK) {
+    if (numberofgroups < 0) {
+      reply_with_error ("numberofgroups must be >= 0");
+      goto error;
+    }
+    snprintf (numberofgroups_s, sizeof numberofgroups_s,
+              "%" PRIi64, numberofgroups);
+    ADD_ARG (argv, i, "-G");
+    ADD_ARG (argv, i, numberofgroups_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_BYTESPERINODE_BITMASK) {
+    if (bytesperinode < 0) {
+      reply_with_error ("bytesperinode must be >= 0");
+      goto error;
+    }
+    snprintf (bytesperinode_s, sizeof bytesperinode_s, "%" PRIi64, bytesperinode);
+    ADD_ARG (argv, i, "-i");
+    ADD_ARG (argv, i, bytesperinode_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_INODESIZE_BITMASK) {
+    if (inodesize < 0) {
+      reply_with_error ("inodesize must be >= 0");
+      goto error;
+    }
+    snprintf (inodesize_s, sizeof inodesize_s, "%" PRIi64, inodesize);
+    ADD_ARG (argv, i, "-I");
+    ADD_ARG (argv, i, inodesize_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_WITHJOURNAL_BITMASK) {
+    if (withjournal)
+      ADD_ARG (argv, i, "-j");
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_JOURNALSIZE_BITMASK) {
+    if (journalsize < 0) {
+      reply_with_error ("journalsize must be >= 0");
+      goto error;
+    }
+    snprintf (journalsize_s, sizeof journalsize_s,
+              "size=" "%" PRIi64, journalsize);
+    ADD_ARG (argv, i, "-J");
+    ADD_ARG (argv, i, journalsize_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_JOURNALDEVICE_BITMASK) {
+    if (journaldevice) {
+      snprintf (journaldevice_s, sizeof journaldevice_s,
+                "device=%s", journaldevice);
+      ADD_ARG (argv, i, "-J");
+      ADD_ARG (argv, i, journaldevice_s);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_NEWVOLUMELABEL_BITMASK) {
+    if (newvolumelabel) {
+      ADD_ARG (argv, i, "-L");
+      ADD_ARG (argv, i, newvolumelabel);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_RESERVEDBLOCKSPERCENTAGE_BITMASK) {
+    if (reservedblockspercentage < 0) {
+      reply_with_error ("reservedblockspercentage must be >= 0");
+      goto error;
+    }
+    snprintf (reservedblockspercentage_s, sizeof reservedblockspercentage_s,
+              "%" PRIi32, reservedblockspercentage);
+    ADD_ARG (argv, i, "-m");
+    ADD_ARG (argv, i, reservedblockspercentage_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_LASTMOUNTEDDIR_BITMASK) {
+    if (lastmounteddir) {
+      ADD_ARG (argv, i, "-M");
+      ADD_ARG (argv, i, lastmounteddir);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_NUMBEROFINODES_BITMASK) {
+    if (numberofinodes < 0) {
+      reply_with_error ("numberofinodes must be >= 0");
+      goto error;
+    }
+    snprintf (numberofinodes_s, sizeof numberofinodes_s,
+              "%" PRIi64, numberofinodes);
+    ADD_ARG (argv, i, "-N");
+    ADD_ARG (argv, i, numberofinodes_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_CREATOROS_BITMASK) {
+    if (creatoros) {
+      ADD_ARG (argv, i, "-o");
+      ADD_ARG (argv, i, creatoros);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_WRITESBANDGROUPONLY_BITMASK) {
+    if (writesbandgrouponly)
+      ADD_ARG (argv, i, "-S");
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_FSTYPE_BITMASK) {
+    if (fstype) {
+      ADD_ARG (argv, i, "-t");
+      ADD_ARG (argv, i, fstype);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_USAGETYPE_BITMASK) {
+    if (usagetype) {
+      ADD_ARG (argv, i, "-T");
+      ADD_ARG (argv, i, usagetype);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_FSUUID_BITMASK) {
+    if (fsuuid) {
+      ADD_ARG (argv, i, "-U");
+      ADD_ARG (argv, i, fsuuid);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_MMPUPDATEINTERVAL_BITMASK) {
+    if (mmpupdateinterval < 0) {
+      reply_with_error ("mmpupdateinterval must be >= 0");
+      goto error;
+    }
+    snprintf (mmpupdateinterval_s, sizeof mmpupdateinterval_s,
+              "mmp_update_interval=" "%" PRIi32, mmpupdateinterval);
+    ADD_ARG (argv, i, "-E");
+    ADD_ARG (argv, i, mmpupdateinterval_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_STRIDESIZE_BITMASK) {
+    if (stridesize < 0) {
+      reply_with_error ("stridesize must be >= 0");
+      goto error;
+    }
+    snprintf (stridesize_s, sizeof stridesize_s,
+              "stride=" "%" PRIi64, stridesize);
+    ADD_ARG (argv, i, "-E");
+    ADD_ARG (argv, i, stridesize_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_STRIPEWIDTH_BITMASK) {
+    if (stripewidth< 0) {
+      reply_with_error ("stripewidth must be >= 0");
+      goto error;
+    }
+    snprintf (stripewidth_s, sizeof stripewidth_s,
+              "stripe_width=" "%" PRIi64, stripewidth);
+    ADD_ARG (argv, i, "-E");
+    ADD_ARG (argv, i, stripewidth_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_MAXONLINERESIZE_BITMASK) {
+    if (maxonlineresize < 0) {
+      reply_with_error ("maxonlineresize must be >= 0");
+      goto error;
+    }
+    snprintf (maxonlineresize_s, sizeof maxonlineresize_s,
+              "resize=" "%" PRIi64, maxonlineresize);
+    ADD_ARG (argv, i, "-E");
+    ADD_ARG (argv, i, maxonlineresize_s);
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_LAZYITABLEINIT_BITMASK) {
+    ADD_ARG (argv, i, "-E");
+    if (lazyitableinit)
+      ADD_ARG (argv, i, "lazy_itable_init=1");
+    else
+      ADD_ARG (argv, i, "lazy_itable_init=0");
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_LAZYJOURNALINIT_BITMASK) {
+    ADD_ARG (argv, i, "-E");
+    if (lazyjournalinit)
+      ADD_ARG (argv, i, "lazy_journal_init=1");
+    else
+      ADD_ARG (argv, i, "lazy_journal_init=0");
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_TESTFS_BITMASK) {
+    if (testfs) {
+      ADD_ARG (argv, i, "-E");
+      ADD_ARG (argv, i, "test_fs");
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_DISCARD_BITMASK) {
+    ADD_ARG (argv, i, "-E");
+    if (discard)
+      ADD_ARG (argv, i, "discard");
+    else
+      ADD_ARG (argv, i, "nodiscard");
+  }
+
+  if (optargs_bitmask & GUESTFS_MKE2FS_DIRINDEX_BITMASK) {
+    if (dirindex)
+      strncat (features, "dir_index", 9);
+    else
+      strncat (features, "^dir_index", 10);
+    feature++;
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_EXTENT_BITMASK) {
+    if (feature == 0) {
+      if (extent)
+        strncat (features, "extent", 6);
+      else
+        strncat (features, "^extent", 7);
+      feature++;
+    } else {
+      if (extent)
+        strncat (features, ",extent", 7);
+      else
+        strncat (features, ",^extent", 8);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_FILETYPE_BITMASK) {
+    if (feature == 0) {
+      if (filetype)
+        strncat (features, "filetype", 8);
+      else
+        strncat (features, "^filetype", 9);
+      feature++;
+    } else {
+      if (filetype)
+        strncat (features, ",filetype", 9);
+      else
+        strncat (features, ",^filetype", 10);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_FLEXBG_BITMASK) {
+    if (feature == 0) {
+      if (flexbg)
+        strncat (features, "flex_bg", 7);
+      else
+        strncat (features, "^flex_bg", 8);
+      feature++;
+    } else {
+      if (flexbg)
+        strncat (features, ",flex_bg", 8);
+      else
+        strncat (features, ",^flex_bg", 9);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_HASJOURNAL_BITMASK) {
+    if (feature == 0) {
+      if (hasjournal)
+        strncat (features, "has_journal", 11);
+      else
+        strncat (features, "^has_journal", 12);
+      feature++;
+    } else {
+      if (hasjournal)
+        strncat (features, ",has_journal", 12);
+      else
+        strncat (features, ",^has_journal", 13);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_JOURNALDEV_BITMASK) {
+    if (feature == 0) {
+      if (journaldev)
+        strncat (features, "journal_dev", 11);
+      else
+        strncat (features, "^journal_dev", 12);
+      feature++;
+    } else {
+      if (journaldev)
+        strncat (features, ",journal_dev", 12);
+      else
+        strncat (features, ",^journal_dev", 13);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_LARGEFILE_BITMASK) {
+    if (feature == 0) {
+      if (largefile)
+        strncat (features, "large_file", 10);
+      else
+        strncat (features, "^large_file", 11);
+      feature++;
+    } else {
+      if (largefile)
+        strncat (features, ",large_file", 11);
+      else
+        strncat (features, ",^large_file", 12);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_QUOTA_BITMASK) {
+    if (feature == 0) {
+      if (quota)
+        strncat (features, "quota", 5);
+      else
+        strncat (features, "^quota", 6);
+      feature++;
+    } else {
+      if (quota)
+        strncat (features, ",quota", 6);
+      else
+        strncat (features, ",^quota", 7);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_RESIZEINODE_BITMASK) {
+    if (feature == 0) {
+      if (resizeinode)
+        strncat (features, "resize_inode", 12);
+      else
+        strncat (features, "^resize_inode", 13);
+      feature++;
+    } else {
+      if (resizeinode)
+        strncat (features, ",resize_inode", 13);
+      else
+        strncat (features, ",^resize_inode", 14);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_SPARSESUPER_BITMASK) {
+    if (feature == 0) {
+      if (sparsesuper)
+        strncat (features, "sparse_super", 12);
+      else
+        strncat (features, "^sparse_super", 13);
+      feature++;
+    } else {
+      if (sparsesuper)
+        strncat (features, ",sparse_super", 13);
+      else
+        strncat (features, ",^sparse_super", 14);
+    }
+  }
+  if (optargs_bitmask & GUESTFS_MKE2FS_UNINITBG_BITMASK) {
+    if (feature == 0) {
+      if (uninitbg)
+        strncat (features, "uninit_bg", 9);
+      else
+        strncat (features, "^uninit_bg", 10);
+      feature++;
+    } else {
+      if (uninitbg)
+        strncat (features, ",uninit_bg", 10);
+      else
+        strncat (features, ",^uninit_bg", 11);
+    }
+  }
+
+  if (feature != 0) {
+    ADD_ARG (argv, i, "-O");
+    ADD_ARG (argv, i, features);
+  }
+
+  ADD_ARG (argv, i, device);
+
+  if (optargs_bitmask & GUESTFS_MKE2FS_BLOCKSCOUNT_BITMASK) {
+    if (blockscount < 0) {
+      reply_with_error ("blockscount must be >= 0");
+      goto error;
+    }
+    snprintf (blockscount_s, sizeof blockscount_s, "%" PRIi64, blockscount);
+    ADD_ARG (argv, i, blockscount_s);
+  }
+
+  ADD_ARG (argv, i, NULL);
+
+  r = commandv (NULL, &err, argv);
+  if (r == -1) {
+    reply_with_error ("%s: %s", device, err);
+    goto error;
+  }
+
+  free (err);
+  return 0;
+
+error:
+  if (err) free (err);
+  return -1;
+}
diff --git a/generator/actions.ml b/generator/actions.ml
index 65012ad..cfd5198 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -9710,6 +9710,24 @@ the resulting filesystem may be inconsistent or corrupt.
 The returned status indicates whether filesystem corruption was
 detected (returns C<1>) or was not detected (returns C<0>)." };
 
+  { defaults with
+    name = "mke2fs";
+    style = RErr, [Device "device"], [OBool "checkbadblock"; OString "badblockfile"; OInt64 "blocksize"; OBool "directwrite"; OInt64 "fragsize"; OBool "forcecreate"; OInt64 "blockspergroup"; OInt64 "numberofgroups"; OInt64 "bytesperinode"; OInt64 "inodesize"; OBool "withjournal"; OInt64 "journalsize"; OString "journaldevice"; OString "newvolumelabel"; OInt "reservedblockspercentage"; OString "lastmounteddir"; OInt64 "numberofinodes"; OString "creatoros"; OBool "writesbandgrouponly"; OString "fstype"; OString "usagetype"; OString "fsuuid"; OInt "mmpupdateinterval"; OInt64 "stridesize"; OInt64 "stripewidth"; OInt64 "maxonlineresize"; OBool "lazyitableinit"; OBool "lazyjournalinit"; OBool "testfs"; OBool "discard"; OBool "quotatype"; OBool "dirindex"; OBool "extent"; OBool "filetype"; OBool "flexbg"; OBool "hasjournal"; OBool "journaldev"; OBool "largefile"; OBool "quota"; OBool "resizeinode"; OBool "sparsesuper"; OBool "uninitbg"; OInt64 "blockscount"];
+    proc_nr = Some 367;
+    tests = [
+      InitEmpty, IfAvailable "ext2", TestRun (
+        [["part_disk"; "/dev/sda"; "mbr"];
+         ["mke2fs"; "/dev/sda1"; ""; "NOARG"; ""; ""; ""; ""; ""; ""; ""; ""; "true"; ""; "NOARG"; "NOARG"; ""; "NOARG"; ""; "NOARG"; ""; "ext4"; "NOARG"; "NOARG"; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""; ""];
+      ])
+    ];
+    shortdesc = "create an ext2/ext3/ext4 filesystem on C<device>";
+    longdesc = "\
+C<mke2fs> is used to create an ext2, ext3, or ext4 filesystem,
+usually in a disk partition. C<device> is the special file corresponding
+to the device (e.g /dev/sdXX). C<blockscount> is the number of blocks
+on C<device>. If omitted, C<mke2fs> automagically figures the file system
+size." };
+
 ]
 
 (* Non-API meta-commands available only in guestfish.
diff --git a/gobject/Makefile.inc b/gobject/Makefile.inc
index ba41b48..de8e1e7 100644
--- a/gobject/Makefile.inc
+++ b/gobject/Makefile.inc
@@ -78,7 +78,8 @@ guestfs_gobject_headers= \
   include/guestfs-gobject/optargs-rsync_out.h \
   include/guestfs-gobject/optargs-xfs_admin.h \
   include/guestfs-gobject/optargs-hivex_open.h \
-  include/guestfs-gobject/optargs-xfs_repair.h
+  include/guestfs-gobject/optargs-xfs_repair.h \
+  include/guestfs-gobject/optargs-mke2fs.h
 
 guestfs_gobject_sources= \
   src/session.c \
@@ -138,4 +139,5 @@ guestfs_gobject_sources= \
   src/optargs-rsync_out.c \
   src/optargs-xfs_admin.c \
   src/optargs-hivex_open.c \
-  src/optargs-xfs_repair.c
+  src/optargs-xfs_repair.c \
+  src/optargs-mke2fs.c
diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR
index 4203007..526204c 100644
--- a/src/MAX_PROC_NR
+++ b/src/MAX_PROC_NR
@@ -1 +1 @@
-366
+367
-- 
1.7.12




More information about the Libguestfs mailing list