New api mke2fs for full configuration of filesystem.
Signed-off-by: Wanlong Gao <gaowanlong(a)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