All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joachim Wagner <jwagner@computing.dcu.ie>
To: reiserfs-list@namesys.com
Subject: fsck option --lost-and-found
Date: Wed, 27 Dec 2006 18:16:54 +0100	[thread overview]
Message-ID: <200612271816.54908.jwagner@computing.dcu.ie> (raw)

[-- Attachment #1: Type: text/plain, Size: 1594 bytes --]

Hi!

The attached patch extends reiserfsck to read the name of the lost+found 
directory from the command line option --lost-and-found. I regard it as a 
"trivial improvement" for the purpose of licencing as described in the 
reiserfsprogs README.

Motivation: Due to some problems with my external USB drive, I had to run 
reiserfsck --rebuild-tree -S. Unfortunately, I deleted the directory 
"lost+found" a while ago and reiserfsck 3.6.18 aborted in line 348 of 
lost+found.c. Afterwards, it wasn't possible to mount the fs in order to 
create the directory. I downloaded the 3.6.19 source, replaced all 
occurrences of the constant string "lost+found" with an existing directory 
and then could finish the filesystem check (recovering many files).

The patched version passed the attached test script.

I also ran the same test with an additional dd if=/dev/urandom bs=1024k 
count=320 >> /temp.img between the other two dd commands. The immediate mount 
produced an error message, but reiserfsck still worked fine. However, running 
it a second time with a different lost+found directory name (home), I got 
many new errors in pass0 (mostly wrong order of items), all numbered files 
from /etc (lost+found of 1st run) disappeared and many numbered files 
appeared in /home. Running it a 2nd time, there are still some errors. Does 
this mean
 * that there is a fundamental problem with changing the
    lost+found directory name or
 * that a successfull reiserfsck run does not guarantee a
    consistent filesystem or
 * is this just an artifact of the -S option?

Happy New Year!
Joachim

[-- Attachment #2: lostfound.patch --]
[-- Type: text/x-diff, Size: 6844 bytes --]

diff -U 3 -r reiserfsprogs-3.6.19-orig/fsck/fsck.h reiserfsprogs-3.6.19/fsck/fsck.h
--- reiserfsprogs-3.6.19-orig/fsck/fsck.h	2004-10-01 14:03:43.000000000 +0200
+++ reiserfsprogs-3.6.19/fsck/fsck.h	2006-12-27 12:41:32.000000000 +0100
@@ -406,6 +406,7 @@
     struct check_info check;
 
     char * journal_dev_name; 
+    char * lost_found_name;
     /* log file name and handle */
     char * log_file_name;
     FILE * log;
diff -U 3 -r reiserfsprogs-3.6.19-orig/fsck/lost+found.c reiserfsprogs-3.6.19/fsck/lost+found.c
--- reiserfsprogs-3.6.19-orig/fsck/lost+found.c	2004-09-16 09:17:27.000000000 +0200
+++ reiserfsprogs-3.6.19/fsck/lost+found.c	2006-12-27 12:39:24.000000000 +0100
@@ -341,16 +341,17 @@
 
     /* update /lost+found sd_size and sd_blocks (nlink is correct already) */
 
-    objectid = reiserfs_find_entry (fs, &root_dir_key, "lost+found",
+    objectid = reiserfs_find_entry (fs, &root_dir_key, fsck_data(fs)->lost_found_name,
                                        &gen_counter, &lost_found_dir_key);
 
     if (!objectid) {
-       reiserfs_panic ("look_for_lost: The entry 'lost+found' could not be found in the root directory.");
+       reiserfs_panic ("look_for_lost: The entry '%s' could not be found in the root directory.",
+			fsck_data(fs)->lost_found_name);
     }
 
     if (reiserfs_search_by_key_4 (fs, &lost_found_dir_key, &path) != ITEM_FOUND)
-	reiserfs_panic ("look_for_lost: The StatData of the 'lost+found' directory %K could not be found",
-			&lost_found_dir_key);
+	reiserfs_panic ("look_for_lost: The StatData of the '%s' directory %K could not be found",
+			fsck_data(fs)->lost_found_name, &lost_found_dir_key);
     ih = get_ih (&path);
     sd = get_item (&path);
     get_sd_size (ih, sd, &sd_size);
diff -U 3 -r reiserfsprogs-3.6.19-orig/fsck/main.c reiserfsprogs-3.6.19/fsck/main.c
--- reiserfsprogs-3.6.19-orig/fsck/main.c	2004-10-07 16:04:08.000000000 +0200
+++ reiserfsprogs-3.6.19/fsck/main.c	2006-12-27 13:54:13.000000000 +0100
@@ -16,6 +16,8 @@
 reiserfs_filsys_t * fs;
 char * badblocks_file;
 
+#define LOST_FOUND_DEFAULT "lost+found"
+
 #define print_usage_and_exit() {						\
 fsck_progress ("Usage: %s [mode] [options] "					\
 " device\n"									\
@@ -42,6 +44,7 @@
 "  -f and -r\t\t\tignored\n"							\
 "Expert options:\n"								\
 "  --no-journal-available\tdo not open nor replay journal\n"			\
+"  -L | --lost-and-found directory\tname of the " LOST_FOUND_DEFAULT " directory\n"	\
 "  -S | --scan-whole-partition\tbuild tree of all blocks of the device\n\n",	\
   argv[0]);									\
 										\
@@ -99,6 +102,7 @@
 	    /* options */
 	    {"logfile", required_argument, 0, 'l'},
 	    {"badblocks", required_argument, 0, 'B'},
+	    {"lost-and-found", required_argument, 0, 'L'},
 	    {"interactive", no_argument, 0, 'i'},
 	    {"adjust-size", no_argument, 0, 'z'},
 	    {"quiet", no_argument, 0, 'q'},
@@ -131,7 +135,7 @@
 	};
 	int option_index;
       
-	c = getopt_long (argc, argv, "iql:nb:Szd:R:h:j:gafVrpyt:B:",
+	c = getopt_long (argc, argv, "iql:nb:Szd:R:h:j:gafVrpyt:B:L:",
 			 options, &option_index);
 	if (c == -1)
 	    break;
@@ -167,6 +171,10 @@
 		    optarg, strerror(errno));	    
 	    break;
 
+	case 'L': /* name of lost+found directory */
+	    asprintf (&data->lost_found_name, "%s", optarg);
+	    break;
+
 	case 'n': /* --nolog */
 	    data->options |= OPT_SILENT;
 	    break;
@@ -1217,6 +1225,7 @@
     }
 
     data = getmem (sizeof (struct fsck_data));
+    data->lost_found_name = LOST_FOUND_DEFAULT;
 
     file_name = parse_options (data, argc, argv);
 
diff -U 3 -r reiserfsprogs-3.6.19-orig/fsck/reiserfsck.8 reiserfsprogs-3.6.19/fsck/reiserfsck.8
--- reiserfsprogs-3.6.19-orig/fsck/reiserfsck.8	2004-10-13 14:53:30.000000000 +0200
+++ reiserfsprogs-3.6.19/fsck/reiserfsck.8	2006-12-27 14:10:05.000000000 +0100
@@ -15,6 +15,7 @@
 [ \fB-n\fR | \fB--nolog\fR ]
 [ \fB-B\fR | \fB--badblocks \fIfile\fR ]
 [ \fB-l\fR | \fB--logfile \fIfile\fR ]
+[ \fB-L\fR | \fB--lost-and-found \fIdirectory-name\fR ]
 [ \fB-q\fR | \fB--quiet\fR ]
 [ \fB-y\fR | \fB--yes\fR ]
 .\" [ \fB-b\fR | \fB--scan-marked-in-bitmap \fIbitmap-filename\fR ]
@@ -101,6 +102,14 @@
 This option causes \fBreiserfsck\fR to report any corruption it finds 
 to the specified log file rather than to stderr.
 .TP
+\fB--lost-and-found \fIdirectory-name\fR, \fB-L \fI directory-name\fR
+This option sets the name of the directory to store lost and found
+items (files, directories, etc.). Default is 'lost+found'. 
+Normally, \fBreiserfsck\fR will create the directory if it does not
+exist.
+If it fails, you may have luck with a different (existing) top-level
+directory, for example a login name in case of a /home filesystem.
+.TP
 .B --nolog, -n
 This option prevents \fBreiserfsck\fR from reporting any kinds of corruption.
 .TP
diff -U 3 -r reiserfsprogs-3.6.19-orig/fsck/semantic_rebuild.c reiserfsprogs-3.6.19/fsck/semantic_rebuild.c
--- reiserfsprogs-3.6.19-orig/fsck/semantic_rebuild.c	2004-09-15 15:54:22.000000000 +0200
+++ reiserfsprogs-3.6.19/fsck/semantic_rebuild.c	2006-12-27 12:48:55.000000000 +0100
@@ -1069,13 +1069,13 @@
 
     /* look for "lost+found" in the root directory */
     retval = reiserfs_find_entry (fs, &root_dir_key,
-				  "lost+found", &gen_counter,
+				  fsck_data(fs)->lost_found_name, &gen_counter,
 				  &lost_found_dir_key);
     if (!retval) {
 	objectid = id_map_alloc(proper_id_map(fs));
 	if (!objectid) {
-	    fsck_progress ("Could not allocate an objectid for \"/lost+found\", \
-		lost files will not be linked\n");
+	    fsck_progress ("Could not allocate an objectid for \"/%s\", \
+		lost files will not be linked\n", fsck_data(fs)->lost_found_name);
 	    return;
 	}
 	set_key_dirid (&lost_found_dir_key, REISERFS_ROOT_OBJECTID);
@@ -1096,8 +1096,8 @@
 	fix_obviously_wrong_sd_mode (&path);
 	
 	if (not_a_directory (get_item (&path))) {
-	    fsck_progress ("\"/lost+found\" exists, but it is not a directory, \
-		lost files will not be linked\n");
+	    fsck_progress ("\"/%s\" exists, but it is not a directory, \
+		lost files will not be linked\n", fsck_data(fs)->lost_found_name);
 	    set_key_objectid (&lost_found_dir_key, 0);
 	    pathrelse (&path);
 	    return;
@@ -1114,8 +1114,9 @@
     reiserfs_add_entry (fs, &lost_found_dir_key, "..", name_length ("..", lost_found_dir_format),
     		&root_dir_key, 1 << IH_Unreachable);
 
-    item_len = reiserfs_add_entry (fs, &root_dir_key, "lost+found",
-    		name_length ("lost+found", root_dir_format), &lost_found_dir_key, 1 << IH_Unreachable);
+    item_len = reiserfs_add_entry (fs, &root_dir_key, fsck_data(fs)->lost_found_name,
+    		name_length (fsck_data(fs)->lost_found_name, root_dir_format),
+		&lost_found_dir_key, 1 << IH_Unreachable);
 
     if (item_len) {
 	if (reiserfs_search_by_key_4 (fs, &root_dir_key, &path) == ITEM_NOT_FOUND)

[-- Attachment #3: test.sh --]
[-- Type: application/x-shellscript, Size: 1011 bytes --]

             reply	other threads:[~2006-12-27 17:16 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-27 17:16 Joachim Wagner [this message]
     [not found] ` <200612281612.18265.vs@namesys.com>
2006-12-30 12:37   ` fsck option --lost-and-found Joachim Wagner
     [not found]     ` <200612310407.08436.vs@namesys.com>
2007-01-02 18:10       ` Joachim Wagner

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=200612271816.54908.jwagner@computing.dcu.ie \
    --to=jwagner@computing.dcu.ie \
    --cc=reiserfs-list@namesys.com \
    /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.