- if (fd < 0) {
- if (!st->err)
- alert("DeviceDisappeared", dev, NULL, ainfo);
- st->err=1;
- return 0;
- }
- fcntl(fd, F_SETFD, FD_CLOEXEC);
- if (ioctl(fd, GET_ARRAY_INFO, &array)<0) {
- if (!st->err)
- alert("DeviceDisappeared", dev, NULL, ainfo);
- st->err=1;
- close(fd);
- return 0;
- }
- /* It's much easier to list what array levels can't
- * have a device disappear than all of them that can
- */
- if (array.level == 0 || array.level == -1) {
- if (!st->err)
- alert("DeviceDisappeared", dev, "Wrong-Level", ainfo);
- st->err = 1;
- close(fd);
- return 0;
- }
- if (st->devnum == INT_MAX) {
- struct stat stb;
- if (fstat(fd, &stb) == 0 &&
- (S_IFMT&stb.st_mode)==S_IFBLK) {
- if (major(stb.st_rdev) == MD_MAJOR)
- st->devnum = minor(stb.st_rdev);
- else
- st->devnum = -1- (minor(stb.st_rdev)>>6);
- }
- }