Hello! I'm a bit disappointed that the bug with option parsing in reiserfs wasn't fixed in 2.4.9-ac13. It's a serious issue that prevents mounting reiserfs partitions on system startup (except root partition).
Anyway, I'm using this opportunity to send a better patch. The only difference is that the faulty code has been actually identified and fixed (do-while becomes while), not just worked around by a sanity check. "pos" is initialized with "options", not NULL, because kgetopt() effectively does it anyway, but the value of "pos" is now used earlier. I also included fixes for the typos that I encountered while fixing and testing my patch. The patch has been tested by multiple mounting and unmounting a reiserfs partition with specific (notail) and generic (ro) flags in different combinations. Simplification of kgetopt() is possible, but I'm intentionally avoiding code changes other that the most urgent fix. The patch is also available here: http://www.red-bean.com/~proski/linux/reiserfs-parse.diff --------------------------------------------------- --- linux.orig/fs/reiserfs/super.c +++ linux/fs/reiserfs/super.c @@ -144,8 +144,8 @@ static int kgetopt (char * options, opt_ int len_arg; ptr1 = (*pos ? *pos : options); - ptr2 = NULL; /* here we will put pounter on '=' */ - ptr3 = NULL; /* here we will put pounter on ',' */ + ptr2 = NULL; /* here we will put pointer on '=' */ + ptr3 = NULL; /* here we will put pointer on ',' */ if (!options) return -1; @@ -164,7 +164,7 @@ static int kgetopt (char * options, opt_ } } if (!option_exists) { - printk ("reiserfs kgetopt: there is not option %s\n", ptr1); + printk ("reiserfs kgetopt: unrecognized option %s\n", ptr1); return -1; } if (ptr2) { @@ -213,7 +213,7 @@ static int parse_options ( { int c; char * arg = NULL; - char * pos = NULL; + char * pos = options; char * p = NULL; arg_desc_t hash[] = { {"rupasov", FORCE_RUPASOV_HASH}, @@ -227,7 +227,7 @@ static int parse_options ( /* use default configuration: create tails, journaling on, no conversion to newest format */ return 1; - do { + while (*pos != '\0') { opt_desc_t opts[] = { {"notail", 0, 0, NOTAIL}, {"conv", 0, 0, REISERFS_CONVERT}, @@ -251,7 +251,7 @@ static int parse_options ( return 0; } } - } while (*pos != '\0'); + } return 1; } --------------------------------------------------- Regards, Pavel Roskin