2002-11-18 14:20:38

by Adam J. Richter

[permalink] [raw]
Subject: Patch(2.5.48)?: initial ramdisk broken

linux-2.5.48 adds some kind of pseudo-filesytem in
init/do_mounts.c. The expanded code cannot find the initial ramdisk
if you use devfs, due to a problem either with its interpretation of
results from sys_getdents64, or the corresponding implementation in
devfs. do_read_dir attempts to fill a 512 byte buffer. getdents
returns 400+ bytes the first time. Then do_read_dir calls getdents
again, asking it to read the remaining bytes, which I guess is not
enough space to hold an additional entry, to which getdents return
-EINVAL. I'm not sure who is wrong: getdents or the new do_mounts.c
code that interprets its return values.

Here is a possible patch, on the assumption that getdents is
right and the new code in do_mounts.c is wrong. I am not sure of its
correctness, although it works.

By the way, I'd be interested in knowing the benefits of the
new code in init/do_mounts.c. A compressed romfs initial ramdisk
has worked fine for me up to this point.

Adam J. Richter __ ______________ 575 Oroville Road
[email protected] \ / Milpitas, California 95035
+1 408 309-6081 | g g d r a s i l United States of America
"Free Software For The Rest Of Us."

--- linux-2.5.48/init/do_mounts.c 2002-11-17 20:29:31.000000000 -0800
+++ linux/init/do_mounts.c 2002-11-18 04:21:27.000000000 -0800
@@ -355,17 +355,17 @@
break;
n = do_read_dir(fd, p, size);
if (n > 0) {
close(fd);
*len = n;
return p;
}
kfree(p);
- if (n < 0)
+ if (n < 0 && n != -EINVAL)
break;
}
close(fd);
return NULL;
}
#endif

struct linux_dirent64 {