diff options
author | Neil Brown <neilb@suse.de> | 2006-03-28 22:44:05 +0000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2006-03-28 22:44:05 +0000 |
commit | bed256c2419986e3a935680a7ead1def11ea08e7 (patch) | |
tree | 3c06bb613f244208fc30bfef21a9423eba094542 /util.c | |
parent | 4027ddcaa4b613a2ac2e6aa4eb0b157d7708f156 (diff) | |
download | mdadm-bed256c2419986e3a935680a7ead1def11ea08e7.tar.gz mdadm-bed256c2419986e3a935680a7ead1def11ea08e7.tar.xz mdadm-bed256c2419986e3a935680a7ead1def11ea08e7.zip |
Add information about reshape to --detail
Also fix problems with dev names and symlinks
Signed-off-by: Neil Brown <neilb@suse.de>
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 32 |
1 files changed, 19 insertions, 13 deletions
@@ -381,20 +381,26 @@ int nftw(const char *path, int (*han)(const char *name, const struct stat *stb, int add_dev(const char *name, const struct stat *stb, int flag, struct FTW *s) { - if ((stb->st_mode&S_IFMT)== S_IFBLK) { - char *n = strdup(name); - struct devmap *dm = malloc(sizeof(*dm)); - if (strncmp(n, "/dev/.", 6)==0) - strcpy(n+4, name+6); - if (dm) { - dm->major = major(stb->st_rdev); - dm->minor = minor(stb->st_rdev); - dm->name = n; - dm->next = devlist; - devlist = dm; + struct stat st; + if (S_ISLNK(stb->st_mode)) { + stat(name, &st); + stb = &st; } - } - return 0; + + if ((stb->st_mode&S_IFMT)== S_IFBLK) { + char *n = strdup(name); + struct devmap *dm = malloc(sizeof(*dm)); + if (strncmp(n, "/dev/./", 7)==0) + strcpy(n+4, name+6); + if (dm) { + dm->major = major(stb->st_rdev); + dm->minor = minor(stb->st_rdev); + dm->name = n; + dm->next = devlist; + devlist = dm; + } + } + return 0; } /* |