All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
To: tytso@mit.edu
Cc: linux-ext4@vger.kernel.org,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>
Subject: [PATCH 3/4] e2fsprogs: Make mke2fs use undo I/O manager.
Date: Wed,  1 Aug 2007 07:34:08 +0530	[thread overview]
Message-ID: <11859338623488-git-send-email-aneesh.kumar@linux.vnet.ibm.com> (raw)
Message-ID: <70b3f394cda275d59094d52f60d1ee76492033fc.1185933778.git.aneesh.kumar@linux.vnet.ibm.com> (raw)
In-Reply-To: <11859338581413-git-send-email-aneesh.kumar@linux.vnet.ibm.com>
In-Reply-To: <bee58d48110eee4d5cd133167245b99644148d96.1185933778.git.aneesh.kumar@linux.vnet.ibm.com>

From: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>

When running mke2fs, if a file system is detected
on the device, we use Undo I/O manager as the io manager.
This helps in reverting the changes made to the filesystem
in case we wrongly selected the device.

The environment variable MKE2FS_SCRATCH_DIR
is used to indicate the  directory within which the tdb
file need to be created. The file will be named mke2fs-XXXXXX
If MKE2FS_SCRATCH_DIR is not set /var/lib/e2fsprogs is used


Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 misc/mke2fs.c |   98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 97 insertions(+), 1 deletions(-)

diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index 0c6d4f3..5e02b2e 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -1521,6 +1521,92 @@ static void PRS(int argc, char *argv[])
 						fs_param.s_blocks_count);
 }
 
+static int fileystem_exist(const char *name)
+{
+	errcode_t retval;
+	io_channel channel;
+	__u16	s_magic;
+	struct ext2_super_block super;
+	io_manager manager = unix_io_manager;
+
+	retval = manager->open(name, IO_FLAG_EXCLUSIVE,  &channel);
+	if (retval) {
+		/*
+		 * We don't handle error cases instead we
+		 * declare that the file system doesn't exist
+		 * and let the rest of mke2fs take care of
+		 * error
+		 */
+		retval = 0;
+		goto open_err_out;
+	}
+
+	io_channel_set_blksize(channel, SUPERBLOCK_OFFSET);
+	retval = io_channel_read_blk(channel, 1, -SUPERBLOCK_SIZE, &super);
+	if (retval) {
+		retval = 0;
+		goto err_out;
+	}
+
+#if defined(WORDS_BIGENDIAN)
+	s_magic = ext2fs_swab16(super.s_magic);
+#else
+	s_magic = super.s_magic;
+#endif
+
+	if (s_magic == EXT2_SUPER_MAGIC)
+		retval = 1;
+
+err_out:
+	io_channel_close(channel);
+
+open_err_out:
+
+	return retval;
+}
+
+static int mke2fs_setup_tdb(const char *name)
+{
+	char *tdb_dir, tdb_file[PATH_MAX];
+#if 0 /* FIXME!! */
+	/*
+	 * Configuration via a conf file would be
+	 * nice
+	 */
+	profile_get_string(profile, "scratch_files",
+					"directory", 0, 0,
+					&tdb_dir);
+#endif
+	tdb_dir = getenv("MKE2FS_SCRATCH_DIR");
+	if (!tdb_dir) {
+		printf(_("MKE2FS_SCRATCH_DIR not configured\n"));
+		printf(_("Using /var/lib/e2fsprogs\n"));
+		tdb_dir="/var/lib/e2fsprogs";
+	}
+	if (access(tdb_dir, W_OK)) {
+		fprintf(stderr,
+			_("Cannot create file under %s\n"),
+			tdb_dir);
+		return EXT2_ET_INVALID_ARGUMENT;
+
+	}
+
+	/* FIXME!! Should we generate Unique file name ?? */
+	sprintf(tdb_file, "%s/mke2fs-XXXXXX", tdb_dir);
+
+	if (!access(tdb_file, F_OK)) {
+		fprintf(stderr,
+			_("File exist %s\n"), tdb_file);
+		return EXT2_ET_INVALID_ARGUMENT;
+	}
+
+	set_undo_io_backup_file(tdb_file);
+	printf(_("previous filesystem detected; to undo "
+		 "the mke2fs operation, please run the "
+		 "command \n'undoe2fs %s %s' in order to recover\n\n"),
+		  tdb_file, name);
+	return 0;
+}
 int main (int argc, char *argv[])
 {
 	errcode_t	retval = 0;
@@ -1543,7 +1629,17 @@ int main (int argc, char *argv[])
 	io_ptr = test_io_manager;
 	test_io_backing_manager = unix_io_manager;
 #else
-	io_ptr = unix_io_manager;
+	if (fileystem_exist(device_name)) {
+
+		io_ptr = undo_io_manager;
+		set_undo_io_backing_manager(unix_io_manager);
+		retval = mke2fs_setup_tdb(device_name);
+		if (retval)
+			exit(1);
+
+	} else {
+		io_ptr = unix_io_manager;
+	}
 #endif
 
 	/*
-- 
1.5.3.rc2.22.g69a9b-dirty

  parent reply	other threads:[~2007-08-01  2:04 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-01  2:04 [PATCH 1/4] e2fsprogs: Add undo I/O manager Aneesh Kumar K.V
2007-08-01  2:04 ` Aneesh Kumar K.V
2007-08-01  2:04 ` [PATCH 2/4] e2fsprogs: Add undoe2fs Aneesh Kumar K.V
2007-08-01  2:04   ` Aneesh Kumar K.V
2007-08-01  6:02   ` Andreas Dilger
2007-08-01  6:16     ` Aneesh Kumar K.V
2007-08-01  6:33       ` Kalpak Shah
2007-08-01  7:10       ` Andreas Dilger
2007-08-01  7:52         ` Aneesh Kumar K.V
2007-08-01  8:27           ` Andreas Dilger
2007-08-01  2:04 ` Aneesh Kumar K.V [this message]
2007-08-01  2:04   ` [PATCH 3/4] e2fsprogs: Make mke2fs use undo I/O manager Aneesh Kumar K.V
2007-08-01  6:04   ` Andreas Dilger
2007-08-01  6:14     ` Aneesh Kumar K.V
2007-08-01  7:14       ` Andreas Dilger
2007-08-01  2:04 ` [PATCH 4/4] e2fsprogs: Support for large inode migration Aneesh Kumar K.V
2007-08-01  2:04   ` Aneesh Kumar K.V
  -- strict thread matches above, loose matches on Subject: below --
2007-08-01 15:34 e2fsprogs patches Aneesh Kumar K.V
2007-08-01 15:34 ` [PATCH 1/4] e2fsprogs: Add undo I/O manager Aneesh Kumar K.V
2007-08-01 15:34   ` [PATCH 2/4] e2fsprogs: Add undoe2fs Aneesh Kumar K.V
2007-08-01 15:34     ` [PATCH 1/4] e2fsprogs: Add undo I/O manager Aneesh Kumar K.V
2007-08-01 15:34       ` [PATCH 3/4] e2fsprogs: Make mke2fs use " Aneesh Kumar K.V
2007-08-01 15:34         ` Aneesh Kumar K.V

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=11859338623488-git-send-email-aneesh.kumar@linux.vnet.ibm.com \
    --to=aneesh.kumar@linux.vnet.ibm.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.