+#ifndef MDASSEMBLE
+static int validate_geometry0(struct supertype *st, int level,
+ int layout, int raiddisks,
+ int *chunk, unsigned long long size,
+ unsigned long long data_offset,
+ char *subdev, unsigned long long *freesize,
+ int verbose)
+{
+ unsigned long long ldsize;
+ int fd;
+ unsigned int tbmax = 4;
+
+ /* prior to linux 3.1, a but limits usable device size to 2TB.
+ * It was introduced in 2.6.29, but we won't worry about that detail
+ */
+ if (get_linux_version() < 3001000)
+ tbmax = 2;
+
+ if (level == LEVEL_CONTAINER) {
+ if (verbose)
+ pr_err("0.90 metadata does not support containers\n");
+ return 0;
+ }
+ if (raiddisks > MD_SB_DISKS) {
+ if (verbose)
+ pr_err("0.90 metadata supports at most %d devices per array\n",
+ MD_SB_DISKS);
+ return 0;
+ }
+ if (size >= tbmax * 2ULL*1024*1024*1024) {
+ if (verbose)
+ pr_err("0.90 metadata supports at most "
+ "%d terabytes per device\n", tbmax);
+ return 0;
+ }
+ if (chunk && *chunk == UnSet)
+ *chunk = DEFAULT_CHUNK;
+
+ if (!subdev)
+ return 1;
+
+ fd = open(subdev, O_RDONLY|O_EXCL, 0);
+ if (fd < 0) {
+ if (verbose)
+ pr_err("super0.90 cannot open %s: %s\n",
+ subdev, strerror(errno));
+ return 0;
+ }
+
+ if (!get_dev_size(fd, subdev, &ldsize)) {
+ close(fd);
+ return 0;
+ }
+ close(fd);
+
+ if (ldsize < MD_RESERVED_SECTORS * 512)
+ return 0;
+ *freesize = MD_NEW_SIZE_SECTORS(ldsize >> 9);
+ return 1;
+}
+#endif /* MDASSEMBLE */
+