Re: [PATCH 01/10] mke2fs.c: add an option: -d root-directory

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Hi Darren,

Thanks for the reply, I'd like to move part of the first patch
to the end if this puzzles people, here is the size impact on
mke2fs (no impact on tune2fs):

Not stripped:
  1837440 -> 1903522 (64K increased)
Stripped:
  329464 -> 321272 (8K increased)

I will send a V2 with your other comments.

// Robert

On 12/24/2013 03:08 AM, Darren Hart wrote:
On Mon, 2013-12-23 at 07:09 -0500, Robert Yang wrote:
This option is used for adding the files from a given directory (the
root-directory) to the filesystem, it is similiar to genext2fs, but
genext2fs doesn't fully support ext4.

This commit describes the skeleton of the implementation:

This approach strikes me as a bit odd. We're adding an option and empty
functions, rather than fleshing them out at the same time. What is the
motivation for separating this from the actual implementation? At the
very least the -d option shouldn't be added until it is functional - at
the end of the series...

Ted, was there a recommendation to take this approach - maybe I'm
missing some context?

Thanks,

Darren Hart

* We already have the basic operations in debugfs:
   - Copy regular file
   - Create directory
   - Create symlink
   - Create special file

   We will move these operations into create_inode.h and create_inode.c,
   then let both mke2fs and debugfs use them.

* What we need to do are:
   - Copy the given directory recursively
   - Set the owner, mode and other informations
   - Handle the hard links

TODO:
   - The libext2fs can't create the socket file (S_IFSOCK), do we have a
     plan to support it ?

Signed-off-by: Robert Yang <liezhi.yang@xxxxxxxxxxxxx>
---
  misc/Makefile.in    |   13 +++++++++----
  misc/create_inode.c |   26 ++++++++++++++++++++++++++
  misc/create_inode.h |   17 +++++++++++++++++
  misc/mke2fs.c       |   32 +++++++++++++++++++++++---------
  4 files changed, 75 insertions(+), 13 deletions(-)
  create mode 100644 misc/create_inode.c
  create mode 100644 misc/create_inode.h

diff --git a/misc/Makefile.in b/misc/Makefile.in
index a798f96..da780fe 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -42,7 +42,7 @@ LPROGS=		@E2INITRD_PROG@

  TUNE2FS_OBJS=	tune2fs.o util.o
  MKLPF_OBJS=	mklost+found.o
-MKE2FS_OBJS=	mke2fs.o util.o profile.o prof_err.o default_profile.o
+MKE2FS_OBJS=	mke2fs.o util.o profile.o prof_err.o default_profile.o create_inode.o
  CHATTR_OBJS=	chattr.o
  LSATTR_OBJS=	lsattr.o
  UUIDGEN_OBJS=	uuidgen.o
@@ -60,7 +60,8 @@ E2FREEFRAG_OBJS= e2freefrag.o
  PROFILED_TUNE2FS_OBJS=	profiled/tune2fs.o profiled/util.o
  PROFILED_MKLPF_OBJS=	profiled/mklost+found.o
  PROFILED_MKE2FS_OBJS=	profiled/mke2fs.o profiled/util.o profiled/profile.o \
-			profiled/prof_err.o profiled/default_profile.o
+			profiled/prof_err.o profiled/default_profile.o \
+			profiled/create_inode.o
  PROFILED_CHATTR_OBJS=	profiled/chattr.o
  PROFILED_LSATTR_OBJS=	profiled/lsattr.o
  PROFILED_UUIDGEN_OBJS=	profiled/uuidgen.o
@@ -82,7 +83,7 @@ SRCS=	$(srcdir)/tune2fs.c $(srcdir)/mklost+found.c $(srcdir)/mke2fs.c \
  		$(srcdir)/uuidgen.c $(srcdir)/blkid.c $(srcdir)/logsave.c \
  		$(srcdir)/filefrag.c $(srcdir)/base_device.c \
  		$(srcdir)/ismounted.c $(srcdir)/../e2fsck/profile.c \
-		$(srcdir)/e2undo.c $(srcdir)/e2freefrag.c
+		$(srcdir)/e2undo.c $(srcdir)/e2freefrag.c $(srcdir)/create_inode.c

  LIBS= $(LIBEXT2FS) $(LIBCOM_ERR)
  DEPLIBS= $(LIBEXT2FS) $(DEPLIBCOM_ERR)
@@ -612,7 +613,7 @@ mke2fs.o: $(srcdir)/mke2fs.c $(top_builddir)/lib/config.h \
   $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/bitops.h \
   $(top_srcdir)/lib/e2p/e2p.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
   $(srcdir)/util.h profile.h prof_err.h $(top_srcdir)/version.h \
- $(srcdir)/nls-enable.h $(top_srcdir)/lib/quota/mkquota.h \
+ $(srcdir)/nls-enable.h $(top_srcdir)/lib/quota/mkquota.h $(srcdir)/create_inode.h\
   $(top_srcdir)/lib/quota/quotaio.h $(top_srcdir)/lib/quota/dqblk_v2.h \
   $(top_srcdir)/lib/quota/quotaio_tree.h $(top_srcdir)/lib/../e2fsck/dict.h
  chattr.o: $(srcdir)/chattr.c $(top_builddir)/lib/config.h \
@@ -692,3 +693,7 @@ e2freefrag.o: $(srcdir)/e2freefrag.c $(top_builddir)/lib/config.h \
   $(top_srcdir)/lib/ext2fs/ext2_io.h $(top_builddir)/lib/ext2fs/ext2_err.h \
   $(top_srcdir)/lib/ext2fs/ext2_ext_attr.h $(top_srcdir)/lib/ext2fs/bitops.h \
   $(srcdir)/e2freefrag.h
+create_inode.o: $(srcdir)/create_inode.h $(srcdir)/create_inode.c \
+ $(top_builddir)/lib/config.h $(top_srcdir)/lib/ext2fs/ext2fs.h \
+ $(top_srcdir)/lib/et/com_err.h $(top_srcdir)/lib/e2p/e2p.h \
+ $(srcdir)/nls-enable.h
diff --git a/misc/create_inode.c b/misc/create_inode.c
new file mode 100644
index 0000000..46aaa60
--- /dev/null
+++ b/misc/create_inode.c
@@ -0,0 +1,26 @@
+#include "create_inode.h"
+
+/* Make a special file which is block, character and fifo */
+errcode_t do_mknod_internal(ext2_ino_t cwd, const char *name, struct stat *st)
+{
+}
+
+/* Make a symlink name -> target */
+errcode_t do_symlink_internal(ext2_ino_t cwd, const char *name, char *target)
+{
+}
+
+/* Make a directory in the fs */
+errcode_t do_mkdir_internal(ext2_ino_t cwd, const char *name, struct stat *st)
+{
+}
+
+/* Copy the native file to the fs */
+errcode_t do_write_internal(ext2_ino_t cwd, const char *src, const char *dest)
+{
+}
+
+/* Copy files from source_dir to fs */
+errcode_t populate_fs(ext2_ino_t parent_ino, const char *source_dir)
+{
+}
diff --git a/misc/create_inode.h b/misc/create_inode.h
new file mode 100644
index 0000000..9fc97fa
--- /dev/null
+++ b/misc/create_inode.h
@@ -0,0 +1,17 @@
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include "et/com_err.h"
+#include "e2p/e2p.h"
+#include "ext2fs/ext2fs.h"
+#include "nls-enable.h"
+
+ext2_filsys    current_fs;
+ext2_ino_t     root;
+
+/* For populating the filesystem */
+extern errcode_t populate_fs(ext2_ino_t parent_ino, const char *source_dir);
+extern errcode_t do_mknod_internal(ext2_ino_t cwd, const char *name, struct stat *st);
+extern errcode_t do_symlink_internal(ext2_ino_t cwd, const char *name, char *target);
+extern errcode_t do_mkdir_internal(ext2_ino_t cwd, const char *name, struct stat *st);
+extern errcode_t do_write_internal(ext2_ino_t cwd, const char *src, const char *dest);
diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index 4075099..eab5463 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -22,7 +22,6 @@
  #include <stdio.h>
  #include <string.h>
  #include <strings.h>
-#include <fcntl.h>
  #include <ctype.h>
  #include <time.h>
  #ifdef __linux__
@@ -44,24 +43,19 @@ extern int optind;
  #include <errno.h>
  #endif
  #include <sys/ioctl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
  #include <libgen.h>
  #include <limits.h>
  #include <blkid/blkid.h>

  #include "ext2fs/ext2_fs.h"
  #include "ext2fs/ext2fsP.h"
-#include "et/com_err.h"
  #include "uuid/uuid.h"
-#include "e2p/e2p.h"
-#include "ext2fs/ext2fs.h"
  #include "util.h"
  #include "profile.h"
  #include "prof_err.h"
  #include "../version.h"
-#include "nls-enable.h"
  #include "quota/mkquota.h"
+#include "create_inode.h"

  #define STRIDE_LENGTH 8

@@ -105,6 +99,7 @@ char *mount_dir;
  char *journal_device;
  int sync_kludge;	/* Set using the MKE2FS_SYNC env. option */
  char **fs_types;
+const char *root_dir;  /* Copy files from the specified directory */

  profile_t	profile;

@@ -116,7 +111,8 @@ static void usage(void)
  	fprintf(stderr, _("Usage: %s [-c|-l filename] [-b block-size] "
  	"[-C cluster-size]\n\t[-i bytes-per-inode] [-I inode-size] "
  	"[-J journal-options]\n"
-	"\t[-G flex-group-size] [-N number-of-inodes]\n"
+	"\t[-G flex-group-size] [-N number-of-inodes] "
+	"[-d root-directory]\n"
  	"\t[-m reserved-blocks-percentage] [-o creator-os]\n"
  	"\t[-g blocks-per-group] [-L volume-label] "
  	"[-M last-mounted-directory]\n\t[-O feature[,...]] "
@@ -1403,7 +1399,7 @@ profile_error:
  	}

  	while ((c = getopt (argc, argv,
-		    "b:cg:i:jl:m:no:qr:s:t:vC:DE:FG:I:J:KL:M:N:O:R:ST:U:V")) != EOF) {
+		    "b:cg:i:jl:m:no:qr:s:t:d:vC:DE:FG:I:J:KL:M:N:O:R:ST:U:V")) != EOF) {
  		switch (c) {
  		case 'b':
  			blocksize = parse_num_blocks2(optarg, -1);
@@ -1591,6 +1587,9 @@ profile_error:
  		case 'U':
  			fs_uuid = optarg;
  			break;
+		case 'd':
+			root_dir = optarg;
+			break;
  		case 'v':
  			verbose = 1;
  			break;
@@ -2798,6 +2797,21 @@ no_journal:
  				       EXT4_FEATURE_RO_COMPAT_QUOTA))
  		create_quota_inodes(fs);

+	/* Copy files from the specified directory */
+	if (root_dir) {
+		if (!quiet)
+			printf("%s", _("Copying files into the device: "));
+
+		current_fs = fs;
+		root = EXT2_ROOT_INO;
+		retval = populate_fs(root, root_dir);
+		if (retval)
+			fprintf(stderr, "%s",
+				_("\nError while populating %s"), root_dir);
+		else if (!quiet)
+			printf("%s", _("done\n"));
+	}
+
  	if (!quiet)
  		printf("%s", _("Writing superblocks and "
  		       "filesystem accounting information: "));

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux