1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
9 #include "xfs_multidisk.h"
14 #define TERABYTES(count, blog) ((uint64_t)(count) << (40 - (blog)))
15 #define GIGABYTES(count, blog) ((uint64_t)(count) << (30 - (blog)))
16 #define MEGABYTES(count, blog) ((uint64_t)(count) << (20 - (blog)))
19 * Use this macro before we have superblock and mount structure to
20 * convert from basic blocks to filesystem blocks.
22 #define DTOBT(d, bl) ((xfs_rfsblock_t)((d) >> ((bl) - BBSHIFT)))
25 * amount (in bytes) we zero at the beginning and end of the device to
26 * remove traces of other filesystems, raid superblocks, etc.
28 #define WHACK_SIZE (128 * 1024)
31 * XXX: The configured block and sector sizes are defined as global variables so
32 * that they don't need to be passed to getnum/cvtnum().
34 unsigned int blocksize
;
35 unsigned int sectorsize
;
38 * Enums for each CLI parameter type are declared first so we can calculate the
39 * maximum array size needed to hold them automatically.
123 /* Just define the max options array size manually right now */
124 #define MAX_SUBOPTS D_MAX_OPTS
126 #define SUBOPT_NEEDS_VAL (-1LL)
127 #define MAX_CONFLICTS 8
128 #define LAST_CONFLICT (-1)
131 * Table for parsing mkfs parameters.
133 * Description of the structure members follows:
136 * Name is a single char, e.g., for '-d file', name is 'd'.
139 * Subopts is a list of strings naming suboptions. In the example above,
140 * it would contain "file". The last entry of this list has to be NULL.
142 * subopt_params MANDATORY
143 * This is a list of structs tied with subopts. For each entry in subopts,
144 * a corresponding entry has to be defined:
146 * subopt_params struct:
148 * This number, starting from zero, denotes which item in subopt_params
149 * it is. The index has to be the same as is the order in subopts list,
150 * so we can access the right item both in subopt_param and subopts.
153 * Do not set this flag when definning a subopt. It is used to remeber that
154 * this subopt was already seen, for example for conflicts detection.
157 * Do not set. It is used internally for respecification, when some options
158 * has to be parsed twice - at first as a string, then later as a number.
161 * A flag signalling whether the user-given value can use suffixes.
162 * If you want to allow the use of user-friendly values like 13k, 42G,
165 * is_power_2 OPTIONAL
166 * An optional flag for subopts where the given value has to be a power
169 * conflicts MANDATORY
170 * If your subopt is in a conflict with some other option, specify it.
171 * Accepts the .index values of the conflicting subopts and the last
172 * member of this list has to be LAST_CONFLICT.
174 * minval, maxval OPTIONAL
175 * These options are used for automatic range check and they have to be
176 * always used together in pair. If you don't want to limit the max value,
177 * use something like UINT_MAX. If no value is given, then you must either
178 * supply your own validation, or refuse any value in the 'case
179 * X_SOMETHING' block. If you forget to define the min and max value, but
180 * call a standard function for validating user's value, it will cause an
181 * error message notifying you about this issue.
183 * (Said in another way, you can't have minval and maxval both equal
184 * to zero. But if one value is different: minval=0 and maxval=1,
187 * defaultval MANDATORY
188 * The value used if user specifies the subopt, but no value.
189 * If the subopt accepts some values (-d file=[1|0]), then this
190 * sets what is used with simple specifying the subopt (-d file).
191 * A special SUBOPT_NEEDS_VAL can be used to require a user-given
196 const char *subopts
[MAX_SUBOPTS
];
198 struct subopt_param
{
205 struct opt_params
*opts
;
207 } conflicts
[MAX_CONFLICTS
];
210 long long defaultval
;
211 } subopt_params
[MAX_SUBOPTS
];
215 * The two dimensional conflict array requires some initialisations to know
216 * about tables that haven't yet been defined. Work around this ordering
217 * issue with extern definitions here.
219 extern struct opt_params sopts
;
221 struct opt_params bopts
= {
230 .conflicts
= { { NULL
, LAST_CONFLICT
} },
231 .minval
= XFS_MIN_BLOCKSIZE
,
232 .maxval
= XFS_MAX_BLOCKSIZE
,
233 .defaultval
= SUBOPT_NEEDS_VAL
,
238 struct opt_params dopts
= {
241 [D_AGCOUNT
] = "agcount",
246 [D_SWIDTH
] = "swidth",
247 [D_AGSIZE
] = "agsize",
250 [D_SECTSIZE
] = "sectsize",
251 [D_NOALIGN
] = "noalign",
252 [D_RTINHERIT
] = "rtinherit",
253 [D_PROJINHERIT
] = "projinherit",
254 [D_EXTSZINHERIT
] = "extszinherit",
255 [D_COWEXTSIZE
] = "cowextsize",
258 { .index
= D_AGCOUNT
,
259 .conflicts
= { { &dopts
, D_AGSIZE
},
260 { NULL
, LAST_CONFLICT
} },
262 .maxval
= XFS_MAX_AGNUMBER
,
263 .defaultval
= SUBOPT_NEEDS_VAL
,
266 .conflicts
= { { NULL
, LAST_CONFLICT
} },
272 .conflicts
= { { NULL
, LAST_CONFLICT
} },
273 .defaultval
= SUBOPT_NEEDS_VAL
,
276 .conflicts
= { { NULL
, LAST_CONFLICT
} },
278 .minval
= XFS_AG_MIN_BYTES
,
280 .defaultval
= SUBOPT_NEEDS_VAL
,
283 .conflicts
= { { &dopts
, D_NOALIGN
},
286 { NULL
, LAST_CONFLICT
} },
289 .defaultval
= SUBOPT_NEEDS_VAL
,
292 .conflicts
= { { &dopts
, D_NOALIGN
},
295 { NULL
, LAST_CONFLICT
} },
298 .defaultval
= SUBOPT_NEEDS_VAL
,
301 .conflicts
= { { &dopts
, D_AGCOUNT
},
302 { NULL
, LAST_CONFLICT
} },
304 .minval
= XFS_AG_MIN_BYTES
,
305 .maxval
= XFS_AG_MAX_BYTES
,
306 .defaultval
= SUBOPT_NEEDS_VAL
,
309 .conflicts
= { { &dopts
, D_NOALIGN
},
311 { &dopts
, D_SWIDTH
},
312 { NULL
, LAST_CONFLICT
} },
316 .defaultval
= SUBOPT_NEEDS_VAL
,
319 .conflicts
= { { &dopts
, D_NOALIGN
},
321 { &dopts
, D_SWIDTH
},
322 { NULL
, LAST_CONFLICT
} },
325 .defaultval
= SUBOPT_NEEDS_VAL
,
327 { .index
= D_SECTSIZE
,
328 .conflicts
= { { &sopts
, S_SIZE
},
329 { &sopts
, S_SECTSIZE
},
330 { NULL
, LAST_CONFLICT
} },
333 .minval
= XFS_MIN_SECTORSIZE
,
334 .maxval
= XFS_MAX_SECTORSIZE
,
335 .defaultval
= SUBOPT_NEEDS_VAL
,
337 { .index
= D_NOALIGN
,
338 .conflicts
= { { &dopts
, D_SU
},
341 { &dopts
, D_SWIDTH
},
342 { NULL
, LAST_CONFLICT
} },
347 { .index
= D_RTINHERIT
,
348 .conflicts
= { { NULL
, LAST_CONFLICT
} },
353 { .index
= D_PROJINHERIT
,
354 .conflicts
= { { NULL
, LAST_CONFLICT
} },
357 .defaultval
= SUBOPT_NEEDS_VAL
,
359 { .index
= D_EXTSZINHERIT
,
360 .conflicts
= { { NULL
, LAST_CONFLICT
} },
363 .defaultval
= SUBOPT_NEEDS_VAL
,
365 { .index
= D_COWEXTSIZE
,
366 .conflicts
= { { NULL
, LAST_CONFLICT
} },
369 .defaultval
= SUBOPT_NEEDS_VAL
,
375 struct opt_params iopts
= {
379 [I_MAXPCT
] = "maxpct",
380 [I_PERBLOCK
] = "perblock",
383 [I_PROJID32BIT
] = "projid32bit",
384 [I_SPINODES
] = "sparse",
388 .conflicts
= { { NULL
, LAST_CONFLICT
} },
394 .conflicts
= { { NULL
, LAST_CONFLICT
} },
397 .defaultval
= SUBOPT_NEEDS_VAL
,
399 { .index
= I_PERBLOCK
,
400 .conflicts
= { { &iopts
, I_SIZE
},
401 { NULL
, LAST_CONFLICT
} },
403 .minval
= XFS_MIN_INODE_PERBLOCK
,
404 .maxval
= XFS_MAX_BLOCKSIZE
/ XFS_DINODE_MIN_SIZE
,
405 .defaultval
= SUBOPT_NEEDS_VAL
,
408 .conflicts
= { { &iopts
, I_PERBLOCK
},
409 { NULL
, LAST_CONFLICT
} },
411 .minval
= XFS_DINODE_MIN_SIZE
,
412 .maxval
= XFS_DINODE_MAX_SIZE
,
413 .defaultval
= SUBOPT_NEEDS_VAL
,
416 .conflicts
= { { NULL
, LAST_CONFLICT
} },
419 .defaultval
= SUBOPT_NEEDS_VAL
,
421 { .index
= I_PROJID32BIT
,
422 .conflicts
= { { NULL
, LAST_CONFLICT
} },
427 { .index
= I_SPINODES
,
428 .conflicts
= { { NULL
, LAST_CONFLICT
} },
436 struct opt_params lopts
= {
440 [L_INTERNAL
] = "internal",
442 [L_VERSION
] = "version",
446 [L_SECTSIZE
] = "sectsize",
449 [L_LAZYSBCNTR
] = "lazy-count",
453 .conflicts
= { { &lopts
, L_DEV
},
454 { NULL
, LAST_CONFLICT
} },
457 .defaultval
= SUBOPT_NEEDS_VAL
,
459 { .index
= L_INTERNAL
,
460 .conflicts
= { { &lopts
, L_FILE
},
462 { &lopts
, L_SECTSIZE
},
463 { NULL
, LAST_CONFLICT
} },
469 .conflicts
= { { NULL
, LAST_CONFLICT
} },
471 .minval
= 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */
472 .maxval
= XFS_MAX_LOG_BYTES
,
473 .defaultval
= SUBOPT_NEEDS_VAL
,
475 { .index
= L_VERSION
,
476 .conflicts
= { { NULL
, LAST_CONFLICT
} },
479 .defaultval
= SUBOPT_NEEDS_VAL
,
482 .conflicts
= { { &lopts
, L_SU
},
483 { NULL
, LAST_CONFLICT
} },
485 .maxval
= BTOBB(XLOG_MAX_RECORD_BSIZE
),
486 .defaultval
= SUBOPT_NEEDS_VAL
,
489 .conflicts
= { { &lopts
, L_SUNIT
},
490 { NULL
, LAST_CONFLICT
} },
493 .maxval
= XLOG_MAX_RECORD_BSIZE
,
494 .defaultval
= SUBOPT_NEEDS_VAL
,
497 .conflicts
= { { &lopts
, L_AGNUM
},
499 { &lopts
, L_INTERNAL
},
500 { NULL
, LAST_CONFLICT
} },
501 .defaultval
= SUBOPT_NEEDS_VAL
,
503 { .index
= L_SECTSIZE
,
504 .conflicts
= { { &lopts
, L_INTERNAL
},
505 { NULL
, LAST_CONFLICT
} },
508 .minval
= XFS_MIN_SECTORSIZE
,
509 .maxval
= XFS_MAX_SECTORSIZE
,
510 .defaultval
= SUBOPT_NEEDS_VAL
,
513 .conflicts
= { { &lopts
, L_INTERNAL
},
514 { NULL
, LAST_CONFLICT
} },
520 .conflicts
= { { &lopts
, L_AGNUM
},
522 { &lopts
, L_INTERNAL
},
523 { NULL
, LAST_CONFLICT
} },
524 .defaultval
= SUBOPT_NEEDS_VAL
,
526 { .index
= L_LAZYSBCNTR
,
527 .conflicts
= { { NULL
, LAST_CONFLICT
} },
535 struct opt_params nopts
= {
539 [N_VERSION
] = "version",
544 .conflicts
= { { NULL
, LAST_CONFLICT
} },
547 .minval
= 1 << XFS_MIN_REC_DIRSIZE
,
548 .maxval
= XFS_MAX_BLOCKSIZE
,
549 .defaultval
= SUBOPT_NEEDS_VAL
,
551 { .index
= N_VERSION
,
552 .conflicts
= { { NULL
, LAST_CONFLICT
} },
555 .defaultval
= SUBOPT_NEEDS_VAL
,
558 .conflicts
= { { NULL
, LAST_CONFLICT
} },
566 struct opt_params ropts
= {
569 [R_EXTSIZE
] = "extsize",
574 [R_NOALIGN
] = "noalign",
577 { .index
= R_EXTSIZE
,
578 .conflicts
= { { NULL
, LAST_CONFLICT
} },
580 .minval
= XFS_MIN_RTEXTSIZE
,
581 .maxval
= XFS_MAX_RTEXTSIZE
,
582 .defaultval
= SUBOPT_NEEDS_VAL
,
585 .conflicts
= { { NULL
, LAST_CONFLICT
} },
589 .defaultval
= SUBOPT_NEEDS_VAL
,
592 .conflicts
= { { &ropts
, R_NAME
},
593 { NULL
, LAST_CONFLICT
} },
594 .defaultval
= SUBOPT_NEEDS_VAL
,
600 .conflicts
= { { NULL
, LAST_CONFLICT
} },
603 .conflicts
= { { &ropts
, R_DEV
},
604 { NULL
, LAST_CONFLICT
} },
605 .defaultval
= SUBOPT_NEEDS_VAL
,
607 { .index
= R_NOALIGN
,
611 .conflicts
= { { NULL
, LAST_CONFLICT
} },
616 struct opt_params sopts
= {
620 [S_SECTSIZE
] = "sectsize",
624 .conflicts
= { { &sopts
, S_SECTSIZE
},
625 { &dopts
, D_SECTSIZE
},
626 { NULL
, LAST_CONFLICT
} },
629 .minval
= XFS_MIN_SECTORSIZE
,
630 .maxval
= XFS_MAX_SECTORSIZE
,
631 .defaultval
= SUBOPT_NEEDS_VAL
,
633 { .index
= S_SECTSIZE
,
634 .conflicts
= { { &sopts
, S_SIZE
},
635 { &dopts
, D_SECTSIZE
},
636 { NULL
, LAST_CONFLICT
} },
639 .minval
= XFS_MIN_SECTORSIZE
,
640 .maxval
= XFS_MAX_SECTORSIZE
,
641 .defaultval
= SUBOPT_NEEDS_VAL
,
646 struct opt_params mopts
= {
650 [M_FINOBT
] = "finobt",
652 [M_RMAPBT
] = "rmapbt",
653 [M_REFLINK
] = "reflink",
657 .conflicts
= { { NULL
, LAST_CONFLICT
} },
663 .conflicts
= { { NULL
, LAST_CONFLICT
} },
669 .conflicts
= { { NULL
, LAST_CONFLICT
} },
670 .defaultval
= SUBOPT_NEEDS_VAL
,
673 .conflicts
= { { NULL
, LAST_CONFLICT
} },
678 { .index
= M_REFLINK
,
679 .conflicts
= { { NULL
, LAST_CONFLICT
} },
687 /* quick way of checking if a parameter was set on the CLI */
690 struct opt_params
*opts
,
693 return opts
->subopt_params
[subopt
].seen
||
694 opts
->subopt_params
[subopt
].str_seen
;
698 * Options configured on the command line.
700 * This stores all the specific config parameters the user sets on the command
701 * line. We do not use these values directly - they are inputs to the mkfs
702 * geometry validation and override any default configuration value we have.
704 * We don't keep flags to indicate what parameters are set - if we need to check
705 * if an option was set on the command line, we check the relevant entry in the
706 * option table which records whether it was specified in the .seen and
707 * .str_seen variables in the table.
709 * Some parameters are stored as strings for post-parsing after their dependent
710 * options have been resolved (e.g. block size and sector size have been parsed
713 * This allows us to check that values have been set without needing separate
714 * flags for each value, and hence avoids needing to record and check for each
715 * specific option that can set the value later on in the code. In the cases
716 * where we don't have a cli_params structure around, the above cli_opt_set()
717 * function can be used.
719 struct sb_feat_args
{
723 bool inode_align
; /* XFS_SB_VERSION_ALIGNBIT */
724 bool nci
; /* XFS_SB_VERSION_BORGBIT */
725 bool lazy_sb_counters
; /* XFS_SB_VERSION2_LAZYSBCOUNTBIT */
726 bool parent_pointers
; /* XFS_SB_VERSION2_PARENTBIT */
727 bool projid32bit
; /* XFS_SB_VERSION2_PROJID32BIT */
728 bool crcs_enabled
; /* XFS_SB_VERSION2_CRCBIT */
729 bool dirftype
; /* XFS_SB_VERSION2_FTYPE */
730 bool finobt
; /* XFS_SB_FEAT_RO_COMPAT_FINOBT */
731 bool spinodes
; /* XFS_SB_FEAT_INCOMPAT_SPINODES */
732 bool rmapbt
; /* XFS_SB_FEAT_RO_COMPAT_RMAPBT */
733 bool reflink
; /* XFS_SB_FEAT_RO_COMPAT_REFLINK */
742 /* parameters that depend on sector/block size being validated. */
752 /* parameters where 0 is a valid CLI value */
760 /* parameters where 0 is not a valid value */
768 /* feature flags that are set */
769 struct sb_feat_args sb_feat
;
771 /* root inode characteristics */
774 /* libxfs device setup */
775 struct libxfs_xinit
*xi
;
779 * Calculated filesystem feature and geometry information.
781 * This structure contains the information we will use to create the on-disk
782 * filesystem from. The validation and calculation code uses it to store all the
783 * temporary and final config state for the filesystem.
785 * The information in this structure will contain a mix of validated CLI input
786 * variables, default feature state and calculated values that are needed to
787 * construct the superblock and other on disk features. These are all in one
788 * place so that we don't have to pass handfuls of seemingly arbitrary variables
789 * around to different functions to do the work we need to do.
807 uint64_t rtextblocks
;
809 uint64_t rtbmblocks
; /* rt bitmap blocks */
811 int dsunit
; /* in FSBs */
812 int dswidth
; /* in FSBs */
813 int lsunit
; /* in FSBs */
827 struct sb_feat_args sb_feat
;
831 * Default filesystem features and configuration values
833 * This structure contains the default mkfs values that are to be used when
834 * a user does not specify the option on the command line. We do not use these
835 * values directly - they are inputs to the mkfs geometry validation and
838 struct mkfs_default_params
{
839 char *source
; /* where the defaults came from */
844 /* feature flags that are set */
845 struct sb_feat_args sb_feat
;
847 /* root inode characteristics */
851 static void __attribute__((noreturn
))
854 fprintf(stderr
, _("Usage: %s\n\
855 /* blocksize */ [-b size=num]\n\
856 /* metadata */ [-m crc=0|1,finobt=0|1,uuid=xxx,rmapbt=0|1,reflink=0|1]\n\
857 /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\
858 (sunit=value,swidth=value|su=num,sw=num|noalign),\n\
860 /* force overwrite */ [-f]\n\
861 /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,\n\
862 projid32bit=0|1,sparse=0|1]\n\
863 /* no discard */ [-K]\n\
864 /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n\n\
865 sunit=value|su=num,sectsize=num,lazy-count=0|1]\n\
866 /* label */ [-L label (maximum 12 characters)]\n\
867 /* naming */ [-n size=num,version=2|ci,ftype=0|1]\n\
868 /* no-op info only */ [-N]\n\
869 /* prototype file */ [-p fname]\n\
871 /* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx]\n\
872 /* sectorsize */ [-s size=num]\n\
873 /* version */ [-V]\n\
875 <devicename> is required unless -d name=xxx is given.\n\
876 <num> is xxx (bytes), xxxs (sectors), xxxb (fs blocks), xxxk (xxx KiB),\n\
877 xxxm (xxx MiB), xxxg (xxx GiB), xxxt (xxx TiB) or xxxp (xxx PiB).\n\
878 <value> is xxx (512 byte blocks).\n"),
885 struct opt_params
*opts
,
887 struct opt_params
*con_opts
,
890 fprintf(stderr
, _("Cannot specify both -%c %s and -%c %s\n"),
891 con_opts
->name
, con_opts
->subopts
[conflict
],
892 opts
->name
, opts
->subopts
[option
]);
902 fprintf(stderr
, _("Invalid value %s for -%s option\n"), value
, opt
);
910 return (i
& (i
- 1)) == 0;
913 static void __attribute__((noreturn
))
919 fprintf(stderr
, _("-%c %s option requires a value\n"), opt
, tab
[idx
]);
929 fprintf(stderr
, "-%c ", opt
);
931 fprintf(stderr
, "%s ", tab
[idx
]);
932 fprintf(stderr
, _("option respecified\n"));
941 fprintf(stderr
, _("unknown option -%c %s\n"), opt
, s
);
947 unsigned int blksize
,
948 unsigned int sectsize
,
955 i
= strtoll(s
, &sp
, 0);
956 if (i
== 0 && sp
== s
)
967 _("Blocksize must be provided prior to using 'b' suffix.\n"));
976 _("Sectorsize must be specified prior to using 's' suffix.\n"));
1015 bool force_overwrite
,
1016 const char *optname
)
1018 struct stat statbuf
;
1020 if (*isfile
&& (no_size
|| no_name
)) {
1022 _("if -%s file then -%s name and -%s size are required\n"),
1023 optname
, optname
, optname
);
1028 fprintf(stderr
, _("No device name specified\n"));
1032 if (stat(name
, &statbuf
)) {
1033 if (errno
== ENOENT
&& *isfile
) {
1040 _("Error accessing specified device %s: %s\n"),
1041 name
, strerror(errno
));
1046 if (!force_overwrite
&& check_overwrite(name
)) {
1048 _("%s: Use the -f option to force overwrite.\n"),
1054 * We only want to completely truncate and recreate an existing file if
1055 * we were specifically told it was a file. Set the create flag only in
1056 * this case to trigger that behaviour.
1058 if (S_ISREG(statbuf
.st_mode
)) {
1066 if (S_ISBLK(statbuf
.st_mode
)) {
1069 _("specified \"-%s file\" on a block device %s\n"),
1077 _("specified device %s not a file or block device\n"),
1083 validate_ag_geometry(
1089 if (agsize
< XFS_AG_MIN_BLOCKS(blocklog
)) {
1091 _("agsize (%lld blocks) too small, need at least %lld blocks\n"),
1093 (long long)XFS_AG_MIN_BLOCKS(blocklog
));
1097 if (agsize
> XFS_AG_MAX_BLOCKS(blocklog
)) {
1099 _("agsize (%lld blocks) too big, maximum is %lld blocks\n"),
1101 (long long)XFS_AG_MAX_BLOCKS(blocklog
));
1105 if (agsize
> dblocks
) {
1107 _("agsize (%lld blocks) too big, data area is %lld blocks\n"),
1108 (long long)agsize
, (long long)dblocks
);
1112 if (agsize
< XFS_AG_MIN_BLOCKS(blocklog
)) {
1114 _("too many allocation groups for size = %lld\n"),
1116 fprintf(stderr
, _("need at most %lld allocation groups\n"),
1117 (long long)(dblocks
/ XFS_AG_MIN_BLOCKS(blocklog
) +
1118 (dblocks
% XFS_AG_MIN_BLOCKS(blocklog
) != 0)));
1122 if (agsize
> XFS_AG_MAX_BLOCKS(blocklog
)) {
1124 _("too few allocation groups for size = %lld\n"), (long long)agsize
);
1126 _("need at least %lld allocation groups\n"),
1127 (long long)(dblocks
/ XFS_AG_MAX_BLOCKS(blocklog
) +
1128 (dblocks
% XFS_AG_MAX_BLOCKS(blocklog
) != 0)));
1133 * If the last AG is too small, reduce the filesystem size
1134 * and drop the blocks.
1136 if ( dblocks
% agsize
!= 0 &&
1137 (dblocks
% agsize
< XFS_AG_MIN_BLOCKS(blocklog
))) {
1139 _("last AG size %lld blocks too small, minimum size is %lld blocks\n"),
1140 (long long)(dblocks
% agsize
),
1141 (long long)XFS_AG_MIN_BLOCKS(blocklog
));
1146 * If agcount is too large, make it smaller.
1148 if (agcount
> XFS_MAX_AGNUMBER
+ 1) {
1150 _("%lld allocation groups is too many, maximum is %lld\n"),
1151 (long long)agcount
, (long long)XFS_MAX_AGNUMBER
+ 1);
1157 zero_old_xfs_structures(
1168 * We open regular files with O_TRUNC|O_CREAT. Nothing to do here...
1170 if (xi
->disfile
&& xi
->dcreat
)
1174 * read in existing filesystem superblock, use its geometry
1175 * settings and zero the existing secondary superblocks.
1177 buf
= memalign(libxfs_device_alignment(), new_sb
->sb_sectsize
);
1180 _("error reading existing superblock -- failed to memalign buffer\n"));
1183 memset(buf
, 0, new_sb
->sb_sectsize
);
1186 * If we are creating an image file, it might be of zero length at this
1187 * point in time. Hence reading the existing superblock is going to
1188 * return zero bytes. It's not a failure we need to warn about in this
1191 off
= pread(xi
->dfd
, buf
, new_sb
->sb_sectsize
, 0);
1192 if (off
!= new_sb
->sb_sectsize
) {
1195 _("error reading existing superblock: %s\n"),
1199 libxfs_sb_from_disk(&sb
, buf
);
1202 * perform same basic superblock validation to make sure we
1203 * actually zero secondary blocks
1205 if (sb
.sb_magicnum
!= XFS_SB_MAGIC
|| sb
.sb_blocksize
== 0)
1208 for (bsize
= 1, i
= 0; bsize
< sb
.sb_blocksize
&&
1209 i
< sizeof(sb
.sb_blocksize
) * NBBY
; i
++)
1212 if (i
< XFS_MIN_BLOCKSIZE_LOG
|| i
> XFS_MAX_BLOCKSIZE_LOG
||
1213 i
!= sb
.sb_blocklog
)
1216 if (sb
.sb_dblocks
> ((uint64_t)sb
.sb_agcount
* sb
.sb_agblocks
) ||
1217 sb
.sb_dblocks
< ((uint64_t)(sb
.sb_agcount
- 1) *
1218 sb
.sb_agblocks
+ XFS_MIN_AG_BLOCKS
))
1222 * block size and basic geometry seems alright, zero the secondaries.
1224 memset(buf
, 0, new_sb
->sb_sectsize
);
1226 for (i
= 1; i
< sb
.sb_agcount
; i
++) {
1227 off
+= sb
.sb_agblocks
;
1228 if (pwrite(xi
->dfd
, buf
, new_sb
->sb_sectsize
,
1229 off
<< sb
.sb_blocklog
) == -1)
1237 discard_blocks(dev_t dev
, uint64_t nsectors
)
1242 * We intentionally ignore errors from the discard ioctl. It is
1243 * not necessary for the mkfs functionality but just an optimization.
1245 fd
= libxfs_device_to_fd(dev
);
1247 platform_discard_blocks(fd
, 0, nsectors
<< 9);
1250 static __attribute__((noreturn
)) void
1253 struct opt_params
*opts
,
1258 _("Invalid value %s for -%c %s option. %s\n"),
1259 value
, opts
->name
, opts
->subopts
[index
],
1265 * Check for conflicts and option respecification.
1269 struct opt_params
*opts
,
1273 struct subopt_param
*sp
= &opts
->subopt_params
[index
];
1276 if (sp
->index
!= index
) {
1278 _("Developer screwed up option parsing (%d/%d)! Please report!\n"),
1280 reqval(opts
->name
, opts
->subopts
, index
);
1284 * Check for respecification of the option. This is more complex than it
1285 * seems because some options are parsed twice - once as a string during
1286 * input parsing, then later the string is passed to getnum for
1287 * conversion into a number and bounds checking. Hence the two variables
1288 * used to track the different uses based on the @str parameter passed
1293 respec(opts
->name
, opts
->subopts
, index
);
1297 respec(opts
->name
, opts
->subopts
, index
);
1298 sp
->str_seen
= true;
1301 /* check for conflicts with the option */
1302 for (i
= 0; i
< MAX_CONFLICTS
; i
++) {
1303 struct _conflict
*con
= &sp
->conflicts
[i
];
1305 if (con
->subopt
== LAST_CONFLICT
)
1307 if (con
->opts
->subopt_params
[con
->subopt
].seen
||
1308 con
->opts
->subopt_params
[con
->subopt
].str_seen
)
1309 conflict(opts
, index
, con
->opts
, con
->subopt
);
1316 struct opt_params
*opts
,
1319 struct subopt_param
*sp
= &opts
->subopt_params
[index
];
1322 check_opt(opts
, index
, false);
1323 /* empty strings might just return a default value */
1324 if (!str
|| *str
== '\0') {
1325 if (sp
->defaultval
== SUBOPT_NEEDS_VAL
)
1326 reqval(opts
->name
, opts
->subopts
, index
);
1327 return sp
->defaultval
;
1330 if (sp
->minval
== 0 && sp
->maxval
== 0) {
1332 _("Option -%c %s has undefined minval/maxval."
1333 "Can't verify value range. This is a bug.\n"),
1334 opts
->name
, opts
->subopts
[index
]);
1339 * Some values are pure numbers, others can have suffixes that define
1340 * the units of the number. Those get passed to cvtnum(), otherwise we
1341 * convert it ourselves to guarantee there is no trailing garbage in the
1345 c
= cvtnum(blocksize
, sectorsize
, str
);
1349 c
= strtoll(str
, &str_end
, 0);
1350 if (c
== 0 && str_end
== str
)
1351 illegal_option(str
, opts
, index
,
1352 _("Value not recognized as number."));
1353 if (*str_end
!= '\0')
1354 illegal_option(str
, opts
, index
,
1355 _("Unit suffixes are not allowed."));
1358 /* Validity check the result. */
1360 illegal_option(str
, opts
, index
, _("Value is too small."));
1361 else if (c
> sp
->maxval
)
1362 illegal_option(str
, opts
, index
, _("Value is too large."));
1363 if (sp
->is_power_2
&& !ispow2(c
))
1364 illegal_option(str
, opts
, index
, _("Value must be a power of 2."));
1369 * Option is a string - do all the option table work, and check there
1370 * is actually an option string. Otherwise we don't do anything with the string
1371 * here - validation will be done later when the string is converted to a value
1372 * or used as a file/device path.
1377 struct opt_params
*opts
,
1380 check_opt(opts
, index
, true);
1382 /* empty strings for string options are not valid */
1383 if (!str
|| *str
== '\0')
1384 reqval(opts
->name
, opts
->subopts
, index
);
1390 struct opt_params
*opts
,
1393 struct cli_params
*cli
)
1397 cli
->blocksize
= getnum(value
, opts
, subopt
);
1407 struct opt_params
*opts
,
1410 struct cli_params
*cli
)
1414 cli
->agcount
= getnum(value
, opts
, subopt
);
1417 cli
->agsize
= getstr(value
, opts
, subopt
);
1420 cli
->xi
->disfile
= getnum(value
, opts
, subopt
);
1423 cli
->xi
->dname
= getstr(value
, opts
, subopt
);
1426 cli
->dsize
= getstr(value
, opts
, subopt
);
1429 cli
->dsunit
= getnum(value
, opts
, subopt
);
1432 cli
->dswidth
= getnum(value
, opts
, subopt
);
1435 cli
->dsu
= getstr(value
, opts
, subopt
);
1438 cli
->dsw
= getnum(value
, opts
, subopt
);
1441 cli
->sb_feat
.nodalign
= getnum(value
, opts
, subopt
);
1444 cli
->sectorsize
= getnum(value
, opts
, subopt
);
1447 if (getnum(value
, opts
, subopt
))
1448 cli
->fsx
.fsx_xflags
|= XFS_DIFLAG_RTINHERIT
;
1451 cli
->fsx
.fsx_projid
= getnum(value
, opts
, subopt
);
1452 cli
->fsx
.fsx_xflags
|= XFS_DIFLAG_PROJINHERIT
;
1454 case D_EXTSZINHERIT
:
1455 cli
->fsx
.fsx_extsize
= getnum(value
, opts
, subopt
);
1456 cli
->fsx
.fsx_xflags
|= XFS_DIFLAG_EXTSZINHERIT
;
1459 cli
->fsx
.fsx_cowextsize
= getnum(value
, opts
, subopt
);
1460 cli
->fsx
.fsx_xflags
|= FS_XFLAG_COWEXTSIZE
;
1470 struct opt_params
*opts
,
1473 struct cli_params
*cli
)
1477 cli
->sb_feat
.inode_align
= getnum(value
, opts
, subopt
);
1480 cli
->imaxpct
= getnum(value
, opts
, subopt
);
1483 cli
->inopblock
= getnum(value
, opts
, subopt
);
1486 cli
->inodesize
= getnum(value
, opts
, subopt
);
1489 cli
->sb_feat
.attr_version
= getnum(value
, opts
, subopt
);
1492 cli
->sb_feat
.projid32bit
= getnum(value
, opts
, subopt
);
1495 cli
->sb_feat
.spinodes
= getnum(value
, opts
, subopt
);
1505 struct opt_params
*opts
,
1508 struct cli_params
*cli
)
1512 cli
->logagno
= getnum(value
, opts
, subopt
);
1515 cli
->xi
->lisfile
= getnum(value
, opts
, subopt
);
1518 cli
->loginternal
= getnum(value
, opts
, subopt
);
1521 cli
->lsu
= getstr(value
, opts
, subopt
);
1524 cli
->lsunit
= getnum(value
, opts
, subopt
);
1528 cli
->xi
->logname
= getstr(value
, opts
, subopt
);
1529 cli
->loginternal
= 0;
1532 cli
->sb_feat
.log_version
= getnum(value
, opts
, subopt
);
1535 cli
->logsize
= getstr(value
, opts
, subopt
);
1538 cli
->lsectorsize
= getnum(value
, opts
, subopt
);
1541 cli
->sb_feat
.lazy_sb_counters
= getnum(value
, opts
, subopt
);
1551 struct opt_params
*opts
,
1554 struct cli_params
*cli
)
1558 cli
->sb_feat
.crcs_enabled
= getnum(value
, opts
, subopt
);
1559 if (cli
->sb_feat
.crcs_enabled
)
1560 cli
->sb_feat
.dirftype
= true;
1563 cli
->sb_feat
.finobt
= getnum(value
, opts
, subopt
);
1566 if (!value
|| *value
== '\0')
1567 reqval('m', opts
->subopts
, subopt
);
1568 if (platform_uuid_parse(value
, &cli
->uuid
))
1569 illegal(value
, "m uuid");
1572 cli
->sb_feat
.rmapbt
= getnum(value
, opts
, subopt
);
1575 cli
->sb_feat
.reflink
= getnum(value
, opts
, subopt
);
1585 struct opt_params
*opts
,
1588 struct cli_params
*cli
)
1592 cli
->dirblocksize
= getstr(value
, opts
, subopt
);
1595 value
= getstr(value
, &nopts
, subopt
);
1596 if (!strcasecmp(value
, "ci")) {
1598 cli
->sb_feat
.nci
= true;
1600 cli
->sb_feat
.dir_version
= getnum(value
, opts
, subopt
);
1604 cli
->sb_feat
.dirftype
= getnum(value
, opts
, subopt
);
1614 struct opt_params
*opts
,
1617 struct cli_params
*cli
)
1621 cli
->rtextsize
= getstr(value
, opts
, subopt
);
1624 cli
->xi
->risfile
= getnum(value
, opts
, subopt
);
1628 cli
->xi
->rtname
= getstr(value
, opts
, subopt
);
1631 cli
->rtsize
= getstr(value
, opts
, subopt
);
1634 cli
->sb_feat
.nortalign
= getnum(value
, opts
, subopt
);
1644 struct opt_params
*opts
,
1647 struct cli_params
*cli
)
1652 cli
->sectorsize
= getnum(value
, opts
, subopt
);
1653 cli
->lsectorsize
= cli
->sectorsize
;
1663 struct opt_params
*opts
;
1666 { 'b', &bopts
, block_opts_parser
},
1667 { 'd', &dopts
, data_opts_parser
},
1668 { 'i', &iopts
, inode_opts_parser
},
1669 { 'l', &lopts
, log_opts_parser
},
1670 { 'm', &mopts
, meta_opts_parser
},
1671 { 'n', &nopts
, naming_opts_parser
},
1672 { 'r', &ropts
, rtdev_opts_parser
},
1673 { 's', &sopts
, sector_opts_parser
},
1674 { '\0', NULL
, NULL
},
1681 struct cli_params
*cli
)
1683 struct subopts
*sop
= &subopt_tab
[0];
1688 if (sop
->opt
== opt
)
1693 /* should never happen */
1698 while (*p
!= '\0') {
1699 char **subopts
= (char **)sop
->opts
->subopts
;
1703 subopt
= getsubopt(&p
, subopts
, &value
);
1705 ret
= (sop
->parser
)(sop
->opts
, subopt
, value
, cli
);
1707 unknown(opt
, value
);
1712 validate_sectorsize(
1713 struct mkfs_params
*cfg
,
1714 struct cli_params
*cli
,
1715 struct mkfs_default_params
*dft
,
1716 struct fs_topology
*ft
,
1719 int force_overwrite
)
1721 /* set configured sector sizes in preparation for checks */
1722 if (!cli
->sectorsize
) {
1723 cfg
->sectorsize
= dft
->sectorsize
;
1725 cfg
->sectorsize
= cli
->sectorsize
;
1727 cfg
->sectorlog
= libxfs_highbit32(cfg
->sectorsize
);
1730 * Before anything else, verify that we are correctly operating on
1731 * files or block devices and set the control parameters correctly.
1733 check_device_type(dfile
, &cli
->xi
->disfile
, !cli
->dsize
, !dfile
,
1734 dry_run
? NULL
: &cli
->xi
->dcreat
,
1735 force_overwrite
, "d");
1736 if (!cli
->loginternal
)
1737 check_device_type(cli
->xi
->logname
, &cli
->xi
->lisfile
,
1738 !cli
->logsize
, !cli
->xi
->logname
,
1739 dry_run
? NULL
: &cli
->xi
->lcreat
,
1740 force_overwrite
, "l");
1741 if (cli
->xi
->rtname
)
1742 check_device_type(cli
->xi
->rtname
, &cli
->xi
->risfile
,
1743 !cli
->rtsize
, !cli
->xi
->rtname
,
1744 dry_run
? NULL
: &cli
->xi
->rcreat
,
1745 force_overwrite
, "r");
1748 * Explicitly disable direct IO for image files so we don't error out on
1749 * sector size mismatches between the new filesystem and the underlying
1752 if (cli
->xi
->disfile
|| cli
->xi
->lisfile
|| cli
->xi
->risfile
)
1753 cli
->xi
->isdirect
= 0;
1755 memset(ft
, 0, sizeof(*ft
));
1756 get_topology(cli
->xi
, ft
, force_overwrite
);
1758 if (!cli
->sectorsize
) {
1760 * Unless specified manually on the command line use the
1761 * advertised sector size of the device. We use the physical
1762 * sector size unless the requested block size is smaller
1763 * than that, then we can use logical, but warn about the
1766 * Set the topology sectors if they were not probed to the
1767 * minimum supported sector size.
1770 if (!ft
->lsectorsize
)
1771 ft
->lsectorsize
= XFS_MIN_SECTORSIZE
;
1773 /* Older kernels may not have physical/logical distinction */
1774 if (!ft
->psectorsize
)
1775 ft
->psectorsize
= ft
->lsectorsize
;
1777 cfg
->sectorsize
= ft
->psectorsize
;
1778 if (cfg
->blocksize
< cfg
->sectorsize
&&
1779 cfg
->blocksize
>= ft
->lsectorsize
) {
1781 _("specified blocksize %d is less than device physical sector size %d\n"
1782 "switching to logical sector size %d\n"),
1783 cfg
->blocksize
, ft
->psectorsize
,
1785 cfg
->sectorsize
= ft
->lsectorsize
;
1788 cfg
->sectorlog
= libxfs_highbit32(cfg
->sectorsize
);
1791 /* validate specified/probed sector size */
1792 if (cfg
->sectorsize
< XFS_MIN_SECTORSIZE
||
1793 cfg
->sectorsize
> XFS_MAX_SECTORSIZE
) {
1794 fprintf(stderr
, _("illegal sector size %d\n"), cfg
->sectorsize
);
1798 if (cfg
->blocksize
< cfg
->sectorsize
) {
1800 _("block size %d cannot be smaller than sector size %d\n"),
1801 cfg
->blocksize
, cfg
->sectorsize
);
1805 if (cfg
->sectorsize
< ft
->lsectorsize
) {
1806 fprintf(stderr
, _("illegal sector size %d; hw sector is %d\n"),
1807 cfg
->sectorsize
, ft
->lsectorsize
);
1814 struct mkfs_params
*cfg
,
1815 struct cli_params
*cli
,
1816 struct mkfs_default_params
*dft
)
1819 * Blocksize and sectorsize first, other things depend on them
1820 * For RAID4/5/6 we want to align sector size and block size,
1821 * so we need to start with the device geometry extraction too.
1823 if (!cli
->blocksize
)
1824 cfg
->blocksize
= dft
->blocksize
;
1826 cfg
->blocksize
= cli
->blocksize
;
1827 cfg
->blocklog
= libxfs_highbit32(cfg
->blocksize
);
1829 /* validate block sizes are in range */
1830 if (cfg
->blocksize
< XFS_MIN_BLOCKSIZE
||
1831 cfg
->blocksize
> XFS_MAX_BLOCKSIZE
) {
1832 fprintf(stderr
, _("illegal block size %d\n"), cfg
->blocksize
);
1836 if (cli
->sb_feat
.crcs_enabled
&&
1837 cfg
->blocksize
< XFS_MIN_CRC_BLOCKSIZE
) {
1839 _("Minimum block size for CRC enabled filesystems is %d bytes.\n"),
1840 XFS_MIN_CRC_BLOCKSIZE
);
1847 * Grab log sector size and validate.
1849 * XXX: should we probe sector size on external log device rather than using
1850 * the data device sector size?
1853 validate_log_sectorsize(
1854 struct mkfs_params
*cfg
,
1855 struct cli_params
*cli
,
1856 struct mkfs_default_params
*dft
)
1859 if (cli
->loginternal
&& cli
->lsectorsize
&&
1860 cli
->lsectorsize
!= cfg
->sectorsize
) {
1862 _("Can't change sector size on internal log!\n"));
1866 if (cli
->lsectorsize
)
1867 cfg
->lsectorsize
= cli
->lsectorsize
;
1868 else if (cli
->loginternal
)
1869 cfg
->lsectorsize
= cfg
->sectorsize
;
1871 cfg
->lsectorsize
= dft
->sectorsize
;
1872 cfg
->lsectorlog
= libxfs_highbit32(cfg
->lsectorsize
);
1874 if (cfg
->lsectorsize
< XFS_MIN_SECTORSIZE
||
1875 cfg
->lsectorsize
> XFS_MAX_SECTORSIZE
||
1876 cfg
->lsectorsize
> cfg
->blocksize
) {
1877 fprintf(stderr
, _("illegal log sector size %d\n"),
1881 if (cfg
->lsectorsize
> XFS_MIN_SECTORSIZE
) {
1882 if (cli
->sb_feat
.log_version
< 2) {
1883 /* user specified non-default log version */
1885 _("Version 1 logs do not support sector size %d\n"),
1891 /* if lsu or lsunit was specified, automatically use v2 logs */
1892 if ((cli_opt_set(&lopts
, L_SU
) || cli_opt_set(&lopts
, L_SUNIT
)) &&
1893 cli
->sb_feat
.log_version
== 1) {
1895 _("log stripe unit specified, using v2 logs\n"));
1896 cli
->sb_feat
.log_version
= 2;
1902 * Check that the incoming features make sense. The CLI structure was
1903 * initialised with the default values before parsing, so we can just
1904 * check it and copy it straight across to the cfg structure if it
1908 validate_sb_features(
1909 struct mkfs_params
*cfg
,
1910 struct cli_params
*cli
)
1913 * Now we have blocks and sector sizes set up, check parameters that are
1914 * no longer optional for CRC enabled filesystems. Catch them up front
1915 * here before doing anything else.
1917 if (cli
->sb_feat
.crcs_enabled
) {
1918 /* minimum inode size is 512 bytes, rest checked later */
1919 if (cli
->inodesize
&&
1920 cli
->inodesize
< (1 << XFS_DINODE_DFL_CRC_LOG
)) {
1922 _("Minimum inode size for CRCs is %d bytes\n"),
1923 1 << XFS_DINODE_DFL_CRC_LOG
);
1927 /* inodes always aligned */
1928 if (!cli
->sb_feat
.inode_align
) {
1930 _("Inodes always aligned for CRC enabled filesystems\n"));
1934 /* lazy sb counters always on */
1935 if (!cli
->sb_feat
.lazy_sb_counters
) {
1937 _("Lazy superblock counters always enabled for CRC enabled filesystems\n"));
1941 /* version 2 logs always on */
1942 if (cli
->sb_feat
.log_version
!= 2) {
1944 _("V2 logs always enabled for CRC enabled filesystems\n"));
1948 /* attr2 always on */
1949 if (cli
->sb_feat
.attr_version
!= 2) {
1951 _("V2 attribute format always enabled on CRC enabled filesystems\n"));
1955 /* 32 bit project quota always on */
1956 /* attr2 always on */
1957 if (!cli
->sb_feat
.projid32bit
) {
1959 _("32 bit Project IDs always enabled on CRC enabled filesystems\n"));
1963 /* ftype always on */
1964 if (!cli
->sb_feat
.dirftype
) {
1966 _("Directory ftype field always enabled on CRC enabled filesystems\n"));
1972 * The kernel doesn't currently support crc=0,finobt=1
1973 * filesystems. If crcs are not enabled and the user has not
1974 * explicitly turned finobt on, then silently turn it off to
1975 * avoid an unnecessary warning.
1976 * If the user explicitly tried to use crc=0,finobt=1,
1977 * then issue an error.
1978 * The same is also for sparse inodes.
1980 if (cli
->sb_feat
.finobt
&& cli_opt_set(&mopts
, M_FINOBT
)) {
1982 _("finobt not supported without CRC support\n"));
1985 cli
->sb_feat
.finobt
= false;
1987 if (cli
->sb_feat
.spinodes
&& cli_opt_set(&iopts
, I_SPINODES
)) {
1989 _("sparse inodes not supported without CRC support\n"));
1992 cli
->sb_feat
.spinodes
= false;
1994 if (cli
->sb_feat
.rmapbt
) {
1996 _("rmapbt not supported without CRC support\n"));
1999 cli
->sb_feat
.rmapbt
= false;
2001 if (cli
->sb_feat
.reflink
) {
2003 _("reflink not supported without CRC support\n"));
2006 cli
->sb_feat
.reflink
= false;
2009 if ((cli
->fsx
.fsx_xflags
& FS_XFLAG_COWEXTSIZE
) &&
2010 !cli
->sb_feat
.reflink
) {
2012 _("cowextsize not supported without reflink support\n"));
2016 if (cli
->sb_feat
.reflink
&& cli
->xi
->rtname
) {
2018 _("reflink not supported with realtime devices\n"));
2020 cli
->sb_feat
.reflink
= false;
2023 if (cli
->sb_feat
.rmapbt
&& cli
->xi
->rtname
) {
2025 _("rmapbt not supported with realtime devices\n"));
2027 cli
->sb_feat
.rmapbt
= false;
2031 * Copy features across to config structure now.
2033 cfg
->sb_feat
= cli
->sb_feat
;
2034 if (!platform_uuid_is_null(&cli
->uuid
))
2035 platform_uuid_copy(&cfg
->uuid
, &cli
->uuid
);
2039 validate_dirblocksize(
2040 struct mkfs_params
*cfg
,
2041 struct cli_params
*cli
)
2044 if (cli
->dirblocksize
)
2045 cfg
->dirblocksize
= getnum(cli
->dirblocksize
, &nopts
, N_SIZE
);
2047 if (cfg
->dirblocksize
) {
2048 if (cfg
->dirblocksize
< cfg
->blocksize
||
2049 cfg
->dirblocksize
> XFS_MAX_BLOCKSIZE
) {
2050 fprintf(stderr
, _("illegal directory block size %d\n"),
2054 cfg
->dirblocklog
= libxfs_highbit32(cfg
->dirblocksize
);
2058 /* use default size based on current block size */
2059 if (cfg
->blocksize
< (1 << XFS_MIN_REC_DIRSIZE
))
2060 cfg
->dirblocklog
= XFS_MIN_REC_DIRSIZE
;
2062 cfg
->dirblocklog
= cfg
->blocklog
;
2063 cfg
->dirblocksize
= 1 << cfg
->dirblocklog
;
2068 struct mkfs_params
*cfg
,
2069 struct cli_params
*cli
)
2073 cfg
->inodelog
= cfg
->blocklog
- libxfs_highbit32(cli
->inopblock
);
2074 else if (cli
->inodesize
)
2075 cfg
->inodelog
= libxfs_highbit32(cli
->inodesize
);
2076 else if (cfg
->sb_feat
.crcs_enabled
)
2077 cfg
->inodelog
= XFS_DINODE_DFL_CRC_LOG
;
2079 cfg
->inodelog
= XFS_DINODE_DFL_LOG
;
2081 cfg
->inodesize
= 1 << cfg
->inodelog
;
2082 cfg
->inopblock
= cfg
->blocksize
/ cfg
->inodesize
;
2084 /* input parsing has already validated non-crc inode size range */
2085 if (cfg
->sb_feat
.crcs_enabled
&&
2086 cfg
->inodelog
< XFS_DINODE_DFL_CRC_LOG
) {
2088 _("Minimum inode size for CRCs is %d bytes\n"),
2089 1 << XFS_DINODE_DFL_CRC_LOG
);
2093 if (cfg
->inodesize
> cfg
->blocksize
/ XFS_MIN_INODE_PERBLOCK
||
2094 cfg
->inopblock
< XFS_MIN_INODE_PERBLOCK
||
2095 cfg
->inodesize
< XFS_DINODE_MIN_SIZE
||
2096 cfg
->inodesize
> XFS_DINODE_MAX_SIZE
) {
2099 fprintf(stderr
, _("illegal inode size %d\n"), cfg
->inodesize
);
2100 maxsz
= min(cfg
->blocksize
/ XFS_MIN_INODE_PERBLOCK
,
2101 XFS_DINODE_MAX_SIZE
);
2102 if (XFS_DINODE_MIN_SIZE
== maxsz
)
2104 _("allowable inode size with %d byte blocks is %d\n"),
2105 cfg
->blocksize
, XFS_DINODE_MIN_SIZE
);
2108 _("allowable inode size with %d byte blocks is between %d and %d\n"),
2109 cfg
->blocksize
, XFS_DINODE_MIN_SIZE
, maxsz
);
2114 static xfs_rfsblock_t
2117 struct mkfs_params
*cfg
,
2118 struct opt_params
*opts
,
2123 xfs_rfsblock_t dblocks
;
2128 dbytes
= getnum(size
, opts
, sizeopt
);
2129 if (dbytes
% XFS_MIN_BLOCKSIZE
) {
2131 _("illegal %s length %lld, not a multiple of %d\n"),
2132 type
, (long long)dbytes
, XFS_MIN_BLOCKSIZE
);
2135 dblocks
= (xfs_rfsblock_t
)(dbytes
>> cfg
->blocklog
);
2136 if (dbytes
% cfg
->blocksize
) {
2138 _("warning: %s length %lld not a multiple of %d, truncated to %lld\n"),
2139 type
, (long long)dbytes
, cfg
->blocksize
,
2140 (long long)(dblocks
<< cfg
->blocklog
));
2147 struct mkfs_params
*cfg
,
2148 struct cli_params
*cli
,
2149 struct fs_topology
*ft
)
2151 uint64_t rtextbytes
;
2154 * If specified, check rt extent size against its constraints.
2156 if (cli
->rtextsize
) {
2158 rtextbytes
= getnum(cli
->rtextsize
, &ropts
, R_EXTSIZE
);
2159 if (rtextbytes
% cfg
->blocksize
) {
2161 _("illegal rt extent size %lld, not a multiple of %d\n"),
2162 (long long)rtextbytes
, cfg
->blocksize
);
2165 cfg
->rtextblocks
= (xfs_extlen_t
)(rtextbytes
>> cfg
->blocklog
);
2168 * If realtime extsize has not been specified by the user,
2169 * and the underlying volume is striped, then set rtextblocks
2170 * to the stripe width.
2174 if (!cfg
->sb_feat
.nortalign
&& !cli
->xi
->risfile
&&
2175 !(!cli
->rtsize
&& cli
->xi
->disfile
))
2176 rswidth
= ft
->rtswidth
;
2180 /* check that rswidth is a multiple of fs blocksize */
2181 if (!cfg
->sb_feat
.nortalign
&& rswidth
&&
2182 !(BBTOB(rswidth
) % cfg
->blocksize
)) {
2183 rswidth
= DTOBT(rswidth
, cfg
->blocklog
);
2184 rtextbytes
= rswidth
<< cfg
->blocklog
;
2185 if (rtextbytes
> XFS_MIN_RTEXTSIZE
&&
2186 rtextbytes
<= XFS_MAX_RTEXTSIZE
) {
2187 cfg
->rtextblocks
= rswidth
;
2190 if (!cfg
->rtextblocks
) {
2191 cfg
->rtextblocks
= (cfg
->blocksize
< XFS_MIN_RTEXTSIZE
)
2192 ? XFS_MIN_RTEXTSIZE
>> cfg
->blocklog
2196 ASSERT(cfg
->rtextblocks
);
2200 * Validate the configured stripe geometry, or is none is specified, pull
2201 * the configuration from the underlying device.
2203 * CLI parameters come in as different units, go out as filesystem blocks.
2206 calc_stripe_factors(
2207 struct mkfs_params
*cfg
,
2208 struct cli_params
*cli
,
2209 struct fs_topology
*ft
)
2211 long long int big_dswidth
;
2218 bool use_dev
= false;
2220 if (cli_opt_set(&dopts
, D_SUNIT
))
2221 dsunit
= cli
->dsunit
;
2222 if (cli_opt_set(&dopts
, D_SWIDTH
))
2223 dswidth
= cli
->dswidth
;
2225 if (cli_opt_set(&dopts
, D_SU
))
2226 dsu
= getnum(cli
->dsu
, &dopts
, D_SU
);
2227 if (cli_opt_set(&dopts
, D_SW
))
2230 /* data sunit/swidth options */
2231 if (cli_opt_set(&dopts
, D_SUNIT
) != cli_opt_set(&dopts
, D_SWIDTH
)) {
2233 _("both data sunit and data swidth options must be specified\n"));
2237 /* convert dsu/dsw to dsunit/dswidth and use them from now on */
2239 if (cli_opt_set(&dopts
, D_SU
) != cli_opt_set(&dopts
, D_SW
)) {
2241 _("both data su and data sw options must be specified\n"));
2245 if (dsu
% cfg
->sectorsize
) {
2247 _("data su must be a multiple of the sector size (%d)\n"), cfg
->sectorsize
);
2251 dsunit
= (int)BTOBBT(dsu
);
2252 big_dswidth
= (long long int)dsunit
* dsw
;
2253 if (big_dswidth
> INT_MAX
) {
2255 _("data stripe width (%lld) is too large of a multiple of the data stripe unit (%d)\n"),
2256 big_dswidth
, dsunit
);
2259 dswidth
= big_dswidth
;
2262 if ((dsunit
&& !dswidth
) || (!dsunit
&& dswidth
) ||
2263 (dsunit
&& (dswidth
% dsunit
!= 0))) {
2265 _("data stripe width (%d) must be a multiple of the data stripe unit (%d)\n"),
2270 /* If sunit & swidth were manually specified as 0, same as noalign */
2271 if ((cli_opt_set(&dopts
, D_SUNIT
) || cli_opt_set(&dopts
, D_SU
)) &&
2272 !dsunit
&& !dswidth
)
2273 cfg
->sb_feat
.nodalign
= true;
2275 /* if we are not using alignment, don't apply device defaults */
2276 if (cfg
->sb_feat
.nodalign
) {
2282 /* if no stripe config set, use the device default */
2284 /* Ignore nonsense from device. XXX add more validation */
2285 if (ft
->dsunit
&& ft
->dswidth
== 0) {
2287 _("%s: Volume reports stripe unit of %d bytes and stripe width of 0, ignoring.\n"),
2288 progname
, BBTOB(ft
->dsunit
));
2292 dsunit
= ft
->dsunit
;
2293 dswidth
= ft
->dswidth
;
2297 /* check and warn if user-specified alignment is sub-optimal */
2298 if (ft
->dsunit
&& ft
->dsunit
!= dsunit
) {
2300 _("%s: Specified data stripe unit %d is not the same as the volume stripe unit %d\n"),
2301 progname
, dsunit
, ft
->dsunit
);
2303 if (ft
->dswidth
&& ft
->dswidth
!= dswidth
) {
2305 _("%s: Specified data stripe width %d is not the same as the volume stripe width %d\n"),
2306 progname
, dswidth
, ft
->dswidth
);
2311 * now we have our stripe config, check it's a multiple of block
2314 if ((BBTOB(dsunit
) % cfg
->blocksize
) ||
2315 (BBTOB(dswidth
) % cfg
->blocksize
)) {
2317 * If we are using device defaults, just clear them and we're
2318 * good to go. Otherwise bail out with an error.
2322 _("%s: Stripe unit(%d) or stripe width(%d) is not a multiple of the block size(%d)\n"),
2323 progname
, BBTOB(dsunit
), BBTOB(dswidth
),
2329 cfg
->sb_feat
.nodalign
= true;
2332 /* convert from 512 byte blocks to fs blocksize */
2333 cfg
->dsunit
= DTOBT(dsunit
, cfg
->blocklog
);
2334 cfg
->dswidth
= DTOBT(dswidth
, cfg
->blocklog
);
2337 /* log sunit options */
2338 if (cli_opt_set(&lopts
, L_SUNIT
))
2339 lsunit
= cli
->lsunit
;
2340 else if (cli_opt_set(&lopts
, L_SU
))
2341 lsu
= getnum(cli
->lsu
, &lopts
, L_SU
);
2342 else if (cfg
->lsectorsize
> XLOG_HEADER_SIZE
)
2343 lsu
= cfg
->blocksize
; /* lsunit matches filesystem block size */
2346 /* verify if lsu is a multiple block size */
2347 if (lsu
% cfg
->blocksize
!= 0) {
2349 _("log stripe unit (%d) must be a multiple of the block size (%d)\n"),
2350 lsu
, cfg
->blocksize
);
2353 lsunit
= (int)BTOBBT(lsu
);
2355 if (BBTOB(lsunit
) % cfg
->blocksize
!= 0) {
2357 _("log stripe unit (%d) must be a multiple of the block size (%d)\n"),
2358 BBTOB(lsunit
), cfg
->blocksize
);
2363 * check that log sunit is modulo fsblksize or default it to dsunit.
2366 /* convert from 512 byte blocks to fs blocks */
2367 cfg
->lsunit
= DTOBT(lsunit
, cfg
->blocklog
);
2368 } else if (cfg
->sb_feat
.log_version
== 2 &&
2369 cfg
->loginternal
&& cfg
->dsunit
) {
2370 /* lsunit and dsunit now in fs blocks */
2371 cfg
->lsunit
= cfg
->dsunit
;
2374 if (cfg
->sb_feat
.log_version
== 2 &&
2375 cfg
->lsunit
* cfg
->blocksize
> 256 * 1024) {
2376 /* Warn only if specified on commandline */
2377 if (cli
->lsu
|| cli
->lsunit
!= -1) {
2379 _("log stripe unit (%d bytes) is too large (maximum is 256KiB)\n"
2380 "log stripe unit adjusted to 32KiB\n"),
2381 (cfg
->lsunit
* cfg
->blocksize
));
2383 /* XXX: 64k block size? */
2384 cfg
->lsunit
= (32 * 1024) / cfg
->blocksize
;
2391 struct mkfs_params
*cfg
,
2392 struct libxfs_xinit
*xi
,
2395 uint64_t sector_mask
;
2398 * Initialize. This will open the log and rt devices as well.
2400 xi
->setblksize
= cfg
->sectorsize
;
2401 if (!libxfs_init(xi
))
2404 fprintf(stderr
, _("no device name given in argument list\n"));
2409 * Ok, Linux only has a 1024-byte resolution on device _size_,
2410 * and the sizes below are in basic 512-byte blocks,
2411 * so if we have (size % 2), on any partition, we can't get
2412 * to the last 512 bytes. The same issue exists for larger
2413 * sector sizes - we cannot write past the last sector.
2415 * So, we reduce the size (in basic blocks) to a perfect
2416 * multiple of the sector size, or 1024, whichever is larger.
2418 sector_mask
= (uint64_t)-1 << (max(cfg
->sectorlog
, 10) - BBSHIFT
);
2419 xi
->dsize
&= sector_mask
;
2420 xi
->rtsize
&= sector_mask
;
2421 xi
->logBBsize
&= (uint64_t)-1 << (max(cfg
->lsectorlog
, 10) - BBSHIFT
);
2428 discard_blocks(xi
->ddev
, xi
->dsize
);
2429 if (xi
->rtdev
&& !xi
->risfile
)
2430 discard_blocks(xi
->rtdev
, xi
->rtsize
);
2431 if (xi
->logdev
&& xi
->logdev
!= xi
->ddev
&& !xi
->lisfile
)
2432 discard_blocks(xi
->logdev
, xi
->logBBsize
);
2437 struct mkfs_params
*cfg
,
2438 struct cli_params
*cli
)
2440 struct libxfs_xinit
*xi
= cli
->xi
;
2444 * if the device is a file, we can't validate the size here.
2445 * Instead, the file will be truncated to the correct length
2446 * later on. if it's not a file, we've got a dud device.
2449 fprintf(stderr
, _("can't get size of data subvolume\n"));
2452 ASSERT(cfg
->dblocks
);
2453 } else if (cfg
->dblocks
) {
2454 /* check the size fits into the underlying device */
2455 if (cfg
->dblocks
> DTOBT(xi
->dsize
, cfg
->blocklog
)) {
2457 _("size %s specified for data subvolume is too large, maximum is %lld blocks\n"),
2459 (long long)DTOBT(xi
->dsize
, cfg
->blocklog
));
2463 /* no user size, so use the full block device */
2464 cfg
->dblocks
= DTOBT(xi
->dsize
, cfg
->blocklog
);
2467 if (cfg
->dblocks
< XFS_MIN_DATA_BLOCKS
) {
2469 _("size %lld of data subvolume is too small, minimum %d blocks\n"),
2470 (long long)cfg
->dblocks
, XFS_MIN_DATA_BLOCKS
);
2474 if (xi
->dbsize
> cfg
->sectorsize
) {
2476 "Warning: the data subvolume sector size %u is less than the sector size \n\
2477 reported by the device (%u).\n"),
2478 cfg
->sectorsize
, xi
->dbsize
);
2483 * This is more complex than it needs to be because we still support volume
2484 * based external logs. They are only discovered *after* the devices have been
2485 * opened, hence the crazy "is this really an internal log" checks here.
2489 struct mkfs_params
*cfg
,
2490 struct cli_params
*cli
,
2493 struct libxfs_xinit
*xi
= cli
->xi
;
2497 /* check for volume log first */
2498 if (cli
->loginternal
&& xi
->volname
&& xi
->logdev
) {
2499 *devname
= _("volume log");
2500 cfg
->loginternal
= false;
2502 cfg
->loginternal
= cli
->loginternal
;
2504 /* now run device checks */
2505 if (cfg
->loginternal
) {
2508 _("can't have both external and internal logs\n"));
2513 * if no sector size has been specified on the command line,
2514 * use what has been configured and validated for the data
2517 if (!cli
->lsectorsize
) {
2518 cfg
->lsectorsize
= cfg
->sectorsize
;
2519 cfg
->lsectorlog
= cfg
->sectorlog
;
2522 if (cfg
->sectorsize
!= cfg
->lsectorsize
) {
2524 _("data and log sector sizes must be equal for internal logs\n"));
2527 if (cli
->logsize
&& cfg
->logblocks
>= cfg
->dblocks
) {
2529 _("log size %lld too large for internal log\n"),
2530 (long long)cfg
->logblocks
);
2533 *devname
= _("internal log");
2537 /* External/log subvolume checks */
2539 *devname
= xi
->logname
;
2540 if (!*devname
|| !xi
->logdev
) {
2541 fprintf(stderr
, _("no log subvolume or external log.\n"));
2545 if (!cfg
->logblocks
) {
2546 if (xi
->logBBsize
== 0) {
2548 _("unable to get size of the log subvolume.\n"));
2551 cfg
->logblocks
= DTOBT(xi
->logBBsize
, cfg
->blocklog
);
2552 } else if (cfg
->logblocks
> DTOBT(xi
->logBBsize
, cfg
->blocklog
)) {
2554 _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
2556 (long long)DTOBT(xi
->logBBsize
, cfg
->blocklog
));
2560 if (xi
->lbsize
> cfg
->lsectorsize
) {
2562 "Warning: the log subvolume sector size %u is less than the sector size\n\
2563 reported by the device (%u).\n"),
2564 cfg
->lsectorsize
, xi
->lbsize
);
2570 struct mkfs_params
*cfg
,
2571 struct cli_params
*cli
,
2574 struct libxfs_xinit
*xi
= cli
->xi
;
2581 _("size specified for non-existent rt subvolume\n"));
2585 *devname
= _("none");
2588 cfg
->rtbmblocks
= 0;
2592 fprintf(stderr
, _("Invalid zero length rt subvolume found\n"));
2598 *devname
= _("volume rt");
2600 *devname
= xi
->rtname
;
2603 if (cfg
->rtblocks
> DTOBT(xi
->rtsize
, cfg
->blocklog
)) {
2605 _("size %s specified for rt subvolume is too large, maxi->um is %lld blocks\n"),
2607 (long long)DTOBT(xi
->rtsize
, cfg
->blocklog
));
2610 if (xi
->rtbsize
> cfg
->sectorsize
) {
2612 "Warning: the realtime subvolume sector size %u is less than the sector size\n\
2613 reported by the device (%u).\n"),
2614 cfg
->sectorsize
, xi
->rtbsize
);
2617 /* grab volume size */
2618 cfg
->rtblocks
= DTOBT(xi
->rtsize
, cfg
->blocklog
);
2621 cfg
->rtextents
= cfg
->rtblocks
/ cfg
->rtextblocks
;
2622 cfg
->rtbmblocks
= (xfs_extlen_t
)howmany(cfg
->rtextents
,
2623 NBBY
* cfg
->blocksize
);
2627 calculate_initial_ag_geometry(
2628 struct mkfs_params
*cfg
,
2629 struct cli_params
*cli
)
2631 if (cli
->agsize
) { /* User-specified AG size */
2632 cfg
->agsize
= getnum(cli
->agsize
, &dopts
, D_AGSIZE
);
2635 * Check specified agsize is a multiple of blocksize.
2637 if (cfg
->agsize
% cfg
->blocksize
) {
2639 _("agsize (%s) not a multiple of fs blk size (%d)\n"),
2640 cli
->agsize
, cfg
->blocksize
);
2643 cfg
->agsize
/= cfg
->blocksize
;
2644 cfg
->agcount
= cfg
->dblocks
/ cfg
->agsize
+
2645 (cfg
->dblocks
% cfg
->agsize
!= 0);
2647 } else if (cli
->agcount
) { /* User-specified AG count */
2648 cfg
->agcount
= cli
->agcount
;
2649 cfg
->agsize
= cfg
->dblocks
/ cfg
->agcount
+
2650 (cfg
->dblocks
% cfg
->agcount
!= 0);
2652 calc_default_ag_geometry(cfg
->blocklog
, cfg
->dblocks
,
2653 cfg
->dsunit
, &cfg
->agsize
,
2659 * Align the AG size to stripe geometry. If this fails and we are using
2660 * discovered stripe geometry, tell the caller to clear the stripe geometry.
2661 * Otherwise, set the aligned geometry (valid or invalid!) so that the
2662 * validation call will fail and exit.
2666 struct mkfs_params
*cfg
)
2668 uint64_t tmp_agsize
;
2669 int dsunit
= cfg
->dsunit
;
2675 * agsize is not a multiple of dsunit
2677 if ((cfg
->agsize
% dsunit
) != 0) {
2679 * Round up to stripe unit boundary. Also make sure
2680 * that agsize is still larger than
2681 * XFS_AG_MIN_BLOCKS(blocklog)
2683 tmp_agsize
= ((cfg
->agsize
+ dsunit
- 1) / dsunit
) * dsunit
;
2685 * Round down to stripe unit boundary if rounding up
2686 * created an AG size that is larger than the AG max.
2688 if (tmp_agsize
> XFS_AG_MAX_BLOCKS(cfg
->blocklog
))
2689 tmp_agsize
= (cfg
->agsize
/ dsunit
) * dsunit
;
2691 if (tmp_agsize
< XFS_AG_MIN_BLOCKS(cfg
->blocklog
) &&
2692 tmp_agsize
> XFS_AG_MAX_BLOCKS(cfg
->blocklog
)) {
2695 * If the AG size is invalid and we are using device
2696 * probed stripe alignment, just clear the alignment
2699 if (!cli_opt_set(&dopts
, D_SUNIT
) &&
2700 !cli_opt_set(&dopts
, D_SU
)) {
2706 * set the agsize to the invalid value so the following
2707 * validation of the ag will fail and print a nice error
2710 cfg
->agsize
= tmp_agsize
;
2714 /* update geometry to be stripe unit aligned */
2715 cfg
->agsize
= tmp_agsize
;
2716 if (!cli_opt_set(&dopts
, D_AGCOUNT
))
2717 cfg
->agcount
= cfg
->dblocks
/ cfg
->agsize
+
2718 (cfg
->dblocks
% cfg
->agsize
!= 0);
2719 if (cli_opt_set(&dopts
, D_AGSIZE
))
2721 _("agsize rounded to %lld, sunit = %d\n"),
2722 (long long)cfg
->agsize
, dsunit
);
2725 if ((cfg
->agsize
% cfg
->dswidth
) == 0 &&
2726 cfg
->dswidth
!= cfg
->dsunit
&&
2729 if (cli_opt_set(&dopts
, D_AGCOUNT
) ||
2730 cli_opt_set(&dopts
, D_AGSIZE
)) {
2732 "Warning: AG size is a multiple of stripe width. This can cause performance\n\
2733 problems by aligning all AGs on the same disk. To avoid this, run mkfs with\n\
2734 an AG size that is one stripe unit smaller or larger, for example %llu.\n"),
2735 (unsigned long long)cfg
->agsize
- dsunit
);
2740 * This is a non-optimal configuration because all AGs start on
2741 * the same disk in the stripe. Changing the AG size by one
2742 * sunit will guarantee that this does not happen.
2744 tmp_agsize
= cfg
->agsize
- dsunit
;
2745 if (tmp_agsize
< XFS_AG_MIN_BLOCKS(cfg
->blocklog
)) {
2746 tmp_agsize
= cfg
->agsize
+ dsunit
;
2747 if (cfg
->dblocks
< cfg
->agsize
) {
2748 /* oh well, nothing to do */
2749 tmp_agsize
= cfg
->agsize
;
2753 cfg
->agsize
= tmp_agsize
;
2754 cfg
->agcount
= cfg
->dblocks
/ cfg
->agsize
+
2755 (cfg
->dblocks
% cfg
->agsize
!= 0);
2760 * If the last AG is too small, reduce the filesystem size
2761 * and drop the blocks.
2763 if (cfg
->dblocks
% cfg
->agsize
!= 0 &&
2764 (cfg
->dblocks
% cfg
->agsize
< XFS_AG_MIN_BLOCKS(cfg
->blocklog
))) {
2765 ASSERT(!cli_opt_set(&dopts
, D_AGCOUNT
));
2766 cfg
->dblocks
= (xfs_rfsblock_t
)((cfg
->agcount
- 1) * cfg
->agsize
);
2768 ASSERT(cfg
->agcount
!= 0);
2771 validate_ag_geometry(cfg
->blocklog
, cfg
->dblocks
,
2772 cfg
->agsize
, cfg
->agcount
);
2777 struct mkfs_params
*cfg
,
2778 struct cli_params
*cli
)
2780 cfg
->imaxpct
= cli
->imaxpct
;
2785 * This returns the % of the disk space that is used for
2786 * inodes, it changes relatively to the FS size:
2787 * - over 50 TB, use 1%,
2788 * - 1TB - 50 TB, use 5%,
2789 * - under 1 TB, use XFS_DFL_IMAXIMUM_PCT (25%).
2792 if (cfg
->dblocks
< TERABYTES(1, cfg
->blocklog
))
2793 cfg
->imaxpct
= XFS_DFL_IMAXIMUM_PCT
;
2794 else if (cfg
->dblocks
< TERABYTES(50, cfg
->blocklog
))
2801 * Set up the initial state of the superblock so we can start using the
2802 * libxfs geometry macros.
2806 struct mkfs_params
*cfg
,
2809 struct sb_feat_args
*fp
= &cfg
->sb_feat
;
2811 sbp
->sb_versionnum
= XFS_DFL_SB_VERSION_BITS
;
2812 if (fp
->crcs_enabled
)
2813 sbp
->sb_versionnum
|= XFS_SB_VERSION_5
;
2815 sbp
->sb_versionnum
|= XFS_SB_VERSION_4
;
2817 if (fp
->inode_align
) {
2818 int cluster_size
= XFS_INODE_BIG_CLUSTER_SIZE
;
2820 sbp
->sb_versionnum
|= XFS_SB_VERSION_ALIGNBIT
;
2821 if (cfg
->sb_feat
.crcs_enabled
)
2822 cluster_size
*= cfg
->inodesize
/ XFS_DINODE_MIN_SIZE
;
2823 sbp
->sb_inoalignmt
= cluster_size
>> cfg
->blocklog
;
2825 sbp
->sb_inoalignmt
= 0;
2828 sbp
->sb_versionnum
|= XFS_SB_VERSION_DALIGNBIT
;
2829 if (fp
->log_version
== 2)
2830 sbp
->sb_versionnum
|= XFS_SB_VERSION_LOGV2BIT
;
2831 if (fp
->attr_version
== 1)
2832 sbp
->sb_versionnum
|= XFS_SB_VERSION_ATTRBIT
;
2834 sbp
->sb_versionnum
|= XFS_SB_VERSION_BORGBIT
;
2836 if (cfg
->sectorsize
> BBSIZE
|| cfg
->lsectorsize
> BBSIZE
) {
2837 sbp
->sb_versionnum
|= XFS_SB_VERSION_SECTORBIT
;
2838 sbp
->sb_logsectlog
= (uint8_t)cfg
->lsectorlog
;
2839 sbp
->sb_logsectsize
= (uint16_t)cfg
->lsectorsize
;
2841 sbp
->sb_logsectlog
= 0;
2842 sbp
->sb_logsectsize
= 0;
2845 sbp
->sb_features2
= 0;
2846 if (fp
->lazy_sb_counters
)
2847 sbp
->sb_features2
|= XFS_SB_VERSION2_LAZYSBCOUNTBIT
;
2848 if (fp
->projid32bit
)
2849 sbp
->sb_features2
|= XFS_SB_VERSION2_PROJID32BIT
;
2850 if (fp
->parent_pointers
)
2851 sbp
->sb_features2
|= XFS_SB_VERSION2_PARENTBIT
;
2852 if (fp
->crcs_enabled
)
2853 sbp
->sb_features2
|= XFS_SB_VERSION2_CRCBIT
;
2854 if (fp
->attr_version
== 2)
2855 sbp
->sb_features2
|= XFS_SB_VERSION2_ATTR2BIT
;
2857 /* v5 superblocks have their own feature bit for dirftype */
2858 if (fp
->dirftype
&& !fp
->crcs_enabled
)
2859 sbp
->sb_features2
|= XFS_SB_VERSION2_FTYPE
;
2861 /* update whether extended features are in use */
2862 if (sbp
->sb_features2
!= 0)
2863 sbp
->sb_versionnum
|= XFS_SB_VERSION_MOREBITSBIT
;
2866 * Due to a structure alignment issue, sb_features2 ended up in one
2867 * of two locations, the second "incorrect" location represented by
2868 * the sb_bad_features2 field. To avoid older kernels mounting
2869 * filesystems they shouldn't, set both field to the same value.
2871 sbp
->sb_bad_features2
= sbp
->sb_features2
;
2873 if (!fp
->crcs_enabled
)
2876 /* default features for v5 filesystems */
2877 sbp
->sb_features_compat
= 0;
2878 sbp
->sb_features_ro_compat
= 0;
2879 sbp
->sb_features_incompat
= XFS_SB_FEAT_INCOMPAT_FTYPE
;
2880 sbp
->sb_features_log_incompat
= 0;
2883 sbp
->sb_features_ro_compat
= XFS_SB_FEAT_RO_COMPAT_FINOBT
;
2885 sbp
->sb_features_ro_compat
|= XFS_SB_FEAT_RO_COMPAT_RMAPBT
;
2887 sbp
->sb_features_ro_compat
|= XFS_SB_FEAT_RO_COMPAT_REFLINK
;
2890 * Sparse inode chunk support has two main inode alignment requirements.
2891 * First, sparse chunk alignment must match the cluster size. Second,
2892 * full chunk alignment must match the inode chunk size.
2894 * Copy the already calculated/scaled inoalignmt to spino_align and
2895 * update the former to the full inode chunk size.
2898 sbp
->sb_spino_align
= sbp
->sb_inoalignmt
;
2899 sbp
->sb_inoalignmt
= XFS_INODES_PER_CHUNK
*
2900 cfg
->inodesize
>> cfg
->blocklog
;
2901 sbp
->sb_features_incompat
|= XFS_SB_FEAT_INCOMPAT_SPINODES
;
2907 * Make sure that the log size is a multiple of the stripe unit
2911 struct mkfs_params
*cfg
,
2914 uint64_t tmp_logblocks
;
2916 /* nothing to do if it's already aligned. */
2917 if ((cfg
->logblocks
% sunit
) == 0)
2920 if (cli_opt_set(&lopts
, L_SIZE
)) {
2922 _("log size %lld is not a multiple of the log stripe unit %d\n"),
2923 (long long) cfg
->logblocks
, sunit
);
2927 tmp_logblocks
= ((cfg
->logblocks
+ (sunit
- 1)) / sunit
) * sunit
;
2929 /* If the log is too large, round down instead of round up */
2930 if ((tmp_logblocks
> XFS_MAX_LOG_BLOCKS
) ||
2931 ((tmp_logblocks
<< cfg
->blocklog
) > XFS_MAX_LOG_BYTES
)) {
2932 tmp_logblocks
= (cfg
->logblocks
/ sunit
) * sunit
;
2934 cfg
->logblocks
= tmp_logblocks
;
2938 * Make sure that the internal log is correctly aligned to the specified
2943 struct mkfs_params
*cfg
,
2944 struct xfs_mount
*mp
,
2947 /* round up log start if necessary */
2948 if ((cfg
->logstart
% sunit
) != 0)
2949 cfg
->logstart
= ((cfg
->logstart
+ (sunit
- 1)) / sunit
) * sunit
;
2951 /* round up/down the log size now */
2952 align_log_size(cfg
, sunit
);
2954 /* check the aligned log still fits in an AG. */
2955 if (cfg
->logblocks
> cfg
->agsize
- XFS_FSB_TO_AGBNO(mp
, cfg
->logstart
)) {
2957 _("Due to stripe alignment, the internal log size (%lld) is too large.\n"
2958 "Must fit within an allocation group.\n"),
2959 (long long) cfg
->logblocks
);
2965 validate_log_size(uint64_t logblocks
, int blocklog
, int min_logblocks
)
2967 if (logblocks
< min_logblocks
) {
2969 _("log size %lld blocks too small, minimum size is %d blocks\n"),
2970 (long long)logblocks
, min_logblocks
);
2973 if (logblocks
> XFS_MAX_LOG_BLOCKS
) {
2975 _("log size %lld blocks too large, maximum size is %lld blocks\n"),
2976 (long long)logblocks
, XFS_MAX_LOG_BLOCKS
);
2979 if ((logblocks
<< blocklog
) > XFS_MAX_LOG_BYTES
) {
2981 _("log size %lld bytes too large, maximum size is %lld bytes\n"),
2982 (long long)(logblocks
<< blocklog
), XFS_MAX_LOG_BYTES
);
2989 struct mkfs_params
*cfg
,
2990 struct cli_params
*cli
,
2991 struct xfs_mount
*mp
)
2993 struct xfs_sb
*sbp
= &mp
->m_sb
;
2995 struct xfs_mount mount
;
2997 /* we need a temporary mount to calculate the minimum log size. */
2998 memset(&mount
, 0, sizeof(mount
));
3000 libxfs_mount(&mount
, &mp
->m_sb
, 0, 0, 0, 0);
3001 min_logblocks
= libxfs_log_calc_minimum_size(&mount
);
3002 libxfs_umount(&mount
);
3004 ASSERT(min_logblocks
);
3005 min_logblocks
= max(XFS_MIN_LOG_BLOCKS
, min_logblocks
);
3007 /* if we have lots of blocks, check against XFS_MIN_LOG_BYTES, too */
3008 if (!cli
->logsize
&&
3009 cfg
->dblocks
>= (1024*1024*1024) >> cfg
->blocklog
)
3010 min_logblocks
= max(min_logblocks
,
3011 XFS_MIN_LOG_BYTES
>> cfg
->blocklog
);
3014 * external logs will have a device and size by now, so all we have
3015 * to do is validate it against minimum size and align it.
3017 if (!cfg
->loginternal
) {
3018 if (min_logblocks
> cfg
->logblocks
) {
3020 _("external log device %lld too small, must be at least %lld blocks\n"),
3021 (long long)cfg
->logblocks
,
3022 (long long)min_logblocks
);
3028 align_log_size(cfg
, cfg
->lsunit
);
3030 validate_log_size(cfg
->logblocks
, cfg
->blocklog
, min_logblocks
);
3034 /* internal log - if no size specified, calculate automatically */
3035 if (!cfg
->logblocks
) {
3036 if (cfg
->dblocks
< GIGABYTES(1, cfg
->blocklog
)) {
3037 /* tiny filesystems get minimum sized logs. */
3038 cfg
->logblocks
= min_logblocks
;
3039 } else if (cfg
->dblocks
< GIGABYTES(16, cfg
->blocklog
)) {
3042 * For small filesystems, we want to use the
3043 * XFS_MIN_LOG_BYTES for filesystems smaller than 16G if
3044 * at all possible, ramping up to 128MB at 256GB.
3046 cfg
->logblocks
= min(XFS_MIN_LOG_BYTES
>> cfg
->blocklog
,
3047 min_logblocks
* XFS_DFL_LOG_FACTOR
);
3050 * With a 2GB max log size, default to maximum size
3051 * at 4TB. This keeps the same ratio from the older
3052 * max log size of 128M at 256GB fs size. IOWs,
3053 * the ratio of fs size to log size is 2048:1.
3055 cfg
->logblocks
= (cfg
->dblocks
<< cfg
->blocklog
) / 2048;
3056 cfg
->logblocks
= cfg
->logblocks
>> cfg
->blocklog
;
3059 /* Ensure the chosen size meets minimum log size requirements */
3060 cfg
->logblocks
= max(min_logblocks
, cfg
->logblocks
);
3063 * Make sure the log fits wholly within an AG
3065 * XXX: If agf->freeblks ends up as 0 because the log uses all
3066 * the free space, it causes the kernel all sorts of problems
3067 * with per-ag reservations. Right now just back it off one
3068 * block, but there's a whole can of worms here that needs to be
3069 * opened to decide what is the valid maximum size of a log in
3072 cfg
->logblocks
= min(cfg
->logblocks
,
3073 libxfs_alloc_ag_max_usable(mp
) - 1);
3075 /* and now clamp the size to the maximum supported size */
3076 cfg
->logblocks
= min(cfg
->logblocks
, XFS_MAX_LOG_BLOCKS
);
3077 if ((cfg
->logblocks
<< cfg
->blocklog
) > XFS_MAX_LOG_BYTES
)
3078 cfg
->logblocks
= XFS_MAX_LOG_BYTES
>> cfg
->blocklog
;
3080 validate_log_size(cfg
->logblocks
, cfg
->blocklog
, min_logblocks
);
3083 if (cfg
->logblocks
> sbp
->sb_agblocks
- libxfs_prealloc_blocks(mp
)) {
3085 _("internal log size %lld too large, must fit in allocation group\n"),
3086 (long long)cfg
->logblocks
);
3090 if (cli_opt_set(&lopts
, L_AGNUM
)) {
3091 if (cli
->logagno
>= sbp
->sb_agcount
) {
3093 _("log ag number %lld too large, must be less than %lld\n"),
3094 (long long)cli
->logagno
,
3095 (long long)sbp
->sb_agcount
);
3098 cfg
->logagno
= cli
->logagno
;
3100 cfg
->logagno
= (xfs_agnumber_t
)(sbp
->sb_agcount
/ 2);
3102 cfg
->logstart
= XFS_AGB_TO_FSB(mp
, cfg
->logagno
,
3103 libxfs_prealloc_blocks(mp
));
3106 * Align the logstart at stripe unit boundary.
3109 align_internal_log(cfg
, mp
, cfg
->lsunit
);
3110 } else if (cfg
->dsunit
) {
3111 align_internal_log(cfg
, mp
, cfg
->dsunit
);
3113 validate_log_size(cfg
->logblocks
, cfg
->blocklog
, min_logblocks
);
3117 * Set up superblock with the minimum parameters required for
3118 * the libxfs macros needed by the log sizing code to run successfully.
3119 * This includes a minimum log size calculation, so we need everything
3120 * that goes into that calculation to be setup here including feature
3124 start_superblock_setup(
3125 struct mkfs_params
*cfg
,
3126 struct xfs_mount
*mp
,
3129 sbp
->sb_magicnum
= XFS_SB_MAGIC
;
3130 sbp
->sb_sectsize
= (uint16_t)cfg
->sectorsize
;
3131 sbp
->sb_sectlog
= (uint8_t)cfg
->sectorlog
;
3132 sbp
->sb_blocksize
= cfg
->blocksize
;
3133 sbp
->sb_blocklog
= (uint8_t)cfg
->blocklog
;
3135 sbp
->sb_agblocks
= (xfs_agblock_t
)cfg
->agsize
;
3136 sbp
->sb_agblklog
= (uint8_t)log2_roundup(cfg
->agsize
);
3137 sbp
->sb_agcount
= (xfs_agnumber_t
)cfg
->agcount
;
3139 sbp
->sb_inodesize
= (uint16_t)cfg
->inodesize
;
3140 sbp
->sb_inodelog
= (uint8_t)cfg
->inodelog
;
3141 sbp
->sb_inopblock
= (uint16_t)(cfg
->blocksize
/ cfg
->inodesize
);
3142 sbp
->sb_inopblog
= (uint8_t)(cfg
->blocklog
- cfg
->inodelog
);
3144 sbp
->sb_dirblklog
= cfg
->dirblocklog
- cfg
->blocklog
;
3146 sb_set_features(cfg
, sbp
);
3149 * log stripe unit is stored in bytes on disk and cannot be zero
3152 if (cfg
->sb_feat
.log_version
== 2) {
3154 sbp
->sb_logsunit
= XFS_FSB_TO_B(mp
, cfg
->lsunit
);
3156 sbp
->sb_logsunit
= 1;
3158 sbp
->sb_logsunit
= 0;
3164 struct mkfs_params
*cfg
,
3165 struct xfs_mount
*mp
,
3168 /* Minimum needed for libxfs_prealloc_blocks() */
3169 mp
->m_blkbb_log
= sbp
->sb_blocklog
- BBSHIFT
;
3170 mp
->m_sectbb_log
= sbp
->sb_sectlog
- BBSHIFT
;
3174 * Format everything from the generated config into the superblock that
3175 * will be used to initialise the on-disk superblock. This is the in-memory
3176 * copy, so no need to care about endian swapping here.
3179 finish_superblock_setup(
3180 struct mkfs_params
*cfg
,
3181 struct xfs_mount
*mp
,
3185 strncpy(sbp
->sb_fname
, cfg
->label
, sizeof(sbp
->sb_fname
));
3187 sbp
->sb_dblocks
= cfg
->dblocks
;
3188 sbp
->sb_rblocks
= cfg
->rtblocks
;
3189 sbp
->sb_rextents
= cfg
->rtextents
;
3190 platform_uuid_copy(&sbp
->sb_uuid
, &cfg
->uuid
);
3191 /* Only in memory; libxfs expects this as if read from disk */
3192 platform_uuid_copy(&sbp
->sb_meta_uuid
, &cfg
->uuid
);
3193 sbp
->sb_logstart
= cfg
->logstart
;
3194 sbp
->sb_rootino
= sbp
->sb_rbmino
= sbp
->sb_rsumino
= NULLFSINO
;
3195 sbp
->sb_rextsize
= cfg
->rtextblocks
;
3196 sbp
->sb_agcount
= (xfs_agnumber_t
)cfg
->agcount
;
3197 sbp
->sb_rbmblocks
= cfg
->rtbmblocks
;
3198 sbp
->sb_logblocks
= (xfs_extlen_t
)cfg
->logblocks
;
3199 sbp
->sb_rextslog
= (uint8_t)(cfg
->rtextents
?
3200 libxfs_highbit32((unsigned int)cfg
->rtextents
) : 0);
3201 sbp
->sb_inprogress
= 1; /* mkfs is in progress */
3202 sbp
->sb_imax_pct
= cfg
->imaxpct
;
3205 sbp
->sb_fdblocks
= cfg
->dblocks
-
3206 cfg
->agcount
* libxfs_prealloc_blocks(mp
) -
3207 (cfg
->loginternal
? cfg
->logblocks
: 0);
3208 sbp
->sb_frextents
= 0; /* will do a free later */
3209 sbp
->sb_uquotino
= sbp
->sb_gquotino
= sbp
->sb_pquotino
= 0;
3211 sbp
->sb_unit
= cfg
->dsunit
;
3212 sbp
->sb_width
= cfg
->dswidth
;
3217 * Sanitise the data and log devices and prepare them so libxfs can mount the
3218 * device successfully. Also check we can access the rt device if configured.
3222 struct mkfs_params
*cfg
,
3223 struct libxfs_xinit
*xi
,
3224 struct xfs_mount
*mp
,
3228 struct xfs_buf
*buf
;
3229 int whack_blks
= BTOBB(WHACK_SIZE
);
3233 * If there's an old XFS filesystem on the device with enough intact
3234 * information that we can parse the superblock, there's enough
3235 * information on disk to confuse a future xfs_repair call. To avoid
3236 * this, whack all the old secondary superblocks that we can find.
3239 zero_old_xfs_structures(xi
, sbp
);
3242 * If the data device is a file, grow out the file to its final size if
3243 * needed so that the reads for the end of the device in the mount code
3247 xi
->dsize
* xi
->dbsize
< cfg
->dblocks
* cfg
->blocksize
) {
3248 if (ftruncate(xi
->dfd
, cfg
->dblocks
* cfg
->blocksize
) < 0) {
3250 _("%s: Growing the data section failed\n"),
3255 /* update size to be able to whack blocks correctly */
3256 xi
->dsize
= BTOBB(cfg
->dblocks
* cfg
->blocksize
);
3260 * Zero out the end to obliterate any old MD RAID (or other) metadata at
3261 * the end of the device. (MD sb is ~64k from the end, take out a wider
3264 buf
= libxfs_getbuf(mp
->m_ddev_targp
, (xi
->dsize
- whack_blks
),
3266 memset(buf
->b_addr
, 0, WHACK_SIZE
);
3267 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3268 libxfs_purgebuf(buf
);
3271 * Now zero out the beginning of the device, to obliterate any old
3272 * filesystem signatures out there. This should take care of
3273 * swap (somewhere around the page size), jfs (32k),
3274 * ext[2,3] and reiserfs (64k) - and hopefully all else.
3276 buf
= libxfs_getbuf(mp
->m_ddev_targp
, 0, whack_blks
);
3277 memset(buf
->b_addr
, 0, WHACK_SIZE
);
3278 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3279 libxfs_purgebuf(buf
);
3281 /* OK, now write the superblock... */
3282 buf
= libxfs_getbuf(mp
->m_ddev_targp
, XFS_SB_DADDR
, XFS_FSS_TO_BB(mp
, 1));
3283 buf
->b_ops
= &xfs_sb_buf_ops
;
3284 memset(buf
->b_addr
, 0, cfg
->sectorsize
);
3285 libxfs_sb_to_disk(buf
->b_addr
, sbp
);
3286 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3287 libxfs_purgebuf(buf
);
3289 /* ...and zero the log.... */
3290 lsunit
= sbp
->sb_logsunit
;
3292 lsunit
= sbp
->sb_logsectsize
;
3294 libxfs_log_clear(mp
->m_logdev_targp
, NULL
,
3295 XFS_FSB_TO_DADDR(mp
, cfg
->logstart
),
3296 (xfs_extlen_t
)XFS_FSB_TO_BB(mp
, cfg
->logblocks
),
3297 &sbp
->sb_uuid
, cfg
->sb_feat
.log_version
,
3298 lsunit
, XLOG_FMT
, XLOG_INIT_CYCLE
, false);
3300 /* finally, check we can write the last block in the realtime area */
3301 if (mp
->m_rtdev_targp
->dev
&& cfg
->rtblocks
> 0) {
3302 buf
= libxfs_getbuf(mp
->m_rtdev_targp
,
3303 XFS_FSB_TO_BB(mp
, cfg
->rtblocks
- 1LL),
3304 BTOBB(cfg
->blocksize
));
3305 memset(buf
->b_addr
, 0, cfg
->blocksize
);
3306 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3307 libxfs_purgebuf(buf
);
3313 * XXX: this code is mostly common with the kernel growfs code.
3314 * These initialisations should be pulled into libxfs to keep the
3315 * kernel/userspace header initialisation code the same.
3318 initialise_ag_headers(
3319 struct mkfs_params
*cfg
,
3320 struct xfs_mount
*mp
,
3322 xfs_agnumber_t agno
,
3323 int *worst_freelist
)
3325 struct xfs_perag
*pag
= libxfs_perag_get(mp
, agno
);
3326 struct xfs_agfl
*agfl
;
3327 struct xfs_agf
*agf
;
3328 struct xfs_agi
*agi
;
3329 struct xfs_buf
*buf
;
3330 struct xfs_btree_block
*block
;
3331 struct xfs_alloc_rec
*arec
;
3332 struct xfs_alloc_rec
*nrec
;
3334 uint64_t agsize
= cfg
->agsize
;
3335 xfs_agblock_t agblocks
;
3336 bool is_log_ag
= false;
3339 if (cfg
->loginternal
&& agno
== cfg
->logagno
)
3345 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3346 XFS_AG_DADDR(mp
, agno
, XFS_SB_DADDR
),
3347 XFS_FSS_TO_BB(mp
, 1));
3348 buf
->b_ops
= &xfs_sb_buf_ops
;
3349 memset(buf
->b_addr
, 0, cfg
->sectorsize
);
3350 libxfs_sb_to_disk(buf
->b_addr
, sbp
);
3351 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3354 * AG header block: freespace
3356 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3357 XFS_AG_DADDR(mp
, agno
, XFS_AGF_DADDR(mp
)),
3358 XFS_FSS_TO_BB(mp
, 1));
3359 buf
->b_ops
= &xfs_agf_buf_ops
;
3360 agf
= XFS_BUF_TO_AGF(buf
);
3361 memset(agf
, 0, cfg
->sectorsize
);
3362 if (agno
== cfg
->agcount
- 1)
3363 agsize
= cfg
->dblocks
- (xfs_rfsblock_t
)(agno
* agsize
);
3364 agf
->agf_magicnum
= cpu_to_be32(XFS_AGF_MAGIC
);
3365 agf
->agf_versionnum
= cpu_to_be32(XFS_AGF_VERSION
);
3366 agf
->agf_seqno
= cpu_to_be32(agno
);
3367 agf
->agf_length
= cpu_to_be32(agsize
);
3368 agf
->agf_roots
[XFS_BTNUM_BNOi
] = cpu_to_be32(XFS_BNO_BLOCK(mp
));
3369 agf
->agf_roots
[XFS_BTNUM_CNTi
] = cpu_to_be32(XFS_CNT_BLOCK(mp
));
3370 agf
->agf_levels
[XFS_BTNUM_BNOi
] = cpu_to_be32(1);
3371 agf
->agf_levels
[XFS_BTNUM_CNTi
] = cpu_to_be32(1);
3372 pag
->pagf_levels
[XFS_BTNUM_BNOi
] = 1;
3373 pag
->pagf_levels
[XFS_BTNUM_CNTi
] = 1;
3375 if (xfs_sb_version_hasrmapbt(sbp
)) {
3376 agf
->agf_roots
[XFS_BTNUM_RMAPi
] = cpu_to_be32(XFS_RMAP_BLOCK(mp
));
3377 agf
->agf_levels
[XFS_BTNUM_RMAPi
] = cpu_to_be32(1);
3378 agf
->agf_rmap_blocks
= cpu_to_be32(1);
3381 if (xfs_sb_version_hasreflink(sbp
)) {
3382 agf
->agf_refcount_root
= cpu_to_be32(libxfs_refc_block(mp
));
3383 agf
->agf_refcount_level
= cpu_to_be32(1);
3384 agf
->agf_refcount_blocks
= cpu_to_be32(1);
3387 agf
->agf_flfirst
= 0;
3388 agf
->agf_fllast
= cpu_to_be32(libxfs_agfl_size(mp
) - 1);
3389 agf
->agf_flcount
= 0;
3390 agblocks
= (xfs_agblock_t
)(agsize
- libxfs_prealloc_blocks(mp
));
3391 agf
->agf_freeblks
= cpu_to_be32(agblocks
);
3392 agf
->agf_longest
= cpu_to_be32(agblocks
);
3394 if (xfs_sb_version_hascrc(sbp
))
3395 platform_uuid_copy(&agf
->agf_uuid
, &sbp
->sb_uuid
);
3398 be32_add_cpu(&agf
->agf_freeblks
, -(int64_t)cfg
->logblocks
);
3399 agf
->agf_longest
= cpu_to_be32(agsize
-
3400 XFS_FSB_TO_AGBNO(mp
, cfg
->logstart
) - cfg
->logblocks
);
3402 if (libxfs_alloc_min_freelist(mp
, pag
) > *worst_freelist
)
3403 *worst_freelist
= libxfs_alloc_min_freelist(mp
, pag
);
3404 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3407 * AG freelist header block
3409 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3410 XFS_AG_DADDR(mp
, agno
, XFS_AGFL_DADDR(mp
)),
3411 XFS_FSS_TO_BB(mp
, 1));
3412 buf
->b_ops
= &xfs_agfl_buf_ops
;
3413 agfl
= XFS_BUF_TO_AGFL(buf
);
3414 /* setting to 0xff results in initialisation to NULLAGBLOCK */
3415 memset(agfl
, 0xff, cfg
->sectorsize
);
3416 if (xfs_sb_version_hascrc(sbp
)) {
3417 agfl
->agfl_magicnum
= cpu_to_be32(XFS_AGFL_MAGIC
);
3418 agfl
->agfl_seqno
= cpu_to_be32(agno
);
3419 platform_uuid_copy(&agfl
->agfl_uuid
, &sbp
->sb_uuid
);
3420 for (bucket
= 0; bucket
< libxfs_agfl_size(mp
); bucket
++)
3421 agfl
->agfl_bno
[bucket
] = cpu_to_be32(NULLAGBLOCK
);
3424 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3427 * AG header block: inodes
3429 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3430 XFS_AG_DADDR(mp
, agno
, XFS_AGI_DADDR(mp
)),
3431 XFS_FSS_TO_BB(mp
, 1));
3432 agi
= XFS_BUF_TO_AGI(buf
);
3433 buf
->b_ops
= &xfs_agi_buf_ops
;
3434 memset(agi
, 0, cfg
->sectorsize
);
3435 agi
->agi_magicnum
= cpu_to_be32(XFS_AGI_MAGIC
);
3436 agi
->agi_versionnum
= cpu_to_be32(XFS_AGI_VERSION
);
3437 agi
->agi_seqno
= cpu_to_be32(agno
);
3438 agi
->agi_length
= cpu_to_be32(agsize
);
3440 agi
->agi_root
= cpu_to_be32(XFS_IBT_BLOCK(mp
));
3441 agi
->agi_level
= cpu_to_be32(1);
3442 if (xfs_sb_version_hasfinobt(sbp
)) {
3443 agi
->agi_free_root
= cpu_to_be32(XFS_FIBT_BLOCK(mp
));
3444 agi
->agi_free_level
= cpu_to_be32(1);
3446 agi
->agi_freecount
= 0;
3447 agi
->agi_newino
= cpu_to_be32(NULLAGINO
);
3448 agi
->agi_dirino
= cpu_to_be32(NULLAGINO
);
3449 if (xfs_sb_version_hascrc(sbp
))
3450 platform_uuid_copy(&agi
->agi_uuid
, &sbp
->sb_uuid
);
3451 for (c
= 0; c
< XFS_AGI_UNLINKED_BUCKETS
; c
++)
3452 agi
->agi_unlinked
[c
] = cpu_to_be32(NULLAGINO
);
3453 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3456 * BNO btree root block
3458 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3459 XFS_AGB_TO_DADDR(mp
, agno
, XFS_BNO_BLOCK(mp
)),
3460 BTOBB(cfg
->blocksize
));
3461 buf
->b_ops
= &xfs_allocbt_buf_ops
;
3462 block
= XFS_BUF_TO_BLOCK(buf
);
3463 memset(block
, 0, cfg
->blocksize
);
3464 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_BNO
, 0, 1, agno
, 0);
3466 arec
= XFS_ALLOC_REC_ADDR(mp
, block
, 1);
3467 arec
->ar_startblock
= cpu_to_be32(libxfs_prealloc_blocks(mp
));
3469 xfs_agblock_t start
= XFS_FSB_TO_AGBNO(mp
, cfg
->logstart
);
3471 ASSERT(start
>= libxfs_prealloc_blocks(mp
));
3472 if (start
!= libxfs_prealloc_blocks(mp
)) {
3474 * Modify first record to pad stripe align of log
3476 arec
->ar_blockcount
= cpu_to_be32(start
-
3477 libxfs_prealloc_blocks(mp
));
3480 * Insert second record at start of internal log
3481 * which then gets trimmed.
3483 nrec
->ar_startblock
= cpu_to_be32(
3484 be32_to_cpu(arec
->ar_startblock
) +
3485 be32_to_cpu(arec
->ar_blockcount
));
3487 be16_add_cpu(&block
->bb_numrecs
, 1);
3490 * Change record start to after the internal log
3492 be32_add_cpu(&arec
->ar_startblock
, cfg
->logblocks
);
3495 * Calculate the record block count and check for the case where
3496 * the log might have consumed all available space in the AG. If
3497 * so, reset the record count to 0 to avoid exposure of an invalid
3498 * record start block.
3500 arec
->ar_blockcount
= cpu_to_be32(agsize
-
3501 be32_to_cpu(arec
->ar_startblock
));
3502 if (!arec
->ar_blockcount
)
3503 block
->bb_numrecs
= 0;
3505 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3508 * CNT btree root block
3510 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3511 XFS_AGB_TO_DADDR(mp
, agno
, XFS_CNT_BLOCK(mp
)),
3512 BTOBB(cfg
->blocksize
));
3513 buf
->b_ops
= &xfs_allocbt_buf_ops
;
3514 block
= XFS_BUF_TO_BLOCK(buf
);
3515 memset(block
, 0, cfg
->blocksize
);
3516 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_CNT
, 0, 1, agno
, 0);
3518 arec
= XFS_ALLOC_REC_ADDR(mp
, block
, 1);
3519 arec
->ar_startblock
= cpu_to_be32(libxfs_prealloc_blocks(mp
));
3521 xfs_agblock_t start
= XFS_FSB_TO_AGBNO(mp
, cfg
->logstart
);
3523 ASSERT(start
>= libxfs_prealloc_blocks(mp
));
3524 if (start
!= libxfs_prealloc_blocks(mp
)) {
3525 arec
->ar_blockcount
= cpu_to_be32(start
-
3526 libxfs_prealloc_blocks(mp
));
3528 nrec
->ar_startblock
= cpu_to_be32(
3529 be32_to_cpu(arec
->ar_startblock
) +
3530 be32_to_cpu(arec
->ar_blockcount
));
3532 be16_add_cpu(&block
->bb_numrecs
, 1);
3534 be32_add_cpu(&arec
->ar_startblock
, cfg
->logblocks
);
3537 * Calculate the record block count and check for the case where
3538 * the log might have consumed all available space in the AG. If
3539 * so, reset the record count to 0 to avoid exposure of an invalid
3540 * record start block.
3542 arec
->ar_blockcount
= cpu_to_be32(agsize
-
3543 be32_to_cpu(arec
->ar_startblock
));
3544 if (!arec
->ar_blockcount
)
3545 block
->bb_numrecs
= 0;
3547 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3550 * refcount btree root block
3552 if (xfs_sb_version_hasreflink(sbp
)) {
3553 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3554 XFS_AGB_TO_DADDR(mp
, agno
, libxfs_refc_block(mp
)),
3555 BTOBB(cfg
->blocksize
));
3556 buf
->b_ops
= &xfs_refcountbt_buf_ops
;
3558 block
= XFS_BUF_TO_BLOCK(buf
);
3559 memset(block
, 0, cfg
->blocksize
);
3560 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_REFC
, 0, 0, agno
, 0);
3561 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3565 * INO btree root block
3567 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3568 XFS_AGB_TO_DADDR(mp
, agno
, XFS_IBT_BLOCK(mp
)),
3569 BTOBB(cfg
->blocksize
));
3570 buf
->b_ops
= &xfs_inobt_buf_ops
;
3571 block
= XFS_BUF_TO_BLOCK(buf
);
3572 memset(block
, 0, cfg
->blocksize
);
3573 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_INO
, 0, 0, agno
, 0);
3574 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3577 * Free INO btree root block
3579 if (xfs_sb_version_hasfinobt(sbp
)) {
3580 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3581 XFS_AGB_TO_DADDR(mp
, agno
, XFS_FIBT_BLOCK(mp
)),
3582 BTOBB(cfg
->blocksize
));
3583 buf
->b_ops
= &xfs_inobt_buf_ops
;
3584 block
= XFS_BUF_TO_BLOCK(buf
);
3585 memset(block
, 0, cfg
->blocksize
);
3586 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_FINO
, 0, 0, agno
, 0);
3587 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3590 /* RMAP btree root block */
3591 if (xfs_sb_version_hasrmapbt(sbp
)) {
3592 struct xfs_rmap_rec
*rrec
;
3594 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3595 XFS_AGB_TO_DADDR(mp
, agno
, XFS_RMAP_BLOCK(mp
)),
3596 BTOBB(cfg
->blocksize
));
3597 buf
->b_ops
= &xfs_rmapbt_buf_ops
;
3598 block
= XFS_BUF_TO_BLOCK(buf
);
3599 memset(block
, 0, cfg
->blocksize
);
3601 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_RMAP
, 0, 0, agno
, 0);
3604 * mark the AG header regions as static metadata
3605 * The BNO btree block is the first block after the
3606 * headers, so it's location defines the size of region
3607 * the static metadata consumes.
3609 rrec
= XFS_RMAP_REC_ADDR(block
, 1);
3610 rrec
->rm_startblock
= 0;
3611 rrec
->rm_blockcount
= cpu_to_be32(XFS_BNO_BLOCK(mp
));
3612 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_FS
);
3613 rrec
->rm_offset
= 0;
3614 be16_add_cpu(&block
->bb_numrecs
, 1);
3616 /* account freespace btree root blocks */
3617 rrec
= XFS_RMAP_REC_ADDR(block
, 2);
3618 rrec
->rm_startblock
= cpu_to_be32(XFS_BNO_BLOCK(mp
));
3619 rrec
->rm_blockcount
= cpu_to_be32(2);
3620 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_AG
);
3621 rrec
->rm_offset
= 0;
3622 be16_add_cpu(&block
->bb_numrecs
, 1);
3624 /* account inode btree root blocks */
3625 rrec
= XFS_RMAP_REC_ADDR(block
, 3);
3626 rrec
->rm_startblock
= cpu_to_be32(XFS_IBT_BLOCK(mp
));
3627 rrec
->rm_blockcount
= cpu_to_be32(XFS_RMAP_BLOCK(mp
) -
3629 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_INOBT
);
3630 rrec
->rm_offset
= 0;
3631 be16_add_cpu(&block
->bb_numrecs
, 1);
3633 /* account for rmap btree root */
3634 rrec
= XFS_RMAP_REC_ADDR(block
, 4);
3635 rrec
->rm_startblock
= cpu_to_be32(XFS_RMAP_BLOCK(mp
));
3636 rrec
->rm_blockcount
= cpu_to_be32(1);
3637 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_AG
);
3638 rrec
->rm_offset
= 0;
3639 be16_add_cpu(&block
->bb_numrecs
, 1);
3641 /* account for refcount btree root */
3642 if (xfs_sb_version_hasreflink(sbp
)) {
3643 rrec
= XFS_RMAP_REC_ADDR(block
, 5);
3644 rrec
->rm_startblock
= cpu_to_be32(libxfs_refc_block(mp
));
3645 rrec
->rm_blockcount
= cpu_to_be32(1);
3646 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_REFC
);
3647 rrec
->rm_offset
= 0;
3648 be16_add_cpu(&block
->bb_numrecs
, 1);
3651 /* account for the log space */
3653 rrec
= XFS_RMAP_REC_ADDR(block
,
3654 be16_to_cpu(block
->bb_numrecs
) + 1);
3655 rrec
->rm_startblock
= cpu_to_be32(
3656 XFS_FSB_TO_AGBNO(mp
, cfg
->logstart
));
3657 rrec
->rm_blockcount
= cpu_to_be32(cfg
->logblocks
);
3658 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_LOG
);
3659 rrec
->rm_offset
= 0;
3660 be16_add_cpu(&block
->bb_numrecs
, 1);
3663 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3666 libxfs_perag_put(pag
);
3670 initialise_ag_freespace(
3671 struct xfs_mount
*mp
,
3672 xfs_agnumber_t agno
,
3675 struct xfs_alloc_arg args
;
3676 struct xfs_trans
*tp
;
3679 c
= -libxfs_trans_alloc_rollable(mp
, worst_freelist
, &tp
);
3683 memset(&args
, 0, sizeof(args
));
3688 args
.pag
= libxfs_perag_get(mp
, agno
);
3690 libxfs_alloc_fix_freelist(&args
, 0);
3691 libxfs_perag_put(args
.pag
);
3692 libxfs_trans_commit(tp
);
3696 * rewrite several secondary superblocks with the root inode number filled out.
3697 * This can help repair recovery from a trashed primary superblock without
3698 * losing the root inode.
3701 rewrite_secondary_superblocks(
3702 struct xfs_mount
*mp
)
3704 struct xfs_buf
*buf
;
3706 /* rewrite the last superblock */
3707 buf
= libxfs_readbuf(mp
->m_dev
,
3708 XFS_AGB_TO_DADDR(mp
, mp
->m_sb
.sb_agcount
- 1,
3710 XFS_FSS_TO_BB(mp
, 1),
3711 LIBXFS_EXIT_ON_FAILURE
, &xfs_sb_buf_ops
);
3712 XFS_BUF_TO_SBP(buf
)->sb_rootino
= cpu_to_be64(mp
->m_sb
.sb_rootino
);
3713 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3715 /* and one in the middle for luck if there's enough AGs for that */
3716 if (mp
->m_sb
.sb_agcount
<= 2)
3719 buf
= libxfs_readbuf(mp
->m_dev
,
3720 XFS_AGB_TO_DADDR(mp
, (mp
->m_sb
.sb_agcount
- 1) / 2,
3722 XFS_FSS_TO_BB(mp
, 1),
3723 LIBXFS_EXIT_ON_FAILURE
, &xfs_sb_buf_ops
);
3724 XFS_BUF_TO_SBP(buf
)->sb_rootino
= cpu_to_be64(mp
->m_sb
.sb_rootino
);
3725 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3733 xfs_agnumber_t agno
;
3737 char *logfile
= NULL
;
3738 char *rtfile
= NULL
;
3741 int force_overwrite
= 0;
3743 char *protofile
= NULL
;
3744 char *protostring
= NULL
;
3745 int worst_freelist
= 0;
3747 struct libxfs_xinit xi
= {
3748 .isdirect
= LIBXFS_DIRECT
,
3749 .isreadonly
= LIBXFS_EXCLUSIVELY
,
3751 struct xfs_mount mbuf
= {};
3752 struct xfs_mount
*mp
= &mbuf
;
3753 struct xfs_sb
*sbp
= &mp
->m_sb
;
3754 struct fs_topology ft
= {};
3755 struct cli_params cli
= {
3759 struct mkfs_params cfg
= {};
3761 /* build time defaults */
3762 struct mkfs_default_params dft
= {
3763 .source
= _("package build definitions"),
3764 .sectorsize
= XFS_MIN_SECTORSIZE
,
3765 .blocksize
= 1 << XFS_DFL_BLOCKSIZE_LOG
,
3770 .inode_align
= true,
3772 .lazy_sb_counters
= true,
3773 .projid32bit
= true,
3774 .crcs_enabled
= true,
3780 .parent_pointers
= false,
3786 platform_uuid_generate(&cli
.uuid
);
3787 progname
= basename(argv
[0]);
3788 setlocale(LC_ALL
, "");
3789 bindtextdomain(PACKAGE
, LOCALEDIR
);
3790 textdomain(PACKAGE
);
3793 * TODO: Sourcing defaults from a config file
3795 * Before anything else, see if there's a config file with different
3796 * defaults. If a file exists in <package location>, read in the new
3797 * default values and overwrite them in the &dft structure. This way the
3798 * new defaults will apply before we parse the CLI, and the CLI will
3799 * still be able to override them. When more than one source is
3800 * implemented, emit a message to indicate where the defaults being
3803 * printf(_("Default configuration sourced from %s\n"), dft.source);
3806 /* copy new defaults into CLI parsing structure */
3807 memcpy(&cli
.sb_feat
, &dft
.sb_feat
, sizeof(cli
.sb_feat
));
3808 memcpy(&cli
.fsx
, &dft
.fsx
, sizeof(cli
.fsx
));
3810 while ((c
= getopt(argc
, argv
, "b:d:i:l:L:m:n:KNp:qr:s:CfV")) != EOF
) {
3814 force_overwrite
= 1;
3824 parse_subopts(c
, optarg
, &cli
);
3827 if (strlen(optarg
) > sizeof(sbp
->sb_fname
))
3828 illegal(optarg
, "L");
3839 respec('p', NULL
, 0);
3846 printf(_("%s version %s\n"), progname
, VERSION
);
3849 unknown(optopt
, "");
3852 if (argc
- optind
> 1) {
3853 fprintf(stderr
, _("extra arguments\n"));
3855 } else if (argc
- optind
== 1) {
3856 dfile
= xi
.volname
= getstr(argv
[optind
], &dopts
, D_NAME
);
3860 protostring
= setup_proto(protofile
);
3863 * Extract as much of the valid config as we can from the CLI input
3864 * before opening the libxfs devices.
3866 validate_blocksize(&cfg
, &cli
, &dft
);
3867 validate_sectorsize(&cfg
, &cli
, &dft
, &ft
, dfile
, dry_run
,
3871 * XXX: we still need to set block size and sector size global variables
3872 * so that getnum/cvtnum works correctly
3874 blocksize
= cfg
.blocksize
;
3875 sectorsize
= cfg
.sectorsize
;
3877 validate_log_sectorsize(&cfg
, &cli
, &dft
);
3878 validate_sb_features(&cfg
, &cli
);
3881 * we've now completed basic validation of the features, sector and
3882 * block sizes, so from this point onwards we use the values found in
3883 * the cfg structure for them, not the command line structure.
3885 validate_dirblocksize(&cfg
, &cli
);
3886 validate_inodesize(&cfg
, &cli
);
3889 * if the device size was specified convert it to a block count
3890 * now we have a valid block size. These will be set to zero if
3891 * nothing was specified, indicating we should use the full device.
3893 cfg
.dblocks
= calc_dev_size(cli
.dsize
, &cfg
, &dopts
, D_SIZE
, "data");
3894 cfg
.logblocks
= calc_dev_size(cli
.logsize
, &cfg
, &lopts
, L_SIZE
, "log");
3895 cfg
.rtblocks
= calc_dev_size(cli
.rtsize
, &cfg
, &ropts
, R_SIZE
, "rt");
3897 validate_rtextsize(&cfg
, &cli
, &ft
);
3898 calc_stripe_factors(&cfg
, &cli
, &ft
);
3901 * Open and validate the device configurations
3903 open_devices(&cfg
, &xi
, (discard
&& !dry_run
));
3904 validate_datadev(&cfg
, &cli
);
3905 validate_logdev(&cfg
, &cli
, &logfile
);
3906 validate_rtdev(&cfg
, &cli
, &rtfile
);
3909 * At this point when know exactly what size all the devices are,
3910 * so we can start validating and calculating layout options that are
3911 * dependent on device sizes. Once calculated, make sure everything
3912 * aligns to device geometry correctly.
3914 calculate_initial_ag_geometry(&cfg
, &cli
);
3915 align_ag_geometry(&cfg
);
3917 calculate_imaxpct(&cfg
, &cli
);
3920 * Set up the basic superblock parameters now so that we can use
3921 * the geometry information we've already validated in libxfs
3922 * provided functions to determine on-disk format information.
3924 start_superblock_setup(&cfg
, mp
, sbp
);
3925 initialise_mount(&cfg
, mp
, sbp
);
3928 * With the mount set up, we can finally calculate the log size
3929 * constraints and do default size calculations and final validation
3931 calculate_log_size(&cfg
, &cli
, mp
);
3933 finish_superblock_setup(&cfg
, mp
, sbp
);
3935 /* Print the intended geometry of the fs. */
3936 if (!quiet
|| dry_run
) {
3937 struct xfs_fsop_geom geo
;
3940 error
= -libxfs_fs_geometry(sbp
, &geo
,
3941 XFS_FS_GEOM_MAX_STRUCT_VER
);
3944 _("%s: failed to generate filesystem geometry\n"),
3949 xfs_report_geom(&geo
, dfile
, logfile
, rtfile
);
3955 * we need the libxfs buffer cache from here on in.
3957 libxfs_buftarg_init(mp
, xi
.ddev
, xi
.logdev
, xi
.rtdev
);
3960 * Before we mount the filesystem we need to make sure the devices have
3961 * enough of the filesystem structure on them that allows libxfs to
3964 prepare_devices(&cfg
, &xi
, mp
, sbp
, force_overwrite
);
3965 mp
= libxfs_mount(mp
, sbp
, xi
.ddev
, xi
.logdev
, xi
.rtdev
, 0);
3967 fprintf(stderr
, _("%s: filesystem failed to initialize\n"),
3973 * Initialise all the static on disk metadata.
3975 for (agno
= 0; agno
< cfg
.agcount
; agno
++)
3976 initialise_ag_headers(&cfg
, mp
, sbp
, agno
, &worst_freelist
);
3979 * Initialise the freespace freelists (i.e. AGFLs) in each AG.
3981 for (agno
= 0; agno
< cfg
.agcount
; agno
++)
3982 initialise_ag_freespace(mp
, agno
, worst_freelist
);
3985 * Allocate the root inode and anything else in the proto file.
3987 parse_proto(mp
, &cli
.fsx
, &protostring
);
3990 * Protect ourselves against possible stupidity
3992 if (XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rootino
) != 0) {
3994 _("%s: root inode created in AG %u, not AG 0\n"),
3995 progname
, XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rootino
));
4000 * Re-write multiple secondary superblocks with rootinode field set
4002 if (mp
->m_sb
.sb_agcount
> 1)
4003 rewrite_secondary_superblocks(mp
);
4006 * Dump all inodes and buffers before marking us all done.
4007 * Need to drop references to inodes we still hold, first.
4009 libxfs_rtmount_destroy(mp
);
4010 libxfs_bcache_purge();
4013 * Mark the filesystem ok.
4015 buf
= libxfs_getsb(mp
, LIBXFS_EXIT_ON_FAILURE
);
4016 (XFS_BUF_TO_SBP(buf
))->sb_inprogress
= 0;
4017 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
4021 libxfs_device_close(xi
.rtdev
);
4022 if (xi
.logdev
&& xi
.logdev
!= xi
.ddev
)
4023 libxfs_device_close(xi
.logdev
);
4024 libxfs_device_close(xi
.ddev
);