2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it would be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "xfs_multidisk.h"
25 * Prototypes for internal functions.
27 static void conflict(char opt
, const char *tab
[], int oldidx
, int newidx
);
28 static void illegal(const char *value
, const char *opt
);
29 static __attribute__((noreturn
)) void usage (void);
30 static __attribute__((noreturn
)) void reqval(char opt
, const char *tab
[], int idx
);
31 static void respec(char opt
, const char *tab
[], int idx
);
32 static void unknown(char opt
, char *s
);
33 static int ispow2(unsigned int i
);
36 * The configured block and sector sizes are defined as global variables so
37 * that they don't need to be passed to functions that require them.
39 unsigned int blocksize
;
40 unsigned int sectorsize
;
42 #define MAX_SUBOPTS 17
43 #define SUBOPT_NEEDS_VAL (-1LL)
44 #define MAX_CONFLICTS 8
45 #define LAST_CONFLICT (-1)
48 * Table for parsing mkfs parameters.
50 * Description of the structure members follows:
53 * Name is a single char, e.g., for '-d file', name is 'd'.
56 * Subopts is a list of strings naming suboptions. In the example above,
57 * it would contain "file". The last entry of this list has to be NULL.
59 * subopt_params MANDATORY
60 * This is a list of structs tied with subopts. For each entry in subopts,
61 * a corresponding entry has to be defined:
63 * subopt_params struct:
65 * This number, starting from zero, denotes which item in subopt_params
66 * it is. The index has to be the same as is the order in subopts list,
67 * so we can access the right item both in subopt_param and subopts.
70 * Do not set this flag when definning a subopt. It is used to remeber that
71 * this subopt was already seen, for example for conflicts detection.
74 * Do not set. It is used internally for respecification, when some options
75 * has to be parsed twice - at first as a string, then later as a number.
78 * A flag signalling whether the user-given value can use suffixes.
79 * If you want to allow the use of user-friendly values like 13k, 42G,
83 * An optional flag for subopts where the given value has to be a power
87 * If your subopt is in a conflict with some other option, specify it.
88 * Accepts the .index values of the conflicting subopts and the last
89 * member of this list has to be LAST_CONFLICT.
91 * minval, maxval OPTIONAL
92 * These options are used for automatic range check and they have to be
93 * always used together in pair. If you don't want to limit the max value,
94 * use something like UINT_MAX. If no value is given, then you must either
95 * supply your own validation, or refuse any value in the 'case
96 * X_SOMETHING' block. If you forget to define the min and max value, but
97 * call a standard function for validating user's value, it will cause an
98 * error message notifying you about this issue.
100 * (Said in another way, you can't have minval and maxval both equal
101 * to zero. But if one value is different: minval=0 and maxval=1,
104 * defaultval MANDATORY
105 * The value used if user specifies the subopt, but no value.
106 * If the subopt accepts some values (-d file=[1|0]), then this
107 * sets what is used with simple specifying the subopt (-d file).
108 * A special SUBOPT_NEEDS_VAL can be used to require a user-given
113 const char *subopts
[MAX_SUBOPTS
];
115 struct subopt_param
{
121 int conflicts
[MAX_CONFLICTS
];
124 long long defaultval
;
125 } subopt_params
[MAX_SUBOPTS
];
128 struct opt_params bopts
= {
139 .conflicts
= { B_SIZE
,
141 .minval
= XFS_MIN_BLOCKSIZE_LOG
,
142 .maxval
= XFS_MAX_BLOCKSIZE_LOG
,
143 .defaultval
= SUBOPT_NEEDS_VAL
,
148 .conflicts
= { B_LOG
,
150 .minval
= XFS_MIN_BLOCKSIZE
,
151 .maxval
= XFS_MAX_BLOCKSIZE
,
152 .defaultval
= SUBOPT_NEEDS_VAL
,
157 struct opt_params dopts
= {
180 #define D_SECTSIZE 10
184 #define D_RTINHERIT 12
186 #define D_PROJINHERIT 13
188 #define D_EXTSZINHERIT 14
190 #define D_COWEXTSIZE 15
195 { .index
= D_AGCOUNT
,
196 .conflicts
= { D_AGSIZE
,
199 .maxval
= XFS_MAX_AGNUMBER
,
200 .defaultval
= SUBOPT_NEEDS_VAL
,
203 .conflicts
= { LAST_CONFLICT
},
209 .conflicts
= { LAST_CONFLICT
},
210 .defaultval
= SUBOPT_NEEDS_VAL
,
213 .conflicts
= { LAST_CONFLICT
},
215 .minval
= XFS_AG_MIN_BYTES
,
217 .defaultval
= SUBOPT_NEEDS_VAL
,
220 .conflicts
= { D_NOALIGN
,
226 .defaultval
= SUBOPT_NEEDS_VAL
,
229 .conflicts
= { D_NOALIGN
,
235 .defaultval
= SUBOPT_NEEDS_VAL
,
238 .conflicts
= { D_AGCOUNT
,
241 .minval
= XFS_AG_MIN_BYTES
,
242 .maxval
= XFS_AG_MAX_BYTES
,
243 .defaultval
= SUBOPT_NEEDS_VAL
,
246 .conflicts
= { D_NOALIGN
,
253 .defaultval
= SUBOPT_NEEDS_VAL
,
256 .conflicts
= { D_NOALIGN
,
262 .defaultval
= SUBOPT_NEEDS_VAL
,
264 { .index
= D_SECTLOG
,
265 .conflicts
= { D_SECTSIZE
,
267 .minval
= XFS_MIN_SECTORSIZE_LOG
,
268 .maxval
= XFS_MAX_SECTORSIZE_LOG
,
269 .defaultval
= SUBOPT_NEEDS_VAL
,
271 { .index
= D_SECTSIZE
,
272 .conflicts
= { D_SECTLOG
,
276 .minval
= XFS_MIN_SECTORSIZE
,
277 .maxval
= XFS_MAX_SECTORSIZE
,
278 .defaultval
= SUBOPT_NEEDS_VAL
,
280 { .index
= D_NOALIGN
,
290 { .index
= D_RTINHERIT
,
291 .conflicts
= { LAST_CONFLICT
},
296 { .index
= D_PROJINHERIT
,
297 .conflicts
= { LAST_CONFLICT
},
300 .defaultval
= SUBOPT_NEEDS_VAL
,
302 { .index
= D_EXTSZINHERIT
,
303 .conflicts
= { LAST_CONFLICT
},
306 .defaultval
= SUBOPT_NEEDS_VAL
,
308 { .index
= D_COWEXTSIZE
,
309 .conflicts
= { LAST_CONFLICT
},
312 .defaultval
= SUBOPT_NEEDS_VAL
,
318 struct opt_params iopts
= {
333 #define I_PROJID32BIT 6
341 .conflicts
= { LAST_CONFLICT
},
347 .conflicts
= { I_PERBLOCK
,
350 .minval
= XFS_DINODE_MIN_LOG
,
351 .maxval
= XFS_DINODE_MAX_LOG
,
352 .defaultval
= SUBOPT_NEEDS_VAL
,
355 .conflicts
= { LAST_CONFLICT
},
358 .defaultval
= SUBOPT_NEEDS_VAL
,
360 { .index
= I_PERBLOCK
,
361 .conflicts
= { I_LOG
,
365 .minval
= XFS_MIN_INODE_PERBLOCK
,
366 .maxval
= XFS_MAX_BLOCKSIZE
/ XFS_DINODE_MIN_SIZE
,
367 .defaultval
= SUBOPT_NEEDS_VAL
,
370 .conflicts
= { I_PERBLOCK
,
374 .minval
= XFS_DINODE_MIN_SIZE
,
375 .maxval
= XFS_DINODE_MAX_SIZE
,
376 .defaultval
= SUBOPT_NEEDS_VAL
,
379 .conflicts
= { LAST_CONFLICT
},
382 .defaultval
= SUBOPT_NEEDS_VAL
,
384 { .index
= I_PROJID32BIT
,
385 .conflicts
= { LAST_CONFLICT
},
390 { .index
= I_SPINODES
,
391 .conflicts
= { LAST_CONFLICT
},
399 struct opt_params lopts
= {
424 #define L_LAZYSBCNTR 11
430 .conflicts
= { L_DEV
,
434 .defaultval
= SUBOPT_NEEDS_VAL
,
436 { .index
= L_INTERNAL
,
437 .conflicts
= { L_FILE
,
447 .conflicts
= { LAST_CONFLICT
},
449 .minval
= 2 * 1024 * 1024LL, /* XXX: XFS_MIN_LOG_BYTES */
450 .maxval
= XFS_MAX_LOG_BYTES
,
451 .defaultval
= SUBOPT_NEEDS_VAL
,
453 { .index
= L_VERSION
,
454 .conflicts
= { LAST_CONFLICT
},
457 .defaultval
= SUBOPT_NEEDS_VAL
,
463 .maxval
= BTOBB(XLOG_MAX_RECORD_BSIZE
),
464 .defaultval
= SUBOPT_NEEDS_VAL
,
467 .conflicts
= { L_SUNIT
,
471 .maxval
= XLOG_MAX_RECORD_BSIZE
,
472 .defaultval
= SUBOPT_NEEDS_VAL
,
475 .conflicts
= { L_AGNUM
,
478 .defaultval
= SUBOPT_NEEDS_VAL
,
480 { .index
= L_SECTLOG
,
481 .conflicts
= { L_SECTSIZE
,
484 .minval
= XFS_MIN_SECTORSIZE_LOG
,
485 .maxval
= XFS_MAX_SECTORSIZE_LOG
,
486 .defaultval
= SUBOPT_NEEDS_VAL
,
488 { .index
= L_SECTSIZE
,
489 .conflicts
= { L_SECTLOG
,
494 .minval
= XFS_MIN_SECTORSIZE
,
495 .maxval
= XFS_MAX_SECTORSIZE
,
496 .defaultval
= SUBOPT_NEEDS_VAL
,
499 .conflicts
= { L_INTERNAL
,
506 .conflicts
= { L_AGNUM
,
509 .defaultval
= SUBOPT_NEEDS_VAL
,
511 { .index
= L_LAZYSBCNTR
,
512 .conflicts
= { LAST_CONFLICT
},
520 struct opt_params nopts
= {
535 .conflicts
= { N_SIZE
,
537 .minval
= XFS_MIN_REC_DIRSIZE
,
538 .maxval
= XFS_MAX_BLOCKSIZE_LOG
,
539 .defaultval
= SUBOPT_NEEDS_VAL
,
542 .conflicts
= { N_LOG
,
546 .minval
= 1 << XFS_MIN_REC_DIRSIZE
,
547 .maxval
= XFS_MAX_BLOCKSIZE
,
548 .defaultval
= SUBOPT_NEEDS_VAL
,
550 { .index
= N_VERSION
,
551 .conflicts
= { LAST_CONFLICT
},
554 .defaultval
= SUBOPT_NEEDS_VAL
,
557 .conflicts
= { LAST_CONFLICT
},
565 struct opt_params ropts
= {
583 { .index
= R_EXTSIZE
,
584 .conflicts
= { LAST_CONFLICT
},
586 .minval
= XFS_MIN_RTEXTSIZE
,
587 .maxval
= XFS_MAX_RTEXTSIZE
,
588 .defaultval
= SUBOPT_NEEDS_VAL
,
591 .conflicts
= { LAST_CONFLICT
},
595 .defaultval
= SUBOPT_NEEDS_VAL
,
598 .conflicts
= { LAST_CONFLICT
},
599 .defaultval
= SUBOPT_NEEDS_VAL
,
605 .conflicts
= { LAST_CONFLICT
},
608 .conflicts
= { LAST_CONFLICT
},
609 .defaultval
= SUBOPT_NEEDS_VAL
,
611 { .index
= R_NOALIGN
,
615 .conflicts
= { LAST_CONFLICT
},
620 struct opt_params sopts
= {
635 .conflicts
= { S_SIZE
,
638 .minval
= XFS_MIN_SECTORSIZE_LOG
,
639 .maxval
= XFS_MAX_SECTORSIZE_LOG
,
640 .defaultval
= SUBOPT_NEEDS_VAL
,
642 { .index
= S_SECTLOG
,
643 .conflicts
= { S_SIZE
,
646 .minval
= XFS_MIN_SECTORSIZE_LOG
,
647 .maxval
= XFS_MAX_SECTORSIZE_LOG
,
648 .defaultval
= SUBOPT_NEEDS_VAL
,
651 .conflicts
= { S_LOG
,
656 .minval
= XFS_MIN_SECTORSIZE
,
657 .maxval
= XFS_MAX_SECTORSIZE
,
658 .defaultval
= SUBOPT_NEEDS_VAL
,
660 { .index
= S_SECTSIZE
,
661 .conflicts
= { S_LOG
,
666 .minval
= XFS_MIN_SECTORSIZE
,
667 .maxval
= XFS_MAX_SECTORSIZE
,
668 .defaultval
= SUBOPT_NEEDS_VAL
,
673 struct opt_params mopts
= {
690 .conflicts
= { LAST_CONFLICT
},
696 .conflicts
= { LAST_CONFLICT
},
702 .conflicts
= { LAST_CONFLICT
},
703 .defaultval
= SUBOPT_NEEDS_VAL
,
706 .conflicts
= { LAST_CONFLICT
},
711 { .index
= M_REFLINK
,
712 .conflicts
= { LAST_CONFLICT
},
720 /* quick way of checking if a parameter was set on the CLI */
723 struct opt_params
*opts
,
726 return opts
->subopt_params
[subopt
].seen
||
727 opts
->subopt_params
[subopt
].str_seen
;
731 * Options configured on the command line.
733 * This stores all the specific config parameters the user sets on the command
734 * line. We do not use these values directly - they are inputs to the mkfs
735 * geometry validation and override any default configuration value we have.
737 * We don't keep flags to indicate what parameters are set - if we need to check
738 * if an option was set on the command line, we check the relevant entry in the
739 * option table which records whether it was specified in the .seen and
740 * .str_seen variables in the table.
742 * Some parameters are stored as strings for post-parsing after their dependent
743 * options have been resolved (e.g. block size and sector size have been parsed
746 * This allows us to check that values have been set without needing separate
747 * flags for each value, and hence avoids needing to record and check for each
748 * specific option that can set the value later on in the code. In the cases
749 * where we don't have a cli_params structure around, the above cli_opt_set()
750 * function can be used.
752 struct sb_feat_args
{
758 bool lazy_sb_counters
;
766 bool parent_pointers
;
776 /* parameters that depend on sector/block size being validated. */
786 /* parameters where 0 is a valid CLI value */
794 /* parameters where 0 is not a valid value */
803 /* feature flags that are set */
804 struct sb_feat_args sb_feat
;
806 /* root inode characteristics */
809 /* libxfs device setup */
810 struct libxfs_xinit
*xi
;
814 * Calculated filesystem feature and geometry information.
816 * This structure contains the information we will use to create the on-disk
817 * filesystem from. The validation and calculation code uses it to store all the
818 * temporary and final config state for the filesystem.
820 * The information in this structure will contain a mix of validated CLI input
821 * variables, default feature state and calculated values that are needed to
822 * construct the superblock and other on disk features. These are all in one
823 * place so that we don't have to pass handfuls of seemingly arbitrary variables
824 * around to different functions to do the work we need to do.
842 uint64_t rtextblocks
;
844 uint64_t rtbmblocks
; /* rt bitmap blocks */
846 int dsunit
; /* in FSBs */
847 int dswidth
; /* in FSBs */
848 int lsunit
; /* in FSBs */
862 struct sb_feat_args sb_feat
;
865 #define TERABYTES(count, blog) ((uint64_t)(count) << (40 - (blog)))
866 #define GIGABYTES(count, blog) ((uint64_t)(count) << (30 - (blog)))
867 #define MEGABYTES(count, blog) ((uint64_t)(count) << (20 - (blog)))
870 * Use this macro before we have superblock and mount structure
872 #define DTOBT(d) ((xfs_rfsblock_t)((d) >> (blocklog - BBSHIFT)))
875 * Use this for block reservations needed for mkfs's conditions
876 * (basically no fragmentation).
878 #define MKFS_BLOCKRES_INODE \
879 ((uint)(mp->m_ialloc_blks + (mp->m_in_maxlevels - 1)))
880 #define MKFS_BLOCKRES(rb) \
881 ((uint)(MKFS_BLOCKRES_INODE + XFS_DA_NODE_MAXDEPTH + \
882 (XFS_BM_MAXLEVELS(mp, XFS_DATA_FORK) - 1) + (rb)))
884 /* amount (in bytes) we zero at the beginning and end of the device to
885 * remove traces of other filesystems, raid superblocks, etc.
887 #define WHACK_SIZE (128 * 1024)
890 * Convert lsu to lsunit for 512 bytes blocks and check validity of the values.
903 /* Handle data sunit/swidth options */
904 if ((*dsunit
&& !*dswidth
) || (!*dsunit
&& *dswidth
)) {
906 _("both data sunit and data swidth options "
907 "must be specified\n"));
912 if ((dsu
&& !dsw
) || (!dsu
&& dsw
)) {
914 _("both data su and data sw options "
915 "must be specified\n"));
921 _("data su must be a multiple of the "
922 "sector size (%d)\n"), dsectsz
);
926 *dsunit
= (int)BTOBBT(dsu
);
927 *dswidth
= *dsunit
* dsw
;
930 if (*dsunit
&& (*dswidth
% *dsunit
!= 0)) {
932 _("data stripe width (%d) must be a multiple of the "
933 "data stripe unit (%d)\n"), *dswidth
, *dsunit
);
937 /* Handle log sunit options */
940 *lsunit
= (int)BTOBBT(lsu
);
942 /* verify if lsu/lsunit is a multiple block size */
943 if (lsu
% blocksize
!= 0) {
945 _("log stripe unit (%d) must be a multiple of the block size (%d)\n"),
949 if ((BBTOB(*lsunit
) % blocksize
!= 0)) {
951 _("log stripe unit (%d) must be a multiple of the block size (%d)\n"),
952 BBTOB(*lsunit
), blocksize
);
964 bool force_overwrite
,
969 if (*isfile
&& (no_size
|| no_name
)) {
971 _("if -%s file then -%s name and -%s size are required\n"),
972 optname
, optname
, optname
);
977 fprintf(stderr
, _("No device name specified\n"));
981 if (stat(name
, &statbuf
)) {
982 if (errno
== ENOENT
&& *isfile
) {
989 _("Error accessing specified device %s: %s\n"),
990 name
, strerror(errno
));
995 if (!force_overwrite
&& check_overwrite(name
)) {
997 _("%s: Use the -f option to force overwrite.\n"),
1003 * We only want to completely truncate and recreate an existing file if
1004 * we were specifically told it was a file. Set the create flag only in
1005 * this case to trigger that behaviour.
1007 if (S_ISREG(statbuf
.st_mode
)) {
1015 if (S_ISBLK(statbuf
.st_mode
)) {
1018 _("specified \"-%s file\" on a block device %s\n"),
1026 _("specified device %s not a file or block device\n"),
1032 fixup_log_stripe_unit(
1035 xfs_rfsblock_t
*logblocks
,
1038 uint64_t tmp_logblocks
;
1041 * Make sure that the log size is a multiple of the stripe unit
1043 if ((*logblocks
% sunit
) != 0) {
1045 tmp_logblocks
= ((*logblocks
+ (sunit
- 1))
1048 * If the log is too large, round down
1049 * instead of round up
1051 if ((tmp_logblocks
> XFS_MAX_LOG_BLOCKS
) ||
1052 ((tmp_logblocks
<< blocklog
) > XFS_MAX_LOG_BYTES
)) {
1053 tmp_logblocks
= (*logblocks
/ sunit
) * sunit
;
1055 *logblocks
= tmp_logblocks
;
1057 fprintf(stderr
, _("log size %lld is not a multiple "
1058 "of the log stripe unit %d\n"),
1059 (long long) *logblocks
, sunit
);
1065 static xfs_fsblock_t
1066 fixup_internal_log_stripe(
1069 xfs_fsblock_t logstart
,
1072 xfs_rfsblock_t
*logblocks
,
1076 if ((logstart
% sunit
) != 0) {
1077 logstart
= ((logstart
+ (sunit
- 1))/sunit
) * sunit
;
1081 fixup_log_stripe_unit(lsflag
, sunit
, logblocks
, blocklog
);
1083 if (*logblocks
> agsize
- XFS_FSB_TO_AGBNO(mp
, logstart
)) {
1085 _("Due to stripe alignment, the internal log size "
1086 "(%lld) is too large.\n"), (long long) *logblocks
);
1087 fprintf(stderr
, _("Must fit within an allocation group.\n"));
1094 validate_log_size(uint64_t logblocks
, int blocklog
, int min_logblocks
)
1096 if (logblocks
< min_logblocks
) {
1098 _("log size %lld blocks too small, minimum size is %d blocks\n"),
1099 (long long)logblocks
, min_logblocks
);
1102 if (logblocks
> XFS_MAX_LOG_BLOCKS
) {
1104 _("log size %lld blocks too large, maximum size is %lld blocks\n"),
1105 (long long)logblocks
, XFS_MAX_LOG_BLOCKS
);
1108 if ((logblocks
<< blocklog
) > XFS_MAX_LOG_BYTES
) {
1110 _("log size %lld bytes too large, maximum size is %lld bytes\n"),
1111 (long long)(logblocks
<< blocklog
), XFS_MAX_LOG_BYTES
);
1117 calc_default_imaxpct(
1122 * This returns the % of the disk space that is used for
1123 * inodes, it changes relatively to the FS size:
1124 * - over 50 TB, use 1%,
1125 * - 1TB - 50 TB, use 5%,
1126 * - under 1 TB, use XFS_DFL_IMAXIMUM_PCT (25%).
1129 if (dblocks
< TERABYTES(1, blocklog
)) {
1130 return XFS_DFL_IMAXIMUM_PCT
;
1131 } else if (dblocks
< TERABYTES(50, blocklog
)) {
1139 validate_ag_geometry(
1145 if (agsize
< XFS_AG_MIN_BLOCKS(blocklog
)) {
1147 _("agsize (%lld blocks) too small, need at least %lld blocks\n"),
1149 (long long)XFS_AG_MIN_BLOCKS(blocklog
));
1153 if (agsize
> XFS_AG_MAX_BLOCKS(blocklog
)) {
1155 _("agsize (%lld blocks) too big, maximum is %lld blocks\n"),
1157 (long long)XFS_AG_MAX_BLOCKS(blocklog
));
1161 if (agsize
> dblocks
) {
1163 _("agsize (%lld blocks) too big, data area is %lld blocks\n"),
1164 (long long)agsize
, (long long)dblocks
);
1168 if (agsize
< XFS_AG_MIN_BLOCKS(blocklog
)) {
1170 _("too many allocation groups for size = %lld\n"),
1172 fprintf(stderr
, _("need at most %lld allocation groups\n"),
1173 (long long)(dblocks
/ XFS_AG_MIN_BLOCKS(blocklog
) +
1174 (dblocks
% XFS_AG_MIN_BLOCKS(blocklog
) != 0)));
1178 if (agsize
> XFS_AG_MAX_BLOCKS(blocklog
)) {
1180 _("too few allocation groups for size = %lld\n"), (long long)agsize
);
1182 _("need at least %lld allocation groups\n"),
1183 (long long)(dblocks
/ XFS_AG_MAX_BLOCKS(blocklog
) +
1184 (dblocks
% XFS_AG_MAX_BLOCKS(blocklog
) != 0)));
1189 * If the last AG is too small, reduce the filesystem size
1190 * and drop the blocks.
1192 if ( dblocks
% agsize
!= 0 &&
1193 (dblocks
% agsize
< XFS_AG_MIN_BLOCKS(blocklog
))) {
1195 _("last AG size %lld blocks too small, minimum size is %lld blocks\n"),
1196 (long long)(dblocks
% agsize
),
1197 (long long)XFS_AG_MIN_BLOCKS(blocklog
));
1202 * If agcount is too large, make it smaller.
1204 if (agcount
> XFS_MAX_AGNUMBER
+ 1) {
1206 _("%lld allocation groups is too many, maximum is %lld\n"),
1207 (long long)agcount
, (long long)XFS_MAX_AGNUMBER
+ 1);
1213 zero_old_xfs_structures(
1224 * We open regular files with O_TRUNC|O_CREAT. Nothing to do here...
1226 if (xi
->disfile
&& xi
->dcreat
)
1230 * read in existing filesystem superblock, use its geometry
1231 * settings and zero the existing secondary superblocks.
1233 buf
= memalign(libxfs_device_alignment(), new_sb
->sb_sectsize
);
1236 _("error reading existing superblock -- failed to memalign buffer\n"));
1239 memset(buf
, 0, new_sb
->sb_sectsize
);
1242 * If we are creating an image file, it might be of zero length at this
1243 * point in time. Hence reading the existing superblock is going to
1244 * return zero bytes. It's not a failure we need to warn about in this
1247 off
= pread(xi
->dfd
, buf
, new_sb
->sb_sectsize
, 0);
1248 if (off
!= new_sb
->sb_sectsize
) {
1251 _("error reading existing superblock: %s\n"),
1255 libxfs_sb_from_disk(&sb
, buf
);
1258 * perform same basic superblock validation to make sure we
1259 * actually zero secondary blocks
1261 if (sb
.sb_magicnum
!= XFS_SB_MAGIC
|| sb
.sb_blocksize
== 0)
1264 for (bsize
= 1, i
= 0; bsize
< sb
.sb_blocksize
&&
1265 i
< sizeof(sb
.sb_blocksize
) * NBBY
; i
++)
1268 if (i
< XFS_MIN_BLOCKSIZE_LOG
|| i
> XFS_MAX_BLOCKSIZE_LOG
||
1269 i
!= sb
.sb_blocklog
)
1272 if (sb
.sb_dblocks
> ((uint64_t)sb
.sb_agcount
* sb
.sb_agblocks
) ||
1273 sb
.sb_dblocks
< ((uint64_t)(sb
.sb_agcount
- 1) *
1274 sb
.sb_agblocks
+ XFS_MIN_AG_BLOCKS
))
1278 * block size and basic geometry seems alright, zero the secondaries.
1280 memset(buf
, 0, new_sb
->sb_sectsize
);
1282 for (i
= 1; i
< sb
.sb_agcount
; i
++) {
1283 off
+= sb
.sb_agblocks
;
1284 if (pwrite(xi
->dfd
, buf
, new_sb
->sb_sectsize
,
1285 off
<< sb
.sb_blocklog
) == -1)
1293 discard_blocks(dev_t dev
, uint64_t nsectors
)
1298 * We intentionally ignore errors from the discard ioctl. It is
1299 * not necessary for the mkfs functionality but just an optimization.
1301 fd
= libxfs_device_to_fd(dev
);
1303 platform_discard_blocks(fd
, 0, nsectors
<< 9);
1309 struct sb_feat_args
*fp
,
1315 sbp
->sb_versionnum
= XFS_DFL_SB_VERSION_BITS
;
1316 if (fp
->crcs_enabled
)
1317 sbp
->sb_versionnum
|= XFS_SB_VERSION_5
;
1319 sbp
->sb_versionnum
|= XFS_SB_VERSION_4
;
1321 if (fp
->inode_align
)
1322 sbp
->sb_versionnum
|= XFS_SB_VERSION_ALIGNBIT
;
1324 sbp
->sb_versionnum
|= XFS_SB_VERSION_DALIGNBIT
;
1325 if (fp
->log_version
== 2)
1326 sbp
->sb_versionnum
|= XFS_SB_VERSION_LOGV2BIT
;
1327 if (fp
->attr_version
== 1)
1328 sbp
->sb_versionnum
|= XFS_SB_VERSION_ATTRBIT
;
1329 if (sectsize
> BBSIZE
|| lsectsize
> BBSIZE
)
1330 sbp
->sb_versionnum
|= XFS_SB_VERSION_SECTORBIT
;
1332 sbp
->sb_versionnum
|= XFS_SB_VERSION_BORGBIT
;
1335 sbp
->sb_features2
= 0;
1336 if (fp
->lazy_sb_counters
)
1337 sbp
->sb_features2
|= XFS_SB_VERSION2_LAZYSBCOUNTBIT
;
1338 if (!fp
->projid16bit
)
1339 sbp
->sb_features2
|= XFS_SB_VERSION2_PROJID32BIT
;
1340 if (fp
->parent_pointers
)
1341 sbp
->sb_features2
|= XFS_SB_VERSION2_PARENTBIT
;
1342 if (fp
->crcs_enabled
)
1343 sbp
->sb_features2
|= XFS_SB_VERSION2_CRCBIT
;
1344 if (fp
->attr_version
== 2)
1345 sbp
->sb_features2
|= XFS_SB_VERSION2_ATTR2BIT
;
1347 /* v5 superblocks have their own feature bit for dirftype */
1348 if (fp
->dirftype
&& !fp
->crcs_enabled
)
1349 sbp
->sb_features2
|= XFS_SB_VERSION2_FTYPE
;
1351 /* update whether extended features are in use */
1352 if (sbp
->sb_features2
!= 0)
1353 sbp
->sb_versionnum
|= XFS_SB_VERSION_MOREBITSBIT
;
1356 * Due to a structure alignment issue, sb_features2 ended up in one
1357 * of two locations, the second "incorrect" location represented by
1358 * the sb_bad_features2 field. To avoid older kernels mounting
1359 * filesystems they shouldn't, set both field to the same value.
1361 sbp
->sb_bad_features2
= sbp
->sb_features2
;
1363 if (!fp
->crcs_enabled
)
1366 /* default features for v5 filesystems */
1367 sbp
->sb_features_compat
= 0;
1368 sbp
->sb_features_ro_compat
= 0;
1369 sbp
->sb_features_incompat
= XFS_SB_FEAT_INCOMPAT_FTYPE
;
1370 sbp
->sb_features_log_incompat
= 0;
1373 sbp
->sb_features_ro_compat
= XFS_SB_FEAT_RO_COMPAT_FINOBT
;
1375 sbp
->sb_features_ro_compat
|= XFS_SB_FEAT_RO_COMPAT_RMAPBT
;
1377 sbp
->sb_features_ro_compat
|= XFS_SB_FEAT_RO_COMPAT_REFLINK
;
1380 * Sparse inode chunk support has two main inode alignment requirements.
1381 * First, sparse chunk alignment must match the cluster size. Second,
1382 * full chunk alignment must match the inode chunk size.
1384 * Copy the already calculated/scaled inoalignmt to spino_align and
1385 * update the former to the full inode chunk size.
1388 sbp
->sb_spino_align
= sbp
->sb_inoalignmt
;
1389 sbp
->sb_inoalignmt
= XFS_INODES_PER_CHUNK
*
1390 sbp
->sb_inodesize
>> sbp
->sb_blocklog
;
1391 sbp
->sb_features_incompat
|= XFS_SB_FEAT_INCOMPAT_SPINODES
;
1396 static __attribute__((noreturn
)) void
1399 struct opt_params
*opts
,
1404 _("Illegal value %s for -%c %s option. %s\n"),
1405 value
, opts
->name
, opts
->subopts
[index
],
1406 reason
? reason
: "");
1411 * Check for conflicts and option respecification.
1415 struct opt_params
*opts
,
1419 struct subopt_param
*sp
= &opts
->subopt_params
[index
];
1422 if (sp
->index
!= index
) {
1424 _("Developer screwed up option parsing (%d/%d)! Please report!\n"),
1426 reqval(opts
->name
, opts
->subopts
, index
);
1430 * Check for respecification of the option. This is more complex than it
1431 * seems because some options are parsed twice - once as a string during
1432 * input parsing, then later the string is passed to getnum for
1433 * conversion into a number and bounds checking. Hence the two variables
1434 * used to track the different uses based on the @str parameter passed
1439 respec(opts
->name
, opts
->subopts
, index
);
1443 respec(opts
->name
, opts
->subopts
, index
);
1444 sp
->str_seen
= true;
1447 /* check for conflicts with the option */
1448 for (i
= 0; i
< MAX_CONFLICTS
; i
++) {
1449 int conflict_opt
= sp
->conflicts
[i
];
1451 if (conflict_opt
== LAST_CONFLICT
)
1453 if (opts
->subopt_params
[conflict_opt
].seen
||
1454 opts
->subopt_params
[conflict_opt
].str_seen
)
1455 conflict(opts
->name
, opts
->subopts
,
1456 conflict_opt
, index
);
1463 struct opt_params
*opts
,
1466 struct subopt_param
*sp
= &opts
->subopt_params
[index
];
1469 check_opt(opts
, index
, false);
1470 /* empty strings might just return a default value */
1471 if (!str
|| *str
== '\0') {
1472 if (sp
->defaultval
== SUBOPT_NEEDS_VAL
)
1473 reqval(opts
->name
, opts
->subopts
, index
);
1474 return sp
->defaultval
;
1477 if (sp
->minval
== 0 && sp
->maxval
== 0) {
1479 _("Option -%c %s has undefined minval/maxval."
1480 "Can't verify value range. This is a bug.\n"),
1481 opts
->name
, opts
->subopts
[index
]);
1486 * Some values are pure numbers, others can have suffixes that define
1487 * the units of the number. Those get passed to cvtnum(), otherwise we
1488 * convert it ourselves to guarantee there is no trailing garbage in the
1492 c
= cvtnum(blocksize
, sectorsize
, str
);
1496 c
= strtoll(str
, &str_end
, 0);
1497 if (c
== 0 && str_end
== str
)
1498 illegal_option(str
, opts
, index
, NULL
);
1499 if (*str_end
!= '\0')
1500 illegal_option(str
, opts
, index
, NULL
);
1503 /* Validity check the result. */
1505 illegal_option(str
, opts
, index
, _("value is too small"));
1506 else if (c
> sp
->maxval
)
1507 illegal_option(str
, opts
, index
, _("value is too large"));
1508 if (sp
->is_power_2
&& !ispow2(c
))
1509 illegal_option(str
, opts
, index
, _("value must be a power of 2"));
1514 * Option is a string - do all the option table work, and check there
1515 * is actually an option string. Otherwise we don't do anything with the string
1516 * here - validation will be done later when the string is converted to a value
1517 * or used as a file/device path.
1522 struct opt_params
*opts
,
1525 check_opt(opts
, index
, true);
1527 /* empty strings for string options are not valid */
1528 if (!str
|| *str
== '\0')
1529 reqval(opts
->name
, opts
->subopts
, index
);
1535 struct opt_params
*opts
,
1538 struct cli_params
*cli
)
1544 blocklog
= getnum(value
, opts
, B_LOG
);
1545 cli
->blocksize
= 1 << blocklog
;
1548 cli
->blocksize
= getnum(value
, opts
, B_SIZE
);
1558 struct opt_params
*opts
,
1561 struct cli_params
*cli
)
1567 cli
->agcount
= getnum(value
, opts
, D_AGCOUNT
);
1570 cli
->agsize
= getstr(value
, opts
, D_AGSIZE
);
1573 cli
->xi
->disfile
= getnum(value
, opts
, D_FILE
);
1576 cli
->xi
->dname
= getstr(value
, opts
, D_NAME
);
1579 cli
->dsize
= getstr(value
, opts
, D_SIZE
);
1582 cli
->dsunit
= getnum(value
, opts
, D_SUNIT
);
1585 cli
->dswidth
= getnum(value
, opts
, D_SWIDTH
);
1588 cli
->dsu
= getstr(value
, opts
, D_SU
);
1591 cli
->dsw
= getnum(value
, opts
, D_SW
);
1594 cli
->sb_feat
.nodalign
= getnum(value
, opts
, D_NOALIGN
);
1597 if (cli
->sectorsize
)
1598 conflict('d', opts
->subopts
, D_SECTSIZE
, D_SECTLOG
);
1599 sectorlog
= getnum(value
, opts
, D_SECTLOG
);
1600 cli
->sectorsize
= 1 << sectorlog
;
1603 if (cli
->sectorsize
)
1604 conflict('d', opts
->subopts
, D_SECTSIZE
, D_SECTLOG
);
1605 cli
->sectorsize
= getnum(value
, opts
, D_SECTSIZE
);
1608 if (getnum(value
, opts
, D_RTINHERIT
))
1609 cli
->fsx
.fsx_xflags
|= XFS_DIFLAG_RTINHERIT
;
1612 cli
->fsx
.fsx_projid
= getnum(value
, opts
, D_PROJINHERIT
);
1613 cli
->fsx
.fsx_xflags
|= XFS_DIFLAG_PROJINHERIT
;
1615 case D_EXTSZINHERIT
:
1616 cli
->fsx
.fsx_extsize
= getnum(value
, opts
, D_EXTSZINHERIT
);
1617 cli
->fsx
.fsx_xflags
|= XFS_DIFLAG_EXTSZINHERIT
;
1620 cli
->fsx
.fsx_cowextsize
= getnum(value
, opts
, D_COWEXTSIZE
);
1621 cli
->fsx
.fsx_xflags
|= FS_XFLAG_COWEXTSIZE
;
1631 struct opt_params
*opts
,
1634 struct cli_params
*cli
)
1640 cli
->sb_feat
.inode_align
= getnum(value
, &iopts
, I_ALIGN
);
1643 inodelog
= getnum(value
, &iopts
, I_LOG
);
1644 cli
->inodesize
= 1 << inodelog
;
1647 cli
->imaxpct
= getnum(value
, &iopts
, I_MAXPCT
);
1650 cli
->inopblock
= getnum(value
, &iopts
, I_PERBLOCK
);
1653 cli
->inodesize
= getnum(value
, &iopts
, I_SIZE
);
1656 cli
->sb_feat
.attr_version
= getnum(value
, &iopts
, I_ATTR
);
1659 cli
->sb_feat
.projid16bit
= !getnum(value
, &iopts
, I_PROJID32BIT
);
1662 cli
->sb_feat
.spinodes
= getnum(value
, &iopts
, I_SPINODES
);
1672 struct opt_params
*opts
,
1675 struct cli_params
*cli
)
1681 cli
->logagno
= getnum(value
, &lopts
, L_AGNUM
);
1684 cli
->xi
->lisfile
= getnum(value
, &lopts
, L_FILE
);
1687 cli
->loginternal
= getnum(value
, &lopts
, L_INTERNAL
);
1690 cli
->lsu
= getstr(value
, &lopts
, L_SU
);
1693 cli
->lsunit
= getnum(value
, &lopts
, L_SUNIT
);
1697 cli
->xi
->logname
= getstr(value
, &lopts
, L_NAME
);
1698 cli
->loginternal
= 0;
1701 cli
->sb_feat
.log_version
= getnum(value
, &lopts
, L_VERSION
);
1704 cli
->logsize
= getstr(value
, &lopts
, L_SIZE
);
1707 lsectorlog
= getnum(value
, &lopts
, L_SECTLOG
);
1708 cli
->lsectorsize
= 1 << lsectorlog
;
1711 cli
->lsectorsize
= getnum(value
, &lopts
, L_SECTSIZE
);
1714 cli
->sb_feat
.lazy_sb_counters
= getnum(value
, &lopts
, L_LAZYSBCNTR
);
1724 struct opt_params
*opts
,
1727 struct cli_params
*cli
)
1731 cli
->sb_feat
.crcs_enabled
= getnum(value
, &mopts
, M_CRC
);
1732 if (cli
->sb_feat
.crcs_enabled
)
1733 cli
->sb_feat
.dirftype
= true;
1736 cli
->sb_feat
.finobt
= getnum(value
, &mopts
, M_FINOBT
);
1739 if (!value
|| *value
== '\0')
1740 reqval('m', opts
->subopts
, M_UUID
);
1741 if (platform_uuid_parse(value
, &cli
->uuid
))
1742 illegal(value
, "m uuid");
1745 cli
->sb_feat
.rmapbt
= getnum(value
, &mopts
, M_RMAPBT
);
1748 cli
->sb_feat
.reflink
= getnum(value
, &mopts
, M_REFLINK
);
1758 struct opt_params
*opts
,
1761 struct cli_params
*cli
)
1765 cli
->dirblocklog
= getnum(value
, opts
, N_LOG
);
1768 cli
->dirblocksize
= getstr(value
, opts
, N_SIZE
);
1771 value
= getstr(value
, &nopts
, N_VERSION
);
1772 if (!strcasecmp(value
, "ci")) {
1774 cli
->sb_feat
.nci
= true;
1776 cli
->sb_feat
.dir_version
= getnum(value
, opts
, N_VERSION
);
1780 cli
->sb_feat
.dirftype
= getnum(value
, opts
, N_FTYPE
);
1790 struct opt_params
*opts
,
1793 struct cli_params
*cli
)
1797 cli
->rtextsize
= getstr(value
, &ropts
, R_EXTSIZE
);
1800 cli
->xi
->risfile
= getnum(value
, &ropts
, R_FILE
);
1804 cli
->xi
->rtname
= getstr(value
, &ropts
, R_NAME
);
1807 cli
->rtsize
= getstr(value
, &ropts
, R_SIZE
);
1810 cli
->sb_feat
.nortalign
= getnum(value
, &ropts
, R_NOALIGN
);
1820 struct opt_params
*opts
,
1823 struct cli_params
*cli
)
1830 if (cli
->sectorsize
)
1831 conflict('s', opts
->subopts
, S_SECTSIZE
, S_SECTLOG
);
1832 sectorlog
= getnum(value
, &sopts
, S_SECTLOG
);
1833 cli
->sectorsize
= 1 << sectorlog
;
1834 cli
->lsectorsize
= cli
->sectorsize
;
1838 if (cli
->sectorsize
)
1839 conflict('s', opts
->subopts
, S_SECTLOG
, S_SECTSIZE
);
1840 cli
->sectorsize
= getnum(value
, &sopts
, S_SECTSIZE
);
1841 cli
->lsectorsize
= cli
->sectorsize
;
1851 struct opt_params
*opts
;
1854 { 'b', &bopts
, block_opts_parser
},
1855 { 'd', &dopts
, data_opts_parser
},
1856 { 'i', &iopts
, inode_opts_parser
},
1857 { 'l', &lopts
, log_opts_parser
},
1858 { 'm', &mopts
, meta_opts_parser
},
1859 { 'n', &nopts
, naming_opts_parser
},
1860 { 'r', &ropts
, rtdev_opts_parser
},
1861 { 's', &sopts
, sector_opts_parser
},
1862 { '\0', NULL
, NULL
},
1869 struct cli_params
*cli
)
1871 struct subopts
*sop
= &subopt_tab
[0];
1876 if (sop
->opt
== opt
)
1881 /* should never happen */
1886 while (*p
!= '\0') {
1887 char **subopts
= (char **)sop
->opts
->subopts
;
1891 subopt
= getsubopt(&p
, subopts
, &value
);
1893 ret
= (sop
->parser
)(sop
->opts
, subopt
, value
, cli
);
1895 unknown(opt
, value
);
1901 struct mkfs_params
*cfg
,
1906 struct sb_feat_args
*fp
= &cfg
->sb_feat
;
1909 "meta-data=%-22s isize=%-6d agcount=%lld, agsize=%lld blks\n"
1910 " =%-22s sectsz=%-5u attr=%u, projid32bit=%u\n"
1911 " =%-22s crc=%-8u finobt=%u, sparse=%u, rmapbt=%u, reflink=%u\n"
1912 "data =%-22s bsize=%-6u blocks=%llu, imaxpct=%u\n"
1913 " =%-22s sunit=%-6u swidth=%u blks\n"
1914 "naming =version %-14u bsize=%-6u ascii-ci=%d ftype=%d\n"
1915 "log =%-22s bsize=%-6d blocks=%lld, version=%d\n"
1916 " =%-22s sectsz=%-5u sunit=%d blks, lazy-count=%d\n"
1917 "realtime =%-22s extsz=%-6d blocks=%lld, rtextents=%lld\n"),
1918 dfile
, cfg
->inodesize
, (long long)cfg
->agcount
,
1919 (long long)cfg
->agsize
,
1920 "", cfg
->sectorsize
, fp
->attr_version
, !fp
->projid16bit
,
1921 "", fp
->crcs_enabled
, fp
->finobt
, fp
->spinodes
, fp
->rmapbt
,
1923 "", cfg
->blocksize
, (long long)cfg
->dblocks
, cfg
->imaxpct
,
1924 "", cfg
->dsunit
, cfg
->dswidth
,
1925 fp
->dir_version
, cfg
->dirblocksize
, fp
->nci
, fp
->dirftype
,
1926 logfile
, cfg
->blocksize
, (long long)cfg
->logblocks
,
1928 "", cfg
->lsectorsize
, cfg
->lsunit
, fp
->lazy_sb_counters
,
1929 rtfile
, (int)cfg
->rtextblocks
<< cfg
->blocklog
,
1930 (long long)cfg
->rtblocks
, (long long)cfg
->rtextents
);
1941 xfs_agnumber_t agno
;
1943 xfs_alloc_rec_t
*arec
;
1944 struct xfs_btree_block
*block
;
1953 xfs_rfsblock_t dblocks
;
1963 int force_overwrite
;
1978 xfs_agnumber_t logagno
;
1979 xfs_rfsblock_t logblocks
;
1983 xfs_fsblock_t logstart
;
1997 xfs_extlen_t nbmblocks
;
2001 xfs_alloc_rec_t
*nrec
;
2009 xfs_rfsblock_t rtblocks
;
2010 xfs_extlen_t rtextblocks
;
2011 xfs_rtblock_t rtextents
;
2017 uint64_t sector_mask
;
2020 uint64_t tmp_agsize
;
2024 struct fs_topology ft
;
2025 struct sb_feat_args sb_feat
= {
2030 .dir_version
= XFS_DFL_DIR_VERSION
,
2031 .inode_align
= XFS_IFLAG_ALIGN
,
2033 .lazy_sb_counters
= true,
2034 .projid16bit
= false,
2035 .crcs_enabled
= true,
2037 .parent_pointers
= false,
2041 struct cli_params cli
= {
2045 struct mkfs_params cfg
= {};
2047 platform_uuid_generate(&uuid
);
2048 progname
= basename(argv
[0]);
2049 setlocale(LC_ALL
, "");
2050 bindtextdomain(PACKAGE
, LOCALEDIR
);
2051 textdomain(PACKAGE
);
2053 blflag
= bsflag
= slflag
= ssflag
= lslflag
= lssflag
= 0;
2054 blocklog
= blocksize
= 0;
2055 sectorlog
= lsectorlog
= 0;
2056 sectorsize
= lsectorsize
= 0;
2057 agsize
= daflag
= dasize
= dblocks
= 0;
2058 ilflag
= imflag
= ipflag
= isflag
= 0;
2059 liflag
= laflag
= lsflag
= lsuflag
= lsunitflag
= ldflag
= lvflag
= 0;
2061 logagno
= logblocks
= rtblocks
= rtextblocks
= 0;
2062 Nflag
= nlflag
= nsflag
= nvflag
= 0;
2063 dirblocklog
= dirblocksize
= 0;
2065 imaxpct
= inodelog
= inopblock
= isize
= 0;
2066 dfile
= logfile
= rtfile
= NULL
;
2067 dsize
= logsize
= rtsize
= rtextsize
= protofile
= NULL
;
2068 dsu
= dsw
= dsunit
= dswidth
= lalign
= lsu
= lsunit
= 0;
2069 dsflag
= nodsflag
= norsflag
= 0;
2070 force_overwrite
= 0;
2072 memset(&fsx
, 0, sizeof(fsx
));
2074 memset(&xi
, 0, sizeof(xi
));
2075 xi
.isdirect
= LIBXFS_DIRECT
;
2076 xi
.isreadonly
= LIBXFS_EXCLUSIVELY
;
2078 while ((c
= getopt(argc
, argv
, "b:d:i:l:L:m:n:KNp:qr:s:CfV")) != EOF
) {
2082 force_overwrite
= 1;
2085 parse_subopts(c
, optarg
, &cli
);
2087 /* temp don't break code */
2088 blocksize
= cli
.blocksize
;
2089 blocklog
= libxfs_highbit32(blocksize
);
2090 blflag
= cli_opt_set(&bopts
, B_LOG
);
2091 bsflag
= cli_opt_set(&bopts
, B_SIZE
);
2092 /* end temp don't break code */
2095 parse_subopts(c
, optarg
, &cli
);
2097 /* temp don't break code */
2098 agcount
= cli
.agcount
;
2099 if (cli_opt_set(&dopts
, D_AGSIZE
)) {
2100 agsize
= getnum(cli
.agsize
, &dopts
, D_AGSIZE
);
2103 daflag
= cli_opt_set(&dopts
, D_AGCOUNT
);
2105 dsunit
= cli
.dsunit
;
2106 dswidth
= cli
.dswidth
;
2108 if (cli_opt_set(&dopts
, D_SU
)) {
2109 dsu
= getnum(cli
.dsu
, &dopts
, D_SU
);
2112 dsflag
|= cli_opt_set(&dopts
, D_SW
) ||
2113 cli_opt_set(&dopts
, D_SUNIT
) ||
2114 cli_opt_set(&dopts
, D_SWIDTH
);
2115 nodsflag
= cli_opt_set(&dopts
, D_NOALIGN
);
2117 sectorsize
= cli
.sectorsize
;
2118 sectorlog
= libxfs_highbit32(sectorsize
);
2119 slflag
= cli_opt_set(&dopts
, D_SECTLOG
);
2120 ssflag
= cli_opt_set(&dopts
, D_SECTSIZE
);
2122 fsx
.fsx_xflags
|= cli
.fsx
.fsx_xflags
;
2123 fsx
.fsx_projid
= cli
.fsx
.fsx_projid
;
2124 fsx
.fsx_extsize
= cli
.fsx
.fsx_extsize
;
2125 /* end temp don't break code */
2128 parse_subopts(c
, optarg
, &cli
);
2130 /* temp don't break code */
2131 isize
= cli
.inodesize
;
2132 inodelog
= libxfs_highbit32(isize
);
2133 inopblock
= cli
.inopblock
;
2134 ilflag
= cli_opt_set(&iopts
, I_LOG
);
2135 isflag
= cli_opt_set(&iopts
, I_SIZE
);
2136 ipflag
= cli_opt_set(&iopts
, I_PERBLOCK
);
2138 imaxpct
= cli
.imaxpct
;
2139 imflag
= cli_opt_set(&iopts
, I_MAXPCT
);
2140 /* end temp don't break code */
2143 parse_subopts(c
, optarg
, &cli
);
2145 /* temp don't break code */
2146 logagno
= cli
.logagno
;
2147 loginternal
= cli
.loginternal
;
2148 logfile
= xi
.logname
;
2149 logsize
= cli
.logsize
;
2150 lsectorsize
= cli
.lsectorsize
;
2151 lsectorlog
= libxfs_highbit32(lsectorsize
);
2153 lsunit
= cli
.lsunit
;
2154 lsunitflag
= cli_opt_set(&lopts
, L_SUNIT
);
2155 if (cli_opt_set(&lopts
, L_SU
)) {
2156 lsu
= getnum(cli
.lsu
, &lopts
, L_SU
);
2160 laflag
= cli_opt_set(&lopts
, L_AGNUM
);
2161 liflag
= cli_opt_set(&lopts
, L_INTERNAL
);
2162 ldflag
= cli_opt_set(&lopts
, L_NAME
) ||
2163 cli_opt_set(&lopts
, L_DEV
);
2164 lvflag
= cli_opt_set(&lopts
, L_VERSION
);
2165 lslflag
= cli_opt_set(&lopts
, L_SECTLOG
);
2166 lssflag
= cli_opt_set(&lopts
, L_SECTSIZE
);
2167 /* end temp don't break code */
2170 if (strlen(optarg
) > sizeof(sbp
->sb_fname
))
2171 illegal(optarg
, "L");
2175 parse_subopts(c
, optarg
, &cli
);
2177 /* temp don't break code */
2178 platform_uuid_copy(&uuid
, &cli
.uuid
);
2179 /* end temp don't break code */
2182 parse_subopts(c
, optarg
, &cli
);
2184 /* temp don't break code */
2185 if ((nsflag
= cli_opt_set(&nopts
, N_SIZE
)))
2186 dirblocksize
= getnum(cli
.dirblocksize
, &nopts
, N_SIZE
);
2187 dirblocklog
= cli
.dirblocklog
;
2189 nlflag
= cli_opt_set(&nopts
, N_LOG
);
2190 /* end temp don't break code */
2200 respec('p', NULL
, 0);
2207 parse_subopts(c
, optarg
, &cli
);
2209 /* temp don't break code */
2210 rtextsize
= cli
.rtextsize
;
2211 rtsize
= cli
.rtsize
;
2212 norsflag
= cli
.sb_feat
.nortalign
;
2213 /* end temp don't break code */
2216 parse_subopts(c
, optarg
, &cli
);
2218 /* temp don't break code */
2219 sectorsize
= cli
.sectorsize
;
2220 lsectorlog
= libxfs_highbit32(sectorsize
);
2221 lsectorsize
= cli
.lsectorsize
;
2222 lsectorlog
= libxfs_highbit32(lsectorsize
);
2223 lslflag
= slflag
= cli_opt_set(&sopts
, S_LOG
) ||
2224 cli_opt_set(&sopts
, S_SECTLOG
);
2226 lssflag
= ssflag
= cli_opt_set(&sopts
, S_SIZE
) ||
2227 cli_opt_set(&sopts
, S_SECTSIZE
);
2230 printf(_("%s version %s\n"), progname
, VERSION
);
2233 unknown(optopt
, "");
2236 if (argc
- optind
> 1) {
2237 fprintf(stderr
, _("extra arguments\n"));
2239 } else if (argc
- optind
== 1) {
2240 dfile
= xi
.volname
= getstr(argv
[optind
], &dopts
, D_NAME
);
2244 /* temp don't break code */
2245 sb_feat
= cli
.sb_feat
;
2246 /* end temp don't break code */
2249 * Blocksize and sectorsize first, other things depend on them
2250 * For RAID4/5/6 we want to align sector size and block size,
2251 * so we need to start with the device geometry extraction too.
2253 if (!blflag
&& !bsflag
) {
2254 blocklog
= XFS_DFL_BLOCKSIZE_LOG
;
2255 blocksize
= 1 << XFS_DFL_BLOCKSIZE_LOG
;
2257 if (blocksize
< XFS_MIN_BLOCKSIZE
|| blocksize
> XFS_MAX_BLOCKSIZE
) {
2258 fprintf(stderr
, _("illegal block size %d\n"), blocksize
);
2261 if (sb_feat
.crcs_enabled
&& blocksize
< XFS_MIN_CRC_BLOCKSIZE
) {
2263 _("Minimum block size for CRC enabled filesystems is %d bytes.\n"),
2264 XFS_MIN_CRC_BLOCKSIZE
);
2267 if (sb_feat
.crcs_enabled
&& !sb_feat
.dirftype
) {
2268 fprintf(stderr
, _("cannot disable ftype with crcs enabled\n"));
2272 if (!slflag
&& !ssflag
) {
2273 sectorlog
= XFS_MIN_SECTORSIZE_LOG
;
2274 sectorsize
= XFS_MIN_SECTORSIZE
;
2276 if (!lslflag
&& !lssflag
) {
2277 lsectorlog
= sectorlog
;
2278 lsectorsize
= sectorsize
;
2282 * Before anything else, verify that we are correctly operating on
2283 * files or block devices and set the control parameters correctly.
2284 * Explicitly disable direct IO for image files so we don't error out on
2285 * sector size mismatches between the new filesystem and the underlying
2288 check_device_type(dfile
, &xi
.disfile
, !dsize
, !dfile
,
2289 Nflag
? NULL
: &xi
.dcreat
, force_overwrite
, "d");
2291 check_device_type(xi
.logname
, &xi
.lisfile
, !logsize
, !xi
.logname
,
2292 Nflag
? NULL
: &xi
.lcreat
,
2293 force_overwrite
, "l");
2295 check_device_type(xi
.rtname
, &xi
.risfile
, !rtsize
, !xi
.rtname
,
2296 Nflag
? NULL
: &xi
.rcreat
,
2297 force_overwrite
, "r");
2298 if (xi
.disfile
|| xi
.lisfile
|| xi
.risfile
)
2301 memset(&ft
, 0, sizeof(ft
));
2302 get_topology(&xi
, &ft
, force_overwrite
);
2306 * Unless specified manually on the command line use the
2307 * advertised sector size of the device. We use the physical
2308 * sector size unless the requested block size is smaller
2309 * than that, then we can use logical, but warn about the
2313 /* Older kernels may not have physical/logical distinction */
2314 if (!ft
.psectorsize
)
2315 ft
.psectorsize
= ft
.lsectorsize
;
2317 sectorsize
= ft
.psectorsize
? ft
.psectorsize
:
2320 if ((blocksize
< sectorsize
) && (blocksize
>= ft
.lsectorsize
)) {
2322 _("specified blocksize %d is less than device physical sector size %d\n"),
2323 blocksize
, ft
.psectorsize
);
2325 _("switching to logical sector size %d\n"),
2327 sectorsize
= ft
.lsectorsize
? ft
.lsectorsize
:
2333 sectorlog
= libxfs_highbit32(sectorsize
);
2335 lsectorsize
= sectorsize
;
2336 lsectorlog
= sectorlog
;
2340 if (sectorsize
< XFS_MIN_SECTORSIZE
||
2341 sectorsize
> XFS_MAX_SECTORSIZE
|| sectorsize
> blocksize
) {
2343 fprintf(stderr
, _("illegal sector size %d\n"), sectorsize
);
2346 _("block size %d cannot be smaller than logical sector size %d\n"),
2347 blocksize
, ft
.lsectorsize
);
2350 if (sectorsize
< ft
.lsectorsize
) {
2351 fprintf(stderr
, _("illegal sector size %d; hw sector is %d\n"),
2352 sectorsize
, ft
.lsectorsize
);
2355 if (lsectorsize
< XFS_MIN_SECTORSIZE
||
2356 lsectorsize
> XFS_MAX_SECTORSIZE
|| lsectorsize
> blocksize
) {
2357 fprintf(stderr
, _("illegal log sector size %d\n"), lsectorsize
);
2359 } else if (lsectorsize
> XFS_MIN_SECTORSIZE
&& !lsu
&& !lsunit
) {
2361 sb_feat
.log_version
= 2;
2365 * Now we have blocks and sector sizes set up, check parameters that are
2366 * no longer optional for CRC enabled filesystems. Catch them up front
2367 * here before doing anything else.
2369 if (sb_feat
.crcs_enabled
) {
2370 /* minimum inode size is 512 bytes, ipflag checked later */
2371 if ((isflag
|| ilflag
) && inodelog
< XFS_DINODE_DFL_CRC_LOG
) {
2373 _("Minimum inode size for CRCs is %d bytes\n"),
2374 1 << XFS_DINODE_DFL_CRC_LOG
);
2378 /* inodes always aligned */
2379 if (!sb_feat
.inode_align
) {
2381 _("Inodes always aligned for CRC enabled filesytems\n"));
2385 /* lazy sb counters always on */
2386 if (!sb_feat
.lazy_sb_counters
) {
2388 _("Lazy superblock counted always enabled for CRC enabled filesytems\n"));
2392 /* version 2 logs always on */
2393 if (sb_feat
.log_version
!= 2) {
2395 _("V2 logs always enabled for CRC enabled filesytems\n"));
2399 /* attr2 always on */
2400 if (sb_feat
.attr_version
!= 2) {
2402 _("V2 attribute format always enabled on CRC enabled filesytems\n"));
2406 /* 32 bit project quota always on */
2407 /* attr2 always on */
2408 if (sb_feat
.projid16bit
) {
2410 _("32 bit Project IDs always enabled on CRC enabled filesytems\n"));
2415 * The kernel doesn't currently support crc=0,finobt=1
2416 * filesystems. If crcs are not enabled and the user has not
2417 * explicitly turned finobt on, then silently turn it off to
2418 * avoid an unnecessary warning.
2419 * If the user explicitly tried to use crc=0,finobt=1,
2420 * then issue an error.
2421 * The same is also for sparse inodes.
2423 if (sb_feat
.finobt
&& mopts
.subopt_params
[M_FINOBT
].seen
) {
2425 _("finobt not supported without CRC support\n"));
2430 if (sb_feat
.spinodes
) {
2432 _("sparse inodes not supported without CRC support\n"));
2435 sb_feat
.spinodes
= 0;
2437 if (sb_feat
.rmapbt
) {
2439 _("rmapbt not supported without CRC support\n"));
2442 sb_feat
.rmapbt
= false;
2444 if (sb_feat
.reflink
) {
2446 _("reflink not supported without CRC support\n"));
2449 sb_feat
.reflink
= false;
2452 if ((fsx
.fsx_xflags
& FS_XFLAG_COWEXTSIZE
) && !sb_feat
.reflink
) {
2454 _("cowextsize not supported without reflink support\n"));
2458 if (sb_feat
.rmapbt
&& xi
.rtname
) {
2460 _("rmapbt not supported with realtime devices\n"));
2462 sb_feat
.rmapbt
= false;
2465 if (nsflag
|| nlflag
) {
2466 if (dirblocksize
< blocksize
||
2467 dirblocksize
> XFS_MAX_BLOCKSIZE
) {
2468 fprintf(stderr
, _("illegal directory block size %d\n"),
2473 if (blocksize
< (1 << XFS_MIN_REC_DIRSIZE
))
2474 dirblocklog
= XFS_MIN_REC_DIRSIZE
;
2476 dirblocklog
= blocklog
;
2477 dirblocksize
= 1 << dirblocklog
;
2484 dbytes
= getnum(dsize
, &dopts
, D_SIZE
);
2485 if (dbytes
% XFS_MIN_BLOCKSIZE
) {
2487 _("illegal data length %lld, not a multiple of %d\n"),
2488 (long long)dbytes
, XFS_MIN_BLOCKSIZE
);
2491 dblocks
= (xfs_rfsblock_t
)(dbytes
>> blocklog
);
2492 if (dbytes
% blocksize
)
2493 fprintf(stderr
, _("warning: "
2494 "data length %lld not a multiple of %d, truncated to %lld\n"),
2495 (long long)dbytes
, blocksize
,
2496 (long long)(dblocks
<< blocklog
));
2499 inodelog
= blocklog
- libxfs_highbit32(inopblock
);
2500 isize
= 1 << inodelog
;
2501 } else if (!ilflag
&& !isflag
) {
2502 inodelog
= sb_feat
.crcs_enabled
? XFS_DINODE_DFL_CRC_LOG
2503 : XFS_DINODE_DFL_LOG
;
2504 isize
= 1 << inodelog
;
2506 if (sb_feat
.crcs_enabled
&& inodelog
< XFS_DINODE_DFL_CRC_LOG
) {
2508 _("Minimum inode size for CRCs is %d bytes\n"),
2509 1 << XFS_DINODE_DFL_CRC_LOG
);
2516 logbytes
= getnum(logsize
, &lopts
, L_SIZE
);
2517 if (logbytes
% XFS_MIN_BLOCKSIZE
) {
2519 _("illegal log length %lld, not a multiple of %d\n"),
2520 (long long)logbytes
, XFS_MIN_BLOCKSIZE
);
2523 logblocks
= (xfs_rfsblock_t
)(logbytes
>> blocklog
);
2524 if (logbytes
% blocksize
)
2526 _("warning: log length %lld not a multiple of %d, truncated to %lld\n"),
2527 (long long)logbytes
, blocksize
,
2528 (long long)(logblocks
<< blocklog
));
2533 rtbytes
= getnum(rtsize
, &ropts
, R_SIZE
);
2534 if (rtbytes
% XFS_MIN_BLOCKSIZE
) {
2536 _("illegal rt length %lld, not a multiple of %d\n"),
2537 (long long)rtbytes
, XFS_MIN_BLOCKSIZE
);
2540 rtblocks
= (xfs_rfsblock_t
)(rtbytes
>> blocklog
);
2541 if (rtbytes
% blocksize
)
2543 _("warning: rt length %lld not a multiple of %d, truncated to %lld\n"),
2544 (long long)rtbytes
, blocksize
,
2545 (long long)(rtblocks
<< blocklog
));
2548 * If specified, check rt extent size against its constraints.
2551 uint64_t rtextbytes
;
2553 rtextbytes
= getnum(rtextsize
, &ropts
, R_EXTSIZE
);
2554 if (rtextbytes
% blocksize
) {
2556 _("illegal rt extent size %lld, not a multiple of %d\n"),
2557 (long long)rtextbytes
, blocksize
);
2560 rtextblocks
= (xfs_extlen_t
)(rtextbytes
>> blocklog
);
2563 * If realtime extsize has not been specified by the user,
2564 * and the underlying volume is striped, then set rtextblocks
2565 * to the stripe width.
2568 uint64_t rtextbytes
;
2570 if (!norsflag
&& !xi
.risfile
&& !(!rtsize
&& xi
.disfile
))
2571 rswidth
= ft
.rtswidth
;
2575 /* check that rswidth is a multiple of fs blocksize */
2576 if (!norsflag
&& rswidth
&& !(BBTOB(rswidth
) % blocksize
)) {
2577 rswidth
= DTOBT(rswidth
);
2578 rtextbytes
= rswidth
<< blocklog
;
2579 if (XFS_MIN_RTEXTSIZE
<= rtextbytes
&&
2580 (rtextbytes
<= XFS_MAX_RTEXTSIZE
)) {
2581 rtextblocks
= rswidth
;
2585 rtextblocks
= (blocksize
< XFS_MIN_RTEXTSIZE
) ?
2586 XFS_MIN_RTEXTSIZE
>> blocklog
: 1;
2589 ASSERT(rtextblocks
);
2592 * Check some argument sizes against mins, maxes.
2594 if (isize
> blocksize
/ XFS_MIN_INODE_PERBLOCK
||
2595 isize
< XFS_DINODE_MIN_SIZE
||
2596 isize
> XFS_DINODE_MAX_SIZE
) {
2599 fprintf(stderr
, _("illegal inode size %d\n"), isize
);
2600 maxsz
= MIN(blocksize
/ XFS_MIN_INODE_PERBLOCK
,
2601 XFS_DINODE_MAX_SIZE
);
2602 if (XFS_DINODE_MIN_SIZE
== maxsz
)
2604 _("allowable inode size with %d byte blocks is %d\n"),
2605 blocksize
, XFS_DINODE_MIN_SIZE
);
2608 _("allowable inode size with %d byte blocks is between %d and %d\n"),
2609 blocksize
, XFS_DINODE_MIN_SIZE
, maxsz
);
2613 /* if lsu or lsunit was specified, automatically use v2 logs */
2614 if ((lsu
|| lsunit
) && sb_feat
.log_version
== 1) {
2616 _("log stripe unit specified, using v2 logs\n"));
2617 sb_feat
.log_version
= 2;
2620 calc_stripe_factors(dsu
, dsw
, sectorsize
, lsu
, lsectorsize
,
2621 &dsunit
, &dswidth
, &lsunit
);
2623 /* If sunit & swidth were manually specified as 0, same as noalign */
2624 if (dsflag
&& !dsunit
&& !dswidth
)
2627 xi
.setblksize
= sectorsize
;
2630 * Initialize. This will open the log and rt devices as well.
2632 if (!libxfs_init(&xi
))
2635 fprintf(stderr
, _("no device name given in argument list\n"));
2640 * Ok, Linux only has a 1024-byte resolution on device _size_,
2641 * and the sizes below are in basic 512-byte blocks,
2642 * so if we have (size % 2), on any partition, we can't get
2643 * to the last 512 bytes. The same issue exists for larger
2644 * sector sizes - we cannot write past the last sector.
2646 * So, we reduce the size (in basic blocks) to a perfect
2647 * multiple of the sector size, or 1024, whichever is larger.
2650 sector_mask
= (uint64_t)-1 << (MAX(sectorlog
, 10) - BBSHIFT
);
2651 xi
.dsize
&= sector_mask
;
2652 xi
.rtsize
&= sector_mask
;
2653 xi
.logBBsize
&= (uint64_t)-1 << (MAX(lsectorlog
, 10) - BBSHIFT
);
2656 /* don't do discards on print-only runs or on files */
2657 if (discard
&& !Nflag
) {
2659 discard_blocks(xi
.ddev
, xi
.dsize
);
2660 if (xi
.rtdev
&& !xi
.risfile
)
2661 discard_blocks(xi
.rtdev
, xi
.rtsize
);
2662 if (xi
.logdev
&& xi
.logdev
!= xi
.ddev
&& !xi
.lisfile
)
2663 discard_blocks(xi
.logdev
, xi
.logBBsize
);
2666 if (!liflag
&& !ldflag
)
2667 loginternal
= xi
.logdev
== 0;
2669 logfile
= xi
.logname
;
2670 else if (loginternal
)
2671 logfile
= _("internal log");
2672 else if (xi
.volname
&& xi
.logdev
)
2673 logfile
= _("volume log");
2675 fprintf(stderr
, _("no log subvolume or internal log\n"));
2681 if (xi
.volname
&& xi
.rtdev
)
2682 rtfile
= _("volume rt");
2685 if (dsize
&& xi
.dsize
> 0 && dblocks
> DTOBT(xi
.dsize
)) {
2687 _("size %s specified for data subvolume is too large, "
2688 "maximum is %lld blocks\n"),
2689 dsize
, (long long)DTOBT(xi
.dsize
));
2691 } else if (!dsize
&& xi
.dsize
> 0)
2692 dblocks
= DTOBT(xi
.dsize
);
2694 fprintf(stderr
, _("can't get size of data subvolume\n"));
2697 if (dblocks
< XFS_MIN_DATA_BLOCKS
) {
2699 _("size %lld of data subvolume is too small, minimum %d blocks\n"),
2700 (long long)dblocks
, XFS_MIN_DATA_BLOCKS
);
2704 if (loginternal
&& xi
.logdev
) {
2706 _("can't have both external and internal logs\n"));
2708 } else if (loginternal
&& sectorsize
!= lsectorsize
) {
2710 _("data and log sector sizes must be equal for internal logs\n"));
2714 if (xi
.dbsize
> sectorsize
) {
2716 "Warning: the data subvolume sector size %u is less than the sector size \n\
2717 reported by the device (%u).\n"),
2718 sectorsize
, xi
.dbsize
);
2720 if (!loginternal
&& xi
.lbsize
> lsectorsize
) {
2722 "Warning: the log subvolume sector size %u is less than the sector size\n\
2723 reported by the device (%u).\n"),
2724 lsectorsize
, xi
.lbsize
);
2726 if (rtsize
&& xi
.rtsize
> 0 && xi
.rtbsize
> sectorsize
) {
2728 "Warning: the realtime subvolume sector size %u is less than the sector size\n\
2729 reported by the device (%u).\n"),
2730 sectorsize
, xi
.rtbsize
);
2733 if (rtsize
&& xi
.rtsize
> 0 && rtblocks
> DTOBT(xi
.rtsize
)) {
2735 _("size %s specified for rt subvolume is too large, "
2736 "maximum is %lld blocks\n"),
2737 rtsize
, (long long)DTOBT(xi
.rtsize
));
2739 } else if (!rtsize
&& xi
.rtsize
> 0)
2740 rtblocks
= DTOBT(xi
.rtsize
);
2741 else if (rtsize
&& !xi
.rtdev
) {
2743 _("size specified for non-existent rt subvolume\n"));
2747 rtextents
= rtblocks
/ rtextblocks
;
2748 nbmblocks
= (xfs_extlen_t
)howmany(rtextents
, NBBY
* blocksize
);
2750 rtextents
= rtblocks
= 0;
2756 if (ft
.dsunit
&& ft
.dsunit
!= dsunit
) {
2758 _("%s: Specified data stripe unit %d "
2759 "is not the same as the volume stripe "
2761 progname
, dsunit
, ft
.dsunit
);
2763 if (ft
.dswidth
&& ft
.dswidth
!= dswidth
) {
2765 _("%s: Specified data stripe width %d "
2766 "is not the same as the volume stripe "
2768 progname
, dswidth
, ft
.dswidth
);
2772 dswidth
= ft
.dswidth
;
2775 } /* else dsunit & dswidth can't be set if nodsflag is set */
2777 if (dasize
) { /* User-specified AG size */
2779 * Check specified agsize is a multiple of blocksize.
2781 if (agsize
% blocksize
) {
2783 _("agsize (%lld) not a multiple of fs blk size (%d)\n"),
2784 (long long)agsize
, blocksize
);
2787 agsize
/= blocksize
;
2788 agcount
= dblocks
/ agsize
+ (dblocks
% agsize
!= 0);
2790 } else if (daflag
) { /* User-specified AG count */
2791 agsize
= dblocks
/ agcount
+ (dblocks
% agcount
!= 0);
2793 calc_default_ag_geometry(blocklog
, dblocks
,
2794 dsunit
| dswidth
, &agsize
, &agcount
);
2798 * If dsunit is a multiple of fs blocksize, then check that is a
2799 * multiple of the agsize too
2801 if (dsunit
&& !(BBTOB(dsunit
) % blocksize
) &&
2802 dswidth
&& !(BBTOB(dswidth
) % blocksize
)) {
2804 /* convert from 512 byte blocks to fs blocksize */
2805 dsunit
= DTOBT(dsunit
);
2806 dswidth
= DTOBT(dswidth
);
2809 * agsize is not a multiple of dsunit
2811 if ((agsize
% dsunit
) != 0) {
2813 * Round up to stripe unit boundary. Also make sure
2814 * that agsize is still larger than
2815 * XFS_AG_MIN_BLOCKS(blocklog)
2817 tmp_agsize
= ((agsize
+ (dsunit
- 1))/ dsunit
) * dsunit
;
2819 * Round down to stripe unit boundary if rounding up
2820 * created an AG size that is larger than the AG max.
2822 if (tmp_agsize
> XFS_AG_MAX_BLOCKS(blocklog
))
2823 tmp_agsize
= ((agsize
) / dsunit
) * dsunit
;
2825 if ((tmp_agsize
>= XFS_AG_MIN_BLOCKS(blocklog
)) &&
2826 (tmp_agsize
<= XFS_AG_MAX_BLOCKS(blocklog
))) {
2827 agsize
= tmp_agsize
;
2829 agcount
= dblocks
/agsize
+
2830 (dblocks
% agsize
!= 0);
2833 _("agsize rounded to %lld, swidth = %d\n"),
2834 (long long)agsize
, dswidth
);
2837 dsunit
= dswidth
= 0;
2840 * agsize is out of bounds, this will
2841 * print nice details & exit.
2843 validate_ag_geometry(blocklog
, dblocks
,
2849 if (dswidth
&& ((agsize
% dswidth
) == 0)
2850 && (dswidth
!= dsunit
)
2852 /* This is a non-optimal configuration because all AGs
2853 * start on the same disk in the stripe. Changing
2854 * the AG size by one sunit will guarantee that this
2857 tmp_agsize
= agsize
- dsunit
;
2858 if (tmp_agsize
< XFS_AG_MIN_BLOCKS(blocklog
)) {
2859 tmp_agsize
= agsize
+ dsunit
;
2860 if (dblocks
< agsize
) {
2861 /* oh well, nothing to do */
2862 tmp_agsize
= agsize
;
2865 if (daflag
|| dasize
) {
2867 "Warning: AG size is a multiple of stripe width. This can cause performance\n\
2868 problems by aligning all AGs on the same disk. To avoid this, run mkfs with\n\
2869 an AG size that is one stripe unit smaller, for example %llu.\n"),
2870 (unsigned long long)tmp_agsize
);
2872 agsize
= tmp_agsize
;
2873 agcount
= dblocks
/agsize
+ (dblocks
% agsize
!= 0);
2875 * If the last AG is too small, reduce the
2876 * filesystem size and drop the blocks.
2878 if ( dblocks
% agsize
!= 0 &&
2880 XFS_AG_MIN_BLOCKS(blocklog
))) {
2881 dblocks
= (xfs_rfsblock_t
)((agcount
- 1) * agsize
);
2883 ASSERT(agcount
!= 0);
2889 dsunit
= dswidth
= 0;
2892 _("%s: Stripe unit(%d) or stripe width(%d) is "
2893 "not a multiple of the block size(%d)\n"),
2894 progname
, BBTOB(dsunit
), BBTOB(dswidth
),
2901 * If the last AG is too small, reduce the filesystem size
2902 * and drop the blocks.
2904 if ( dblocks
% agsize
!= 0 &&
2905 (dblocks
% agsize
< XFS_AG_MIN_BLOCKS(blocklog
))) {
2907 dblocks
= (xfs_rfsblock_t
)((agcount
- 1) * agsize
);
2909 ASSERT(agcount
!= 0);
2912 validate_ag_geometry(blocklog
, dblocks
, agsize
, agcount
);
2915 imaxpct
= calc_default_imaxpct(blocklog
, dblocks
);
2918 * check that log sunit is modulo fsblksize or default it to dsunit.
2922 /* convert from 512 byte blocks to fs blocks */
2923 lsunit
= DTOBT(lsunit
);
2924 } else if (sb_feat
.log_version
== 2 && loginternal
&& dsunit
) {
2925 /* lsunit and dsunit now in fs blocks */
2929 if (sb_feat
.log_version
== 2 && (lsunit
* blocksize
) > 256 * 1024) {
2930 /* Warn only if specified on commandline */
2931 if (lsuflag
|| lsunitflag
) {
2933 _("log stripe unit (%d bytes) is too large (maximum is 256KiB)\n"),
2934 (lsunit
* blocksize
));
2936 _("log stripe unit adjusted to 32KiB\n"));
2938 lsunit
= (32 * 1024) >> blocklog
;
2941 min_logblocks
= max_trans_res(agsize
,
2942 sb_feat
.crcs_enabled
, sb_feat
.dir_version
,
2943 sectorlog
, blocklog
, inodelog
, dirblocklog
,
2944 sb_feat
.log_version
, lsunit
, sb_feat
.finobt
,
2945 sb_feat
.rmapbt
, sb_feat
.reflink
,
2946 sb_feat
.inode_align
);
2947 ASSERT(min_logblocks
);
2948 min_logblocks
= MAX(XFS_MIN_LOG_BLOCKS
, min_logblocks
);
2949 if (!logsize
&& dblocks
>= (1024*1024*1024) >> blocklog
)
2950 min_logblocks
= MAX(min_logblocks
, XFS_MIN_LOG_BYTES
>>blocklog
);
2951 if (logsize
&& xi
.logBBsize
> 0 && logblocks
> DTOBT(xi
.logBBsize
)) {
2953 _("size %s specified for log subvolume is too large, maximum is %lld blocks\n"),
2954 logsize
, (long long)DTOBT(xi
.logBBsize
));
2956 } else if (!logsize
&& xi
.logBBsize
> 0) {
2957 logblocks
= DTOBT(xi
.logBBsize
);
2958 } else if (logsize
&& !xi
.logdev
&& !loginternal
) {
2960 _("size specified for non-existent log subvolume\n"));
2962 } else if (loginternal
&& logsize
&& logblocks
>= dblocks
) {
2963 fprintf(stderr
, _("size %lld too large for internal log\n"),
2964 (long long)logblocks
);
2966 } else if (!loginternal
&& !xi
.logdev
) {
2968 } else if (loginternal
&& !logsize
) {
2970 if (dblocks
< GIGABYTES(1, blocklog
)) {
2971 /* tiny filesystems get minimum sized logs. */
2972 logblocks
= min_logblocks
;
2973 } else if (dblocks
< GIGABYTES(16, blocklog
)) {
2976 * For small filesystems, we want to use the
2977 * XFS_MIN_LOG_BYTES for filesystems smaller than 16G if
2978 * at all possible, ramping up to 128MB at 256GB.
2980 logblocks
= MIN(XFS_MIN_LOG_BYTES
>> blocklog
,
2981 min_logblocks
* XFS_DFL_LOG_FACTOR
);
2984 * With a 2GB max log size, default to maximum size
2985 * at 4TB. This keeps the same ratio from the older
2986 * max log size of 128M at 256GB fs size. IOWs,
2987 * the ratio of fs size to log size is 2048:1.
2989 logblocks
= (dblocks
<< blocklog
) / 2048;
2990 logblocks
= logblocks
>> blocklog
;
2993 /* Ensure the chosen size meets minimum log size requirements */
2994 logblocks
= MAX(min_logblocks
, logblocks
);
2996 /* make sure the log fits wholly within an AG */
2997 if (logblocks
>= agsize
)
2998 logblocks
= min_logblocks
;
3000 /* and now clamp the size to the maximum supported size */
3001 logblocks
= MIN(logblocks
, XFS_MAX_LOG_BLOCKS
);
3002 if ((logblocks
<< blocklog
) > XFS_MAX_LOG_BYTES
)
3003 logblocks
= XFS_MAX_LOG_BYTES
>> blocklog
;
3006 validate_log_size(logblocks
, blocklog
, min_logblocks
);
3008 protostring
= setup_proto(protofile
);
3009 bsize
= 1 << (blocklog
- BBSHIFT
);
3012 memset(mp
, 0, sizeof(xfs_mount_t
));
3013 sbp
->sb_blocklog
= (uint8_t)blocklog
;
3014 sbp
->sb_sectlog
= (uint8_t)sectorlog
;
3015 sbp
->sb_agblklog
= (uint8_t)log2_roundup((unsigned int)agsize
);
3016 sbp
->sb_agblocks
= (xfs_agblock_t
)agsize
;
3017 mp
->m_blkbb_log
= sbp
->sb_blocklog
- BBSHIFT
;
3018 mp
->m_sectbb_log
= sbp
->sb_sectlog
- BBSHIFT
;
3021 * sb_versionnum, finobt and rmapbt flags must be set before we use
3022 * libxfs_prealloc_blocks().
3024 sb_set_features(&mp
->m_sb
, &sb_feat
, sectorsize
, lsectorsize
, dsunit
);
3029 * Readjust the log size to fit within an AG if it was sized
3033 logblocks
= MIN(logblocks
,
3034 libxfs_alloc_ag_max_usable(mp
));
3036 /* revalidate the log size is valid if we changed it */
3037 validate_log_size(logblocks
, blocklog
, min_logblocks
);
3039 if (logblocks
> agsize
- libxfs_prealloc_blocks(mp
)) {
3041 _("internal log size %lld too large, must fit in allocation group\n"),
3042 (long long)logblocks
);
3047 if (logagno
>= agcount
) {
3049 _("log ag number %d too large, must be less than %lld\n"),
3050 logagno
, (long long)agcount
);
3054 logagno
= (xfs_agnumber_t
)(agcount
/ 2);
3056 logstart
= XFS_AGB_TO_FSB(mp
, logagno
, libxfs_prealloc_blocks(mp
));
3058 * Align the logstart at stripe unit boundary.
3061 logstart
= fixup_internal_log_stripe(mp
,
3062 lsflag
, logstart
, agsize
, lsunit
,
3063 &logblocks
, blocklog
, &lalign
);
3064 } else if (dsunit
) {
3065 logstart
= fixup_internal_log_stripe(mp
,
3066 lsflag
, logstart
, agsize
, dsunit
,
3067 &logblocks
, blocklog
, &lalign
);
3072 fixup_log_stripe_unit(lsflag
, lsunit
,
3073 &logblocks
, blocklog
);
3075 validate_log_size(logblocks
, blocklog
, min_logblocks
);
3077 /* Temp support code to set up mkfs cfg parameters */
3078 cfg
.blocksize
= blocksize
;
3079 cfg
.blocklog
= blocklog
;
3080 cfg
.sectorsize
= sectorsize
;
3081 cfg
.sectorlog
= sectorlog
;
3082 cfg
.lsectorsize
= lsectorsize
;
3083 cfg
.lsectorlog
= lsectorlog
;
3084 cfg
.dirblocksize
= dirblocksize
;
3085 cfg
.dirblocklog
= dirblocklog
;
3086 cfg
.inodesize
= isize
;
3087 cfg
.inodelog
= inodelog
;
3088 cfg
.inopblock
= inopblock
;
3090 cfg
.dblocks
= dblocks
;
3091 cfg
.logblocks
= logblocks
;
3092 cfg
.rtblocks
= rtblocks
;
3093 cfg
.rtextblocks
= rtextblocks
;
3094 cfg
.rtextents
= rtextents
;
3095 cfg
.rtbmblocks
= nbmblocks
;
3096 cfg
.dsunit
= dsunit
;
3097 cfg
.dswidth
= dswidth
;
3098 cfg
.lsunit
= lsunit
;
3099 cfg
.agsize
= agsize
;
3100 cfg
.agcount
= agcount
;
3101 cfg
.imaxpct
= imaxpct
;
3102 cfg
.loginternal
= loginternal
;
3103 cfg
.logstart
= logstart
;
3104 cfg
.logagno
= logagno
;
3106 platform_uuid_copy(&cfg
.uuid
, &uuid
);
3107 memcpy(&cfg
.sb_feat
, &sb_feat
, sizeof(sb_feat
));
3108 /* end temp support code */
3110 if (!qflag
|| Nflag
) {
3111 print_mkfs_cfg(&cfg
, dfile
, logfile
, rtfile
);
3117 strncpy(sbp
->sb_fname
, label
, sizeof(sbp
->sb_fname
));
3118 sbp
->sb_magicnum
= XFS_SB_MAGIC
;
3119 sbp
->sb_blocksize
= blocksize
;
3120 sbp
->sb_dblocks
= dblocks
;
3121 sbp
->sb_rblocks
= rtblocks
;
3122 sbp
->sb_rextents
= rtextents
;
3123 platform_uuid_copy(&sbp
->sb_uuid
, &uuid
);
3124 /* Only in memory; libxfs expects this as if read from disk */
3125 platform_uuid_copy(&sbp
->sb_meta_uuid
, &uuid
);
3126 sbp
->sb_logstart
= logstart
;
3127 sbp
->sb_rootino
= sbp
->sb_rbmino
= sbp
->sb_rsumino
= NULLFSINO
;
3128 sbp
->sb_rextsize
= rtextblocks
;
3129 sbp
->sb_agcount
= (xfs_agnumber_t
)agcount
;
3130 sbp
->sb_rbmblocks
= nbmblocks
;
3131 sbp
->sb_logblocks
= (xfs_extlen_t
)logblocks
;
3132 sbp
->sb_sectsize
= (uint16_t)sectorsize
;
3133 sbp
->sb_inodesize
= (uint16_t)isize
;
3134 sbp
->sb_inopblock
= (uint16_t)(blocksize
/ isize
);
3135 sbp
->sb_sectlog
= (uint8_t)sectorlog
;
3136 sbp
->sb_inodelog
= (uint8_t)inodelog
;
3137 sbp
->sb_inopblog
= (uint8_t)(blocklog
- inodelog
);
3139 (uint8_t)(rtextents
?
3140 libxfs_highbit32((unsigned int)rtextents
) : 0);
3141 sbp
->sb_inprogress
= 1; /* mkfs is in progress */
3142 sbp
->sb_imax_pct
= imaxpct
;
3145 sbp
->sb_fdblocks
= dblocks
- agcount
* libxfs_prealloc_blocks(mp
) -
3146 (loginternal
? logblocks
: 0);
3147 sbp
->sb_frextents
= 0; /* will do a free later */
3148 sbp
->sb_uquotino
= sbp
->sb_gquotino
= sbp
->sb_pquotino
= 0;
3150 sbp
->sb_unit
= dsunit
;
3151 sbp
->sb_width
= dswidth
;
3152 sbp
->sb_dirblklog
= dirblocklog
- blocklog
;
3153 if (sb_feat
.log_version
== 2) { /* This is stored in bytes */
3154 lsunit
= (lsunit
== 0) ? 1 : XFS_FSB_TO_B(mp
, lsunit
);
3155 sbp
->sb_logsunit
= lsunit
;
3157 sbp
->sb_logsunit
= 0;
3158 if (sb_feat
.inode_align
) {
3159 int cluster_size
= XFS_INODE_BIG_CLUSTER_SIZE
;
3160 if (sb_feat
.crcs_enabled
)
3161 cluster_size
*= isize
/ XFS_DINODE_MIN_SIZE
;
3162 sbp
->sb_inoalignmt
= cluster_size
>> blocklog
;
3163 sb_feat
.inode_align
= sbp
->sb_inoalignmt
!= 0;
3165 sbp
->sb_inoalignmt
= 0;
3166 if (lsectorsize
!= BBSIZE
|| sectorsize
!= BBSIZE
) {
3167 sbp
->sb_logsectlog
= (uint8_t)lsectorlog
;
3168 sbp
->sb_logsectsize
= (uint16_t)lsectorsize
;
3170 sbp
->sb_logsectlog
= 0;
3171 sbp
->sb_logsectsize
= 0;
3174 sb_set_features(&mp
->m_sb
, &sb_feat
, sectorsize
, lsectorsize
, dsunit
);
3176 if (force_overwrite
)
3177 zero_old_xfs_structures(&xi
, sbp
);
3180 * Zero out the beginning of the device, to obliterate any old
3181 * filesystem signatures out there. This should take care of
3182 * swap (somewhere around the page size), jfs (32k),
3183 * ext[2,3] and reiserfs (64k) - and hopefully all else.
3185 libxfs_buftarg_init(mp
, xi
.ddev
, xi
.logdev
, xi
.rtdev
);
3186 buf
= libxfs_getbuf(mp
->m_ddev_targp
, 0, BTOBB(WHACK_SIZE
));
3187 memset(XFS_BUF_PTR(buf
), 0, WHACK_SIZE
);
3188 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3189 libxfs_purgebuf(buf
);
3191 /* OK, now write the superblock */
3192 buf
= libxfs_getbuf(mp
->m_ddev_targp
, XFS_SB_DADDR
, XFS_FSS_TO_BB(mp
, 1));
3193 buf
->b_ops
= &xfs_sb_buf_ops
;
3194 memset(XFS_BUF_PTR(buf
), 0, sectorsize
);
3195 libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf
), sbp
);
3196 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3197 libxfs_purgebuf(buf
);
3200 * If the data area is a file, then grow it out to its final size
3201 * if needed so that the reads for the end of the device in the mount
3202 * code will succeed.
3204 if (xi
.disfile
&& xi
.dsize
* xi
.dbsize
< dblocks
* blocksize
) {
3205 if (ftruncate(xi
.dfd
, dblocks
* blocksize
) < 0) {
3207 _("%s: Growing the data section failed\n"),
3214 * Zero out the end of the device, to obliterate any
3215 * old MD RAID (or other) metadata at the end of the device.
3216 * (MD sb is ~64k from the end, take out a wider swath to be sure)
3219 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3220 (xi
.dsize
- BTOBB(WHACK_SIZE
)),
3222 memset(XFS_BUF_PTR(buf
), 0, WHACK_SIZE
);
3223 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3224 libxfs_purgebuf(buf
);
3230 libxfs_log_clear(mp
->m_logdev_targp
, NULL
,
3231 XFS_FSB_TO_DADDR(mp
, logstart
),
3232 (xfs_extlen_t
)XFS_FSB_TO_BB(mp
, logblocks
),
3233 &sbp
->sb_uuid
, sb_feat
.log_version
, lsunit
, XLOG_FMT
, XLOG_INIT_CYCLE
, false);
3235 mp
= libxfs_mount(mp
, sbp
, xi
.ddev
, xi
.logdev
, xi
.rtdev
, 0);
3237 fprintf(stderr
, _("%s: filesystem failed to initialize\n"),
3243 * XXX: this code is effectively shared with the kernel growfs code.
3244 * These initialisations should be pulled into libxfs to keep the
3245 * kernel/userspace header initialisation code the same.
3247 for (agno
= 0; agno
< agcount
; agno
++) {
3248 struct xfs_agfl
*agfl
;
3250 struct xfs_perag
*pag
= libxfs_perag_get(mp
, agno
);
3255 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3256 XFS_AG_DADDR(mp
, agno
, XFS_SB_DADDR
),
3257 XFS_FSS_TO_BB(mp
, 1));
3258 buf
->b_ops
= &xfs_sb_buf_ops
;
3259 memset(XFS_BUF_PTR(buf
), 0, sectorsize
);
3260 libxfs_sb_to_disk((void *)XFS_BUF_PTR(buf
), sbp
);
3261 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3264 * AG header block: freespace
3266 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3267 XFS_AG_DADDR(mp
, agno
, XFS_AGF_DADDR(mp
)),
3268 XFS_FSS_TO_BB(mp
, 1));
3269 buf
->b_ops
= &xfs_agf_buf_ops
;
3270 agf
= XFS_BUF_TO_AGF(buf
);
3271 memset(agf
, 0, sectorsize
);
3272 if (agno
== agcount
- 1)
3273 agsize
= dblocks
- (xfs_rfsblock_t
)(agno
* agsize
);
3274 agf
->agf_magicnum
= cpu_to_be32(XFS_AGF_MAGIC
);
3275 agf
->agf_versionnum
= cpu_to_be32(XFS_AGF_VERSION
);
3276 agf
->agf_seqno
= cpu_to_be32(agno
);
3277 agf
->agf_length
= cpu_to_be32(agsize
);
3278 agf
->agf_roots
[XFS_BTNUM_BNOi
] = cpu_to_be32(XFS_BNO_BLOCK(mp
));
3279 agf
->agf_roots
[XFS_BTNUM_CNTi
] = cpu_to_be32(XFS_CNT_BLOCK(mp
));
3280 agf
->agf_levels
[XFS_BTNUM_BNOi
] = cpu_to_be32(1);
3281 agf
->agf_levels
[XFS_BTNUM_CNTi
] = cpu_to_be32(1);
3282 pag
->pagf_levels
[XFS_BTNUM_BNOi
] = 1;
3283 pag
->pagf_levels
[XFS_BTNUM_CNTi
] = 1;
3284 if (xfs_sb_version_hasrmapbt(&mp
->m_sb
)) {
3285 agf
->agf_roots
[XFS_BTNUM_RMAPi
] =
3286 cpu_to_be32(XFS_RMAP_BLOCK(mp
));
3287 agf
->agf_levels
[XFS_BTNUM_RMAPi
] = cpu_to_be32(1);
3288 agf
->agf_rmap_blocks
= cpu_to_be32(1);
3290 if (xfs_sb_version_hasreflink(&mp
->m_sb
)) {
3291 agf
->agf_refcount_root
= cpu_to_be32(
3292 libxfs_refc_block(mp
));
3293 agf
->agf_refcount_level
= cpu_to_be32(1);
3294 agf
->agf_refcount_blocks
= cpu_to_be32(1);
3296 agf
->agf_flfirst
= 0;
3297 agf
->agf_fllast
= cpu_to_be32(XFS_AGFL_SIZE(mp
) - 1);
3298 agf
->agf_flcount
= 0;
3299 nbmblocks
= (xfs_extlen_t
)(agsize
- libxfs_prealloc_blocks(mp
));
3300 agf
->agf_freeblks
= cpu_to_be32(nbmblocks
);
3301 agf
->agf_longest
= cpu_to_be32(nbmblocks
);
3302 if (xfs_sb_version_hascrc(&mp
->m_sb
))
3303 platform_uuid_copy(&agf
->agf_uuid
, &mp
->m_sb
.sb_uuid
);
3305 if (loginternal
&& agno
== logagno
) {
3306 be32_add_cpu(&agf
->agf_freeblks
, -logblocks
);
3307 agf
->agf_longest
= cpu_to_be32(agsize
-
3308 XFS_FSB_TO_AGBNO(mp
, logstart
) - logblocks
);
3310 if (libxfs_alloc_min_freelist(mp
, pag
) > worst_freelist
)
3311 worst_freelist
= libxfs_alloc_min_freelist(mp
, pag
);
3312 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3315 * AG freelist header block
3317 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3318 XFS_AG_DADDR(mp
, agno
, XFS_AGFL_DADDR(mp
)),
3319 XFS_FSS_TO_BB(mp
, 1));
3320 buf
->b_ops
= &xfs_agfl_buf_ops
;
3321 agfl
= XFS_BUF_TO_AGFL(buf
);
3322 /* setting to 0xff results in initialisation to NULLAGBLOCK */
3323 memset(agfl
, 0xff, sectorsize
);
3324 if (xfs_sb_version_hascrc(&mp
->m_sb
)) {
3325 agfl
->agfl_magicnum
= cpu_to_be32(XFS_AGFL_MAGIC
);
3326 agfl
->agfl_seqno
= cpu_to_be32(agno
);
3327 platform_uuid_copy(&agfl
->agfl_uuid
, &mp
->m_sb
.sb_uuid
);
3328 for (bucket
= 0; bucket
< XFS_AGFL_SIZE(mp
); bucket
++)
3329 agfl
->agfl_bno
[bucket
] = cpu_to_be32(NULLAGBLOCK
);
3332 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3335 * AG header block: inodes
3337 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3338 XFS_AG_DADDR(mp
, agno
, XFS_AGI_DADDR(mp
)),
3339 XFS_FSS_TO_BB(mp
, 1));
3340 agi
= XFS_BUF_TO_AGI(buf
);
3341 buf
->b_ops
= &xfs_agi_buf_ops
;
3342 memset(agi
, 0, sectorsize
);
3343 agi
->agi_magicnum
= cpu_to_be32(XFS_AGI_MAGIC
);
3344 agi
->agi_versionnum
= cpu_to_be32(XFS_AGI_VERSION
);
3345 agi
->agi_seqno
= cpu_to_be32(agno
);
3346 agi
->agi_length
= cpu_to_be32((xfs_agblock_t
)agsize
);
3348 agi
->agi_root
= cpu_to_be32(XFS_IBT_BLOCK(mp
));
3349 agi
->agi_level
= cpu_to_be32(1);
3350 if (sb_feat
.finobt
) {
3351 agi
->agi_free_root
= cpu_to_be32(XFS_FIBT_BLOCK(mp
));
3352 agi
->agi_free_level
= cpu_to_be32(1);
3354 agi
->agi_freecount
= 0;
3355 agi
->agi_newino
= cpu_to_be32(NULLAGINO
);
3356 agi
->agi_dirino
= cpu_to_be32(NULLAGINO
);
3357 if (xfs_sb_version_hascrc(&mp
->m_sb
))
3358 platform_uuid_copy(&agi
->agi_uuid
, &mp
->m_sb
.sb_uuid
);
3359 for (c
= 0; c
< XFS_AGI_UNLINKED_BUCKETS
; c
++)
3360 agi
->agi_unlinked
[c
] = cpu_to_be32(NULLAGINO
);
3361 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3364 * BNO btree root block
3366 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3367 XFS_AGB_TO_DADDR(mp
, agno
, XFS_BNO_BLOCK(mp
)),
3369 buf
->b_ops
= &xfs_allocbt_buf_ops
;
3370 block
= XFS_BUF_TO_BLOCK(buf
);
3371 memset(block
, 0, blocksize
);
3372 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_BNO
, 0, 1, agno
, 0);
3374 arec
= XFS_ALLOC_REC_ADDR(mp
, block
, 1);
3375 arec
->ar_startblock
= cpu_to_be32(libxfs_prealloc_blocks(mp
));
3376 if (loginternal
&& agno
== logagno
) {
3379 * Have to insert two records
3380 * Insert pad record for stripe align of log
3382 arec
->ar_blockcount
= cpu_to_be32(
3383 XFS_FSB_TO_AGBNO(mp
, logstart
) -
3384 be32_to_cpu(arec
->ar_startblock
));
3387 * Insert record at start of internal log
3389 nrec
->ar_startblock
= cpu_to_be32(
3390 be32_to_cpu(arec
->ar_startblock
) +
3391 be32_to_cpu(arec
->ar_blockcount
));
3393 be16_add_cpu(&block
->bb_numrecs
, 1);
3396 * Change record start to after the internal log
3398 be32_add_cpu(&arec
->ar_startblock
, logblocks
);
3401 * Calculate the record block count and check for the case where
3402 * the log might have consumed all available space in the AG. If
3403 * so, reset the record count to 0 to avoid exposure of an invalid
3404 * record start block.
3406 arec
->ar_blockcount
= cpu_to_be32(agsize
-
3407 be32_to_cpu(arec
->ar_startblock
));
3408 if (!arec
->ar_blockcount
)
3409 block
->bb_numrecs
= 0;
3411 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3414 * CNT btree root block
3416 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3417 XFS_AGB_TO_DADDR(mp
, agno
, XFS_CNT_BLOCK(mp
)),
3419 buf
->b_ops
= &xfs_allocbt_buf_ops
;
3420 block
= XFS_BUF_TO_BLOCK(buf
);
3421 memset(block
, 0, blocksize
);
3422 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_CNT
, 0, 1, agno
, 0);
3424 arec
= XFS_ALLOC_REC_ADDR(mp
, block
, 1);
3425 arec
->ar_startblock
= cpu_to_be32(libxfs_prealloc_blocks(mp
));
3426 if (loginternal
&& agno
== logagno
) {
3428 arec
->ar_blockcount
= cpu_to_be32(
3429 XFS_FSB_TO_AGBNO(mp
, logstart
) -
3430 be32_to_cpu(arec
->ar_startblock
));
3432 nrec
->ar_startblock
= cpu_to_be32(
3433 be32_to_cpu(arec
->ar_startblock
) +
3434 be32_to_cpu(arec
->ar_blockcount
));
3436 be16_add_cpu(&block
->bb_numrecs
, 1);
3438 be32_add_cpu(&arec
->ar_startblock
, logblocks
);
3441 * Calculate the record block count and check for the case where
3442 * the log might have consumed all available space in the AG. If
3443 * so, reset the record count to 0 to avoid exposure of an invalid
3444 * record start block.
3446 arec
->ar_blockcount
= cpu_to_be32(agsize
-
3447 be32_to_cpu(arec
->ar_startblock
));
3448 if (!arec
->ar_blockcount
)
3449 block
->bb_numrecs
= 0;
3451 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3454 * refcount btree root block
3456 if (xfs_sb_version_hasreflink(&mp
->m_sb
)) {
3457 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3458 XFS_AGB_TO_DADDR(mp
, agno
,
3459 libxfs_refc_block(mp
)),
3461 buf
->b_ops
= &xfs_refcountbt_buf_ops
;
3463 block
= XFS_BUF_TO_BLOCK(buf
);
3464 memset(block
, 0, blocksize
);
3465 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_REFC
, 0,
3468 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3472 * INO btree root block
3474 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3475 XFS_AGB_TO_DADDR(mp
, agno
, XFS_IBT_BLOCK(mp
)),
3477 buf
->b_ops
= &xfs_inobt_buf_ops
;
3478 block
= XFS_BUF_TO_BLOCK(buf
);
3479 memset(block
, 0, blocksize
);
3480 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_INO
, 0, 0, agno
, 0);
3481 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3484 * Free INO btree root block
3486 if (sb_feat
.finobt
) {
3487 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3488 XFS_AGB_TO_DADDR(mp
, agno
, XFS_FIBT_BLOCK(mp
)),
3490 buf
->b_ops
= &xfs_inobt_buf_ops
;
3491 block
= XFS_BUF_TO_BLOCK(buf
);
3492 memset(block
, 0, blocksize
);
3493 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_FINO
, 0, 0, agno
, 0);
3494 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3497 /* RMAP btree root block */
3498 if (xfs_sb_version_hasrmapbt(&mp
->m_sb
)) {
3499 struct xfs_rmap_rec
*rrec
;
3501 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3502 XFS_AGB_TO_DADDR(mp
, agno
, XFS_RMAP_BLOCK(mp
)),
3504 buf
->b_ops
= &xfs_rmapbt_buf_ops
;
3505 block
= XFS_BUF_TO_BLOCK(buf
);
3506 memset(block
, 0, blocksize
);
3508 libxfs_btree_init_block(mp
, buf
, XFS_BTNUM_RMAP
, 0, 0, agno
, 0);
3511 * mark the AG header regions as static metadata
3512 * The BNO btree block is the first block after the
3513 * headers, so it's location defines the size of region
3514 * the static metadata consumes.
3516 rrec
= XFS_RMAP_REC_ADDR(block
, 1);
3517 rrec
->rm_startblock
= 0;
3518 rrec
->rm_blockcount
= cpu_to_be32(XFS_BNO_BLOCK(mp
));
3519 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_FS
);
3520 rrec
->rm_offset
= 0;
3521 be16_add_cpu(&block
->bb_numrecs
, 1);
3523 /* account freespace btree root blocks */
3524 rrec
= XFS_RMAP_REC_ADDR(block
, 2);
3525 rrec
->rm_startblock
= cpu_to_be32(XFS_BNO_BLOCK(mp
));
3526 rrec
->rm_blockcount
= cpu_to_be32(2);
3527 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_AG
);
3528 rrec
->rm_offset
= 0;
3529 be16_add_cpu(&block
->bb_numrecs
, 1);
3531 /* account inode btree root blocks */
3532 rrec
= XFS_RMAP_REC_ADDR(block
, 3);
3533 rrec
->rm_startblock
= cpu_to_be32(XFS_IBT_BLOCK(mp
));
3534 rrec
->rm_blockcount
= cpu_to_be32(XFS_RMAP_BLOCK(mp
) -
3536 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_INOBT
);
3537 rrec
->rm_offset
= 0;
3538 be16_add_cpu(&block
->bb_numrecs
, 1);
3540 /* account for rmap btree root */
3541 rrec
= XFS_RMAP_REC_ADDR(block
, 4);
3542 rrec
->rm_startblock
= cpu_to_be32(XFS_RMAP_BLOCK(mp
));
3543 rrec
->rm_blockcount
= cpu_to_be32(1);
3544 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_AG
);
3545 rrec
->rm_offset
= 0;
3546 be16_add_cpu(&block
->bb_numrecs
, 1);
3548 /* account for refcount btree root */
3549 if (xfs_sb_version_hasreflink(&mp
->m_sb
)) {
3550 rrec
= XFS_RMAP_REC_ADDR(block
, 5);
3551 rrec
->rm_startblock
= cpu_to_be32(
3552 libxfs_refc_block(mp
));
3553 rrec
->rm_blockcount
= cpu_to_be32(1);
3554 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_REFC
);
3555 rrec
->rm_offset
= 0;
3556 be16_add_cpu(&block
->bb_numrecs
, 1);
3559 /* account for the log space */
3560 if (loginternal
&& agno
== logagno
) {
3561 rrec
= XFS_RMAP_REC_ADDR(block
,
3562 be16_to_cpu(block
->bb_numrecs
) + 1);
3563 rrec
->rm_startblock
= cpu_to_be32(
3564 XFS_FSB_TO_AGBNO(mp
, logstart
));
3565 rrec
->rm_blockcount
= cpu_to_be32(logblocks
);
3566 rrec
->rm_owner
= cpu_to_be64(XFS_RMAP_OWN_LOG
);
3567 rrec
->rm_offset
= 0;
3568 be16_add_cpu(&block
->bb_numrecs
, 1);
3571 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3574 libxfs_perag_put(pag
);
3578 * Touch last block, make fs the right size if it's a file.
3580 buf
= libxfs_getbuf(mp
->m_ddev_targp
,
3581 (xfs_daddr_t
)XFS_FSB_TO_BB(mp
, dblocks
- 1LL), bsize
);
3582 memset(XFS_BUF_PTR(buf
), 0, blocksize
);
3583 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3586 * Make sure we can write the last block in the realtime area.
3588 if (mp
->m_rtdev_targp
->dev
&& rtblocks
> 0) {
3589 buf
= libxfs_getbuf(mp
->m_rtdev_targp
,
3590 XFS_FSB_TO_BB(mp
, rtblocks
- 1LL), bsize
);
3591 memset(XFS_BUF_PTR(buf
), 0, blocksize
);
3592 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3596 * BNO, CNT free block list
3598 for (agno
= 0; agno
< agcount
; agno
++) {
3599 xfs_alloc_arg_t args
;
3601 struct xfs_trans_res tres
= {0};
3603 c
= libxfs_trans_alloc(mp
, &tres
, worst_freelist
, 0, 0, &tp
);
3607 memset(&args
, 0, sizeof(args
));
3612 args
.pag
= libxfs_perag_get(mp
,agno
);
3614 libxfs_alloc_fix_freelist(&args
, 0);
3615 libxfs_perag_put(args
.pag
);
3616 libxfs_trans_commit(tp
);
3620 * Allocate the root inode and anything else in the proto file.
3622 parse_proto(mp
, &fsx
, &protostring
);
3625 * Protect ourselves against possible stupidity
3627 if (XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rootino
) != 0) {
3629 _("%s: root inode created in AG %u, not AG 0\n"),
3630 progname
, XFS_INO_TO_AGNO(mp
, mp
->m_sb
.sb_rootino
));
3635 * Write out multiple secondary superblocks with rootinode field set
3637 if (mp
->m_sb
.sb_agcount
> 1) {
3639 * the last superblock
3641 buf
= libxfs_readbuf(mp
->m_dev
,
3642 XFS_AGB_TO_DADDR(mp
, mp
->m_sb
.sb_agcount
-1,
3644 XFS_FSS_TO_BB(mp
, 1),
3645 LIBXFS_EXIT_ON_FAILURE
, &xfs_sb_buf_ops
);
3646 XFS_BUF_TO_SBP(buf
)->sb_rootino
= cpu_to_be64(
3647 mp
->m_sb
.sb_rootino
);
3648 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3650 * and one in the middle for luck
3652 if (mp
->m_sb
.sb_agcount
> 2) {
3653 buf
= libxfs_readbuf(mp
->m_dev
,
3654 XFS_AGB_TO_DADDR(mp
, (mp
->m_sb
.sb_agcount
-1)/2,
3656 XFS_FSS_TO_BB(mp
, 1),
3657 LIBXFS_EXIT_ON_FAILURE
, &xfs_sb_buf_ops
);
3658 XFS_BUF_TO_SBP(buf
)->sb_rootino
= cpu_to_be64(
3659 mp
->m_sb
.sb_rootino
);
3660 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3665 * Dump all inodes and buffers before marking us all done.
3666 * Need to drop references to inodes we still hold, first.
3668 libxfs_rtmount_destroy(mp
);
3669 libxfs_bcache_purge();
3672 * Mark the filesystem ok.
3674 buf
= libxfs_getsb(mp
, LIBXFS_EXIT_ON_FAILURE
);
3675 (XFS_BUF_TO_SBP(buf
))->sb_inprogress
= 0;
3676 libxfs_writebuf(buf
, LIBXFS_EXIT_ON_FAILURE
);
3680 libxfs_device_close(xi
.rtdev
);
3681 if (xi
.logdev
&& xi
.logdev
!= xi
.ddev
)
3682 libxfs_device_close(xi
.logdev
);
3683 libxfs_device_close(xi
.ddev
);
3695 fprintf(stderr
, _("Cannot specify both -%c %s and -%c %s\n"),
3696 opt
, tab
[oldidx
], opt
, tab
[newidx
]);
3706 fprintf(stderr
, _("Illegal value %s for -%s option\n"), value
, opt
);
3714 return (i
& (i
- 1)) == 0;
3717 static void __attribute__((noreturn
))
3723 fprintf(stderr
, _("-%c %s option requires a value\n"), opt
, tab
[idx
]);
3733 fprintf(stderr
, "-%c ", opt
);
3735 fprintf(stderr
, "%s ", tab
[idx
]);
3736 fprintf(stderr
, _("option respecified\n"));
3745 fprintf(stderr
, _("unknown option -%c %s\n"), opt
, s
);
3751 unsigned int blksize
,
3752 unsigned int sectsize
,
3759 i
= strtoll(s
, &sp
, 0);
3760 if (i
== 0 && sp
== s
)
3771 _("Blocksize must be provided prior to using 'b' suffix.\n"));
3780 _("Sectorsize must be specified prior to using 's' suffix.\n"));
3783 return i
* sectsize
;
3812 static void __attribute__((noreturn
))
3815 fprintf(stderr
, _("Usage: %s\n\
3816 /* blocksize */ [-b log=n|size=num]\n\
3817 /* metadata */ [-m crc=0|1,finobt=0|1,uuid=xxx,rmapbt=0|1,reflink=0|1]\n\
3818 /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num,\n\
3819 (sunit=value,swidth=value|su=num,sw=num|noalign),\n\
3820 sectlog=n|sectsize=num\n\
3821 /* force overwrite */ [-f]\n\
3822 /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2,\n\
3823 projid32bit=0|1,sparse=0|1]\n\
3824 /* no discard */ [-K]\n\
3825 /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n\n\
3826 sunit=value|su=num,sectlog=n|sectsize=num,\n\
3828 /* label */ [-L label (maximum 12 characters)]\n\
3829 /* naming */ [-n log=n|size=num,version=2|ci,ftype=0|1]\n\
3830 /* no-op info only */ [-N]\n\
3831 /* prototype file */ [-p fname]\n\
3833 /* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx]\n\
3834 /* sectorsize */ [-s log=n|size=num]\n\
3835 /* version */ [-V]\n\
3837 <devicename> is required unless -d name=xxx is given.\n\
3838 <num> is xxx (bytes), xxxs (sectors), xxxb (fs blocks), xxxk (xxx KiB),\n\
3839 xxxm (xxx MiB), xxxg (xxx GiB), xxxt (xxx TiB) or xxxp (xxx PiB).\n\
3840 <value> is xxx (512 byte blocks).\n"),