]> git.pld-linux.org Git - packages/mdadm.git/blame - mdadm-BOOT.patch
- detect 0 devices, too
[packages/mdadm.git] / mdadm-BOOT.patch
CommitLineData
d00216b1
MM
1diff -ur mdctl/util.c mdctl-/util.c
2--- mdctl/util.c Thu Jul 26 07:30:28 2001
3+++ mdctl-/util.c Mon Aug 6 19:01:03 2001
4@@ -30,6 +30,7 @@
5 #include "mdctl.h"
6 #include "md_p.h"
7 #include <sys/utsname.h>
8+#include <dirent.h>
9
10 /*
11 * Parse a 128 bit uuid in 4 integers
12@@ -364,51 +365,78 @@
13 /*
14 * convert a major/minor pair for a block device into a name in /dev, if possible.
15 * On the first call, walk /dev collecting name.
16- * Put them in a simple linked listfor now.
17 */
18-struct devmap {
19- int major, minor;
20- char *name;
21- struct devmap *next;
22-} *devlist = NULL;
23-int devlist_ready = 0;
24-
25-#define __USE_XOPEN_EXTENDED
26-#include <ftw.h>
27
28+int devlist_ready = 0;
29+char **devlist[256];
30
31-int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s)
32+void collect_devs(const char *name)
33 {
34- if ((stb->st_mode&S_IFMT)== S_IFBLK) {
35- char *n = strdup(name);
36- struct devmap *dm = malloc(sizeof(*dm));
37- if (dm) {
38- dm->major = MAJOR(stb->st_rdev);
39- dm->minor = MINOR(stb->st_rdev);
40- dm->name = n;
41- dm->next = devlist;
42- devlist = dm;
43+ DIR *d;
44+ struct dirent *e;
45+ int n = strlen(name);
46+ char *cur;
47+ int major, minor;
48+ struct stat st;
49+
50+ chdir(name);
51+ d = opendir(".");
52+ if (d == NULL)
53+ return;
54+
55+ while ((e = readdir(d))) {
56+ stat(e->d_name, &st);
57+ if (strcmp(e->d_name, ".") == 0 || strcmp(e->d_name, "..") == 0)
58+ continue;
59+ if (!S_ISDIR(st.st_mode) && !S_ISBLK(st.st_mode))
60+ continue;
61+ cur = malloc(n + strlen(e->d_name) + 2);
62+ strcpy(cur, name);
63+ cur[n] = '/';
64+ strcpy(cur + n + 1, e->d_name);
65+ if (S_ISDIR(st.st_mode)) {
66+ lstat(name, &st);
67+ if (!S_ISLNK(st.st_mode))
68+ collect_devs(cur);
69+ free(cur);
70+ chdir(name);
71+ } else {
72+ major = MAJOR(st.st_rdev) & 0xff;
73+ minor = MINOR(st.st_rdev) & 0xff;
74+
75+ if (devlist[major] == NULL)
76+ devlist[major] = calloc(sizeof(char*), 256);
77+ /* shortest name wins, this can be quite usable
78+ * with devfs and devfsd (/dev/hdaX links)
79+ */
80+ if (devlist[major][minor] &&
81+ strlen(devlist[major][minor]) < strlen(cur))
82+ free(cur);
83+ else {
84+ free(devlist[major][minor]);
85+ devlist[major][minor] = cur;
86+ }
87+ }
88 }
89- }
90- return 0;
91+
92+ closedir(d);
93 }
94
95 char *map_dev(int major, int minor)
96 {
97- struct devmap *p;
98 if (!devlist_ready) {
99- nftw("/dev", add_dev, 10, FTW_PHYS);
100+ collect_devs("/dev");
101 devlist_ready=1;
102 }
103
104- for (p=devlist; p; p=p->next)
105- if (p->major == major &&
106- p->minor == minor)
107- return p->name;
108- return NULL;
109+ major &= 0xff;
110+ minor &= 0xff;
111+ if (devlist[major])
112+ return devlist[major][minor];
113+ else
114+ return NULL;
115 }
116
117-
118 int calc_sb_csum(mdp_super_t *super)
119 {
120 unsigned int oldcsum = super->sb_csum;
121@@ -424,3 +452,14 @@
122 super->sb_csum = oldcsum;
123 return csum;
124 }
125+
126+#ifdef __UCLIBC__
127+long long lseek64(int fd, long long off, int w)
128+{
129+ long long res;
130+
131+ llseek(fd, off >> 32, off & 0xffffffff, &res, w);
132+
133+ return res;
134+}
135+#endif
136diff -ur mdctl/mdctl.h mdctl-/mdctl.h
137--- mdctl/mdadm.h Tue Jun 19 01:56:53 2001
138+++ mdctl-/mdadm.h Fri Mar 15 14:01:40 2002
139@@ -29,7 +29,6 @@
140
141 #define __USE_LARGEFILE64
142 #include <unistd.h>
143-extern __off64_t lseek64 __P ((int __fd, __off64_t __offset, int __whence));
144
145 #include <sys/types.h>
146 #include <sys/stat.h>
147@@ -41,6 +40,8 @@
148 #include <errno.h>
149 #include <string.h>
150
151+#define __KERNEL_STRICT_NAMES
152+
153 #include <linux/kdev_t.h>
154 #include <linux/fs.h>
155 #include <sys/ioctl.h>
This page took 0.064103 seconds and 4 git commands to generate.