On Thu, 2002-08-29 at 02:43, Jordan Breeding wrote:
> Andreas Dilger wrote:
> > On Aug 29, 2002 05:20 +0000, [EMAIL PROTECTED] wrote:
> >
> >> This patch was originally intended to try and add
> >>support for reiserfs labels to mount from
> >>util-linux-2.11u found on ftp.kernel.org. It is not
> >>quite working (if I try to mount something by label the
> >>mount program seg. faults), and I won't have time to
> >>debug and look at it until at least tomorrow night. I am
> >>sure there is something trivial or stupid that I have
> >>done wrong. At least it is a starting point, if someone
> >>knows what is wrong and knows how to fix it quickly then
> >>feel free to fix the patch and send it back to me or send
> >>it to the util-linux maintainer.
> >
Hi Jordan,
Here's my current patch, the only bug is that can detect 3.5.x
filesystems with a relocated journal as 3.6.x (with a label/uuid).
Once I get that fixed I'll send along to the mount maintainer:
diff -ur util-linux-2.11u/mount/linux_fs.h util-linux-2.11u.mason/mount/linux_fs.h
--- util-linux-2.11u/mount/linux_fs.h Sat Aug 3 17:09:43 2002
+++ util-linux-2.11u.mason/mount/linux_fs.h Mon Aug 19 14:36:30 2002
@@ -83,9 +83,15 @@
u_char s_oid_cursize[2];
u_char s_state[2];
u_char s_magic[12];
+
+ /* only valid in 3.6.x format [EMAIL PROTECTED] */
+ u_char s_dummy[20];
+ u_char s_uuid[16];
+ u_char s_label[16];
};
#define REISERFS_SUPER_MAGIC_STRING "ReIsErFs"
#define REISER2FS_SUPER_MAGIC_STRING "ReIsEr2Fs"
+#define REISER2FS_JR_SUPER_MAGIC_STRING "ReIsEr3Fs"
#define REISERFS_DISK_OFFSET_IN_BYTES (64 * 1024)
/* the spot for the super in versions 3.5 - 3.5.10 (inclusive) */
#define REISERFS_OLD_DISK_OFFSET_IN_BYTES (8 * 1024)
diff -ur util-linux-2.11u/mount/mount_by_label.c
util-linux-2.11u.mason/mount/mount_by_label.c
--- util-linux-2.11u/mount/mount_by_label.c Sat Aug 3 20:07:10 2002
+++ util-linux-2.11u.mason/mount/mount_by_label.c Mon Aug 19 14:37:39 2002
@@ -17,6 +17,8 @@
* - Added JFS v2 format support
* 2002-07-26 Luciano Chavez <[EMAIL PROTECTED]>
* - Added EVMS support
+ * 2002-08-19 Chris Mason <[EMAIL PROTECTED]>
+ * - Added ReiserFS support
*/
#include <stdio.h>
@@ -69,6 +71,24 @@
return (mdsbmagic(mdsb) == MD_SB_MAGIC);
}
+static int valid_reiserfs_v2_super(struct reiserfs_super_block *s) {
+
+ /* only 3.6.x format supers have labels or uuids */
+ if (!strncmp(s->s_magic, REISER2FS_SUPER_MAGIC_STRING,
+ strlen(REISER2FS_SUPER_MAGIC_STRING)) ||
+ !strncmp(s->s_magic, REISER2FS_JR_SUPER_MAGIC_STRING,
+ strlen(REISER2FS_JR_SUPER_MAGIC_STRING))) {
+ return 1;
+ }
+
+ /* old format disks won't have a 3.6.x super in their log
+ * area. They might have a 3.5.x super in there, but not
+ * a new format one. So, we don't need to do any special
+ * checks to make sure we aren't inside the log
+ */
+ return 0;
+}
+
/* for now, only ext2, ext3 and xfs are supported */
static int
get_label_uuid(const char *device, char **label, char *uuid) {
@@ -81,6 +101,7 @@
struct ext2_super_block e2sb;
struct xfs_super_block xfsb;
struct jfs_super_block jfssb;
+ struct reiserfs_super_block reisersb;
fd = open(device, O_RDONLY);
if (fd < 0)
@@ -127,6 +148,18 @@
memcpy(*label, jfssb.s_label, namesize);
}
rv = 0;
+ }
+ else if (lseek(fd, REISERFS_DISK_OFFSET_IN_BYTES, SEEK_SET) ==
+ REISERFS_DISK_OFFSET_IN_BYTES &&
+ read(fd, (char *) &reisersb, sizeof(reisersb)) ==
+ sizeof(reisersb)
+ && valid_reiserfs_v2_super(&reisersb)) {
+
+ memcpy(uuid, reisersb.s_uuid, sizeof(reisersb.s_uuid));
+ namesize = sizeof(reisersb.s_label);
+ if ((*label = calloc(namesize + 1, 1)) != NULL)
+ memcpy(*label, reisersb.s_label, namesize);
+ rv = 0;
}
close(fd);
diff -ur util-linux-2.11u/mount/mount_guess_fstype.c
util-linux-2.11u.mason/mount/mount_guess_fstype.c
--- util-linux-2.11u/mount/mount_guess_fstype.c Sat Aug 3 18:22:07 2002
+++ util-linux-2.11u.mason/mount/mount_guess_fstype.c Mon Aug 19 14:36:30 2002
@@ -221,7 +221,9 @@
return (!strncmp (rs->s_magic, REISERFS_SUPER_MAGIC_STRING,
strlen ( REISERFS_SUPER_MAGIC_STRING)) ||
!strncmp (rs->s_magic, REISER2FS_SUPER_MAGIC_STRING,
- strlen ( REISER2FS_SUPER_MAGIC_STRING)));
+ strlen ( REISER2FS_SUPER_MAGIC_STRING))||
+ !strncmp (rs->s_magic, REISER2FS_JR_SUPER_MAGIC_STRING,
+ strlen ( REISER2FS_JR_SUPER_MAGIC_STRING)));
}
char *