int enough(int level, int raid_disks, int avail_disks)
{
switch (level) {
+ case 10: return 1; /* a lie, but it is hard to tell */
+
case -4:
return avail_disks>= 1;
case -1:
* 6 - wrong major version
*/
unsigned long size;
+ unsigned long long dsize;
unsigned long long offset;
- if (ioctl(fd, BLKGETSIZE, &size))
- return 1;
+#ifdef BLKGETSIZE64
+ if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
+#endif
+ {
+ if (ioctl(fd, BLKGETSIZE, &size))
+ return 1;
+ else
+ dsize = size << 9;
+ }
- if (size < MD_RESERVED_SECTORS*2)
+ if (dsize < MD_RESERVED_SECTORS*2)
return 2;
- offset = MD_NEW_SIZE_SECTORS(size);
+ offset = MD_NEW_SIZE_SECTORS(dsize>>9);
offset *= 512;
int store_super(int fd, mdp_super_t *super)
{
- long size;
+ unsigned long size;
+ unsigned long long dsize;
+
long long offset;
- if (ioctl(fd, BLKGETSIZE, &size))
- return 1;
+#ifdef BLKGETSIZE64
+ if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
+#endif
+ {
+ if (ioctl(fd, BLKGETSIZE, &size))
+ return 1;
+ else
+ dsize = ((unsigned long long)size) << 9;
+ }
- if (size < MD_RESERVED_SECTORS*2)
+ if (dsize < MD_RESERVED_SECTORS*2)
return 2;
- offset = MD_NEW_SIZE_SECTORS(size);
+ offset = MD_NEW_SIZE_SECTORS(dsize>>9);
offset *= 512;
return UnSet;
}
+
+int is_standard(char *dev)
+{
+ /* tests if dev is a "standard" md dev name.
+ * i.e if the last component is "/dNN" or "/mdNN",
+ * where NN is a string of digits
+ */
+ dev = strrchr(dev, '/');
+ if (!dev)
+ return 0;
+ if (strncmp(dev, "/d",2)==0)
+ dev += 2;
+ else if (strncmp(dev, "/md", 3)==0)
+ dev += 3;
+ else
+ return 0;
+ if (!*dev)
+ return 0;
+ while (isdigit(*dev))
+ dev++;
+ if (*dev)
+ return 0;
+ return 1;
+}
+
+
/*
* convert a major/minor pair for a block device into a name in /dev, if possible.
* On the first call, walk /dev collecting name.
return 0;
}
-int is_standard(char *dev)
-{
- /* tests if dev is a "standard" md dev name.
- * i.e if the last component is "/dNN" or "/mdNN",
- * where NN is a string of digits
- */
- dev = strrchr(dev, '/');
- if (!dev)
- return 0;
- if (strncmp(dev, "/d",2)==0)
- dev += 2;
- else if (strncmp(dev, "/md", 3)==0)
- dev += 3;
- else
- return 0;
- if (!*dev)
- return 0;
- while (isdigit(*dev))
- dev++;
- if (*dev)
- return 0;
- return 1;
-}
-
-
/*
* Find a block device with the right major/minor number.
* Avoid /dev/mdNN and /dev/md/dNN is possible