All of lore.kernel.org
 help / color / mirror / Atom feed
From: Theodore Tso <tytso@mit.edu>
To: "Jose R. Santos" <jrs@us.ibm.com>
Cc: linux-ext4@vger.kernel.org
Subject: Re: [PATCH][e2fsprogs] Allow user to disable Undo manager through MKE2FS_SCRATCH_DIR
Date: Sun, 6 Apr 2008 18:19:47 -0400	[thread overview]
Message-ID: <20080406221947.GA13284@mit.edu> (raw)
In-Reply-To: <20080404140235.28080.97243.stgit@gara.konoha.net>

On Fri, Apr 04, 2008 at 09:02:35AM -0500, Jose R. Santos wrote:
> diff --git a/misc/mke2fs.c b/misc/mke2fs.c
> index c8170f0..3f9cbe2 100644
> --- a/misc/mke2fs.c
> +++ b/misc/mke2fs.c
> @@ -1802,6 +1802,13 @@ static int filesystem_exist(const char *name)
>  	__u16	s_magic;
>  	struct ext2_super_block super;
>  	io_manager manager = unix_io_manager;
> +	char *tdb_dir;
> +
> +	tdb_dir = getenv("MKE2FS_SCRATCH_DIR");
> +	if (tdb_dir && !strcmp(tdb_dir, "disable")) {
> +		retval = 0;
> +		goto open_err_out;
> +	}


Yuck.  Yuck, Yuck, Yuck, Yuck.

This functionality has nothing to do with filesystem_exist() and
putting this kind of magic (a) means you have to read the environment
variable twice, and (b) makes the code less maintainable in the
long run.

While I was looking at the code, I also realized that the way the undo
code was written it also wasn't compatible with configure
--enable-testio-deug.

So here's a much better patch that does the right thing.

Looking over the undo code more closely, there's much I find that's
ugly about this patch, including the fact that after you make a
filesystem at some device, say /dev/sda1, you have to manually go and
rm the file /var/lib/e2fsprogs/mke2fs-sda1 or you get the
non-intuitive error message "File exist /var/lib/e2fsprogs/mke2fs-sda1".  
This made me reach for the barf bag; the undo-mgr patch branch needs
cleanup before it's going into mainline.  In any case, here's a much
better patch which co-exists with testio-debugging, and which actually
decreases the number of lines of the code to support the undo feature.

(This will be merged into the patch "e2fsprogs: Make mke2fs use undo
I/O manager" before the whole branch gets integrated into the next or
master branches, using the magic that is git rebase --interactive.
Also needing fixing is the code to hook into the profile lookup.)

	  	      	     	      	     - Ted

commit 11079defe6c4bc3577381a8669f9944408d77023
Author: Theodore Ts'o <tytso@mit.edu>
Date:   Sun Apr 6 18:08:12 2008 -0400

    Allow user to disable Undo manager through MKE2FS_SCRATCH_DIR
    
    Undo manager is a bit annoying when doing e2fsprogs testing since it
    makes mke2fs significatly slower.  Use the MKE2FS_SCRATCH_DIR=disable
    enviroment value to disable undo manager for those of us that blow up
    filesystems on a regular basis.
    
    Also fix so that the undo manager doesn't conflict with configure
    --enable-testio-debug.
    
    Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>

diff --git a/misc/mke2fs.c b/misc/mke2fs.c
index a23d841..06558d8 100644
--- a/misc/mke2fs.c
+++ b/misc/mke2fs.c
@@ -1605,7 +1605,7 @@ open_err_out:
 	return retval;
 }
 
-static int mke2fs_setup_tdb(const char *name)
+static int mke2fs_setup_tdb(const char *name, io_manager *io_ptr)
 {
 	errcode_t retval = 0;
 	char *tdb_dir, tdb_file[PATH_MAX];
@@ -1620,24 +1620,24 @@ static int mke2fs_setup_tdb(const char *name)
 			"directory", 0, 0,
 			&tdb_dir);
 #endif
-	tmp_name = strdup(name);
-	device_name = basename(tmp_name);
-
 	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 (!strcmp(tdb_dir, "disable"))
+		return 0;
+
 	if (access(tdb_dir, W_OK)) {
 		fprintf(stderr,
 			_("Cannot create file under %s\n"),
 			tdb_dir);
-		retval = EXT2_ET_INVALID_ARGUMENT;
-		goto err_out;
-
+		return (EXT2_ET_INVALID_ARGUMENT);
 	}
 
+	tmp_name = strdup(name);
+	device_name = basename(tmp_name);
 	sprintf(tdb_file, "%s/mke2fs-%s", tdb_dir, device_name);
 
 	if (!access(tdb_file, F_OK)) {
@@ -1647,6 +1647,8 @@ static int mke2fs_setup_tdb(const char *name)
 		goto err_out;
 	}
 
+	set_undo_io_backing_manager(*io_ptr);
+	*io_ptr = undo_io_manager;
 	set_undo_io_backup_file(tdb_file);
 	printf(_("previous filesystem detected; to undo "
 		"the mke2fs operation, please run the "
@@ -1679,18 +1681,14 @@ int main (int argc, char *argv[])
 	io_ptr = test_io_manager;
 	test_io_backing_manager = unix_io_manager;
 #else
-	if (filesystem_exist(device_name)) {
+	io_ptr = unix_io_manager;
+#endif
 
-		io_ptr = undo_io_manager;
-		set_undo_io_backing_manager(unix_io_manager);
-		retval = mke2fs_setup_tdb(device_name);
+	if (filesystem_exist(device_name)) {
+		retval = mke2fs_setup_tdb(device_name, &io_ptr);
 		if (retval)
 			exit(1);

  reply	other threads:[~2008-04-06 23:12 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-04-04 14:02 [PATCH][e2fsprogs] Allow user to disable Undo manager through MKE2FS_SCRATCH_DIR Jose R. Santos
2008-04-06 22:19 ` Theodore Tso [this message]
2008-04-07  1:44   ` Eric Sandeen
2008-04-07  4:20     ` Theodore Tso
2008-04-07 15:02   ` 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=20080406221947.GA13284@mit.edu \
    --to=tytso@mit.edu \
    --cc=jrs@us.ibm.com \
    --cc=linux-ext4@vger.kernel.org \
    /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.