From: Kenn H. <ke...@us...> - 2003-07-21 23:52:11
|
Update of /cvsroot/linux-vax/kernel-2.5/init In directory sc8-pr-cvs1:/tmp/cvs-serv3612/init Modified Files: do_mounts.c Log Message: Merge with 2.5.55 Index: do_mounts.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.5/init/do_mounts.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- do_mounts.c 7 Jul 2003 23:48:09 -0000 1.5 +++ do_mounts.c 21 Jul 2003 23:52:05 -0000 1.6 @@ -13,6 +13,7 @@ #include <linux/suspend.h> #include <linux/root_dev.h> #include <linux/mount.h> +#include <linux/dirent.h> #include <linux/security.h> #include <linux/nfs_fs.h> @@ -324,22 +325,32 @@ #endif #ifdef CONFIG_DEVFS_FS + +/* + * If the dir will fit in *buf, return its length. If it won't fit, return + * zero. Return -ve on error. + */ static int __init do_read_dir(int fd, void *buf, int len) { long bytes, n; char *p = buf; lseek(fd, 0, 0); - for (bytes = 0, p = buf; bytes < len; bytes += n, p+=n) { - n = sys_getdents64(fd, p, len - bytes); + for (bytes = 0; bytes < len; bytes += n) { + n = sys_getdents64(fd, p + bytes, len - bytes); if (n < 0) - return -1; + return n; if (n == 0) return bytes; } return 0; } +/* + * Try to read all of a directory. Returns the contents at *p, which + * is kmalloced memory. Returns the number of bytes read at *len. Returns + * NULL on error. + */ static void * __init read_dir(char *path, int *len) { int size; @@ -349,7 +360,7 @@ if (fd < 0) return NULL; - for (size = 1<<9; size < (1<<18); size <<= 1) { + for (size = 1 << 9; size <= (1 << MAX_ORDER); size <<= 1) { void *p = kmalloc(size, GFP_KERNEL); int n; if (!p) @@ -361,6 +372,8 @@ return p; } kfree(p); + if (n == -EINVAL) + continue; /* Try a larger buffer */ if (n < 0) break; } @@ -368,14 +381,6 @@ return NULL; } #endif - -struct linux_dirent64 { - u64 d_ino; - s64 d_off; - unsigned short d_reclen; - unsigned char d_type; - char d_name[0]; -}; static int __init find_in_devfs(char *path, dev_t dev) { |