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