Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0
2 : /*
3 : * Copyright (c) 2000-2005 Silicon Graphics, Inc.
4 : * All Rights Reserved.
5 : */
6 : #include "xfs.h"
7 : #include "xfs_fs.h"
8 : #include "xfs_shared.h"
9 : #include "xfs_format.h"
10 : #include "xfs_log_format.h"
11 : #include "xfs_trans_resv.h"
12 : #include "xfs_bit.h"
13 : #include "xfs_sb.h"
14 : #include "xfs_mount.h"
15 : #include "xfs_ialloc.h"
16 : #include "xfs_alloc.h"
17 : #include "xfs_error.h"
18 : #include "xfs_trans.h"
19 : #include "xfs_buf_item.h"
20 : #include "xfs_bmap_btree.h"
21 : #include "xfs_alloc_btree.h"
22 : #include "xfs_log.h"
23 : #include "xfs_rmap_btree.h"
24 : #include "xfs_refcount_btree.h"
25 : #include "xfs_da_format.h"
26 : #include "xfs_health.h"
27 : #include "xfs_ag.h"
28 :
29 : /*
30 : * Physical superblock buffer manipulations. Shared with libxfs in userspace.
31 : */
32 :
33 : /*
34 : * Check that all the V4 feature bits that the V5 filesystem format requires are
35 : * correctly set.
36 : */
37 : static bool
38 654869 : xfs_sb_validate_v5_features(
39 : struct xfs_sb *sbp)
40 : {
41 : /* We must not have any unknown V4 feature bits set */
42 654869 : if (sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS)
43 : return false;
44 :
45 : /*
46 : * The CRC bit is considered an invalid V4 flag, so we have to add it
47 : * manually to the OKBITS mask.
48 : */
49 654869 : if (sbp->sb_features2 & ~(XFS_SB_VERSION2_OKBITS |
50 : XFS_SB_VERSION2_CRCBIT))
51 : return false;
52 :
53 : /* Now check all the required V4 feature flags are set. */
54 :
55 : #define V5_VERS_FLAGS (XFS_SB_VERSION_NLINKBIT | \
56 : XFS_SB_VERSION_ALIGNBIT | \
57 : XFS_SB_VERSION_LOGV2BIT | \
58 : XFS_SB_VERSION_EXTFLGBIT | \
59 : XFS_SB_VERSION_DIRV2BIT | \
60 : XFS_SB_VERSION_MOREBITSBIT)
61 :
62 : #define V5_FEAT_FLAGS (XFS_SB_VERSION2_LAZYSBCOUNTBIT | \
63 : XFS_SB_VERSION2_ATTR2BIT | \
64 : XFS_SB_VERSION2_PROJID32BIT | \
65 : XFS_SB_VERSION2_CRCBIT)
66 :
67 654869 : if ((sbp->sb_versionnum & V5_VERS_FLAGS) != V5_VERS_FLAGS)
68 : return false;
69 654869 : if ((sbp->sb_features2 & V5_FEAT_FLAGS) != V5_FEAT_FLAGS)
70 0 : return false;
71 : return true;
72 : }
73 :
74 : /*
75 : * We current support XFS v5 formats with known features and v4 superblocks with
76 : * at least V2 directories.
77 : */
78 : bool
79 659582 : xfs_sb_good_version(
80 : struct xfs_sb *sbp)
81 : {
82 : /*
83 : * All v5 filesystems are supported, but we must check that all the
84 : * required v4 feature flags are enabled correctly as the code checks
85 : * those flags and not for v5 support.
86 : */
87 659582 : if (xfs_sb_is_v5(sbp))
88 654870 : return xfs_sb_validate_v5_features(sbp);
89 :
90 : /* versions prior to v4 are not supported */
91 4712 : if (XFS_SB_VERSION_NUM(sbp) != XFS_SB_VERSION_4)
92 : return false;
93 :
94 : /* We must not have any unknown v4 feature bits set */
95 4712 : if ((sbp->sb_versionnum & ~XFS_SB_VERSION_OKBITS) ||
96 4712 : ((sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) &&
97 4712 : (sbp->sb_features2 & ~XFS_SB_VERSION2_OKBITS)))
98 : return false;
99 :
100 : /* V4 filesystems need v2 directories and unwritten extents */
101 4712 : if (!(sbp->sb_versionnum & XFS_SB_VERSION_DIRV2BIT))
102 : return false;
103 4712 : if (!(sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT))
104 0 : return false;
105 :
106 : /* It's a supported v4 filesystem */
107 : return true;
108 : }
109 :
110 : uint64_t
111 32811 : xfs_sb_version_to_features(
112 : struct xfs_sb *sbp)
113 : {
114 32811 : uint64_t features = 0;
115 :
116 : /* optional V4 features */
117 32811 : if (sbp->sb_rblocks > 0)
118 165 : features |= XFS_FEAT_REALTIME;
119 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_NLINKBIT)
120 32811 : features |= XFS_FEAT_NLINK;
121 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_ATTRBIT)
122 22108 : features |= XFS_FEAT_ATTR;
123 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_QUOTABIT)
124 26184 : features |= XFS_FEAT_QUOTA;
125 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_ALIGNBIT)
126 32811 : features |= XFS_FEAT_ALIGN;
127 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_LOGV2BIT)
128 32801 : features |= XFS_FEAT_LOGV2;
129 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT)
130 114 : features |= XFS_FEAT_DALIGN;
131 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_EXTFLGBIT)
132 32811 : features |= XFS_FEAT_EXTFLG;
133 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT)
134 32488 : features |= XFS_FEAT_SECTOR;
135 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_BORGBIT)
136 26 : features |= XFS_FEAT_ASCIICI;
137 32811 : if (sbp->sb_versionnum & XFS_SB_VERSION_MOREBITSBIT) {
138 32811 : if (sbp->sb_features2 & XFS_SB_VERSION2_LAZYSBCOUNTBIT)
139 32805 : features |= XFS_FEAT_LAZYSBCOUNT;
140 32811 : if (sbp->sb_features2 & XFS_SB_VERSION2_ATTR2BIT)
141 32805 : features |= XFS_FEAT_ATTR2;
142 32811 : if (sbp->sb_features2 & XFS_SB_VERSION2_PROJID32BIT)
143 32805 : features |= XFS_FEAT_PROJID32;
144 32811 : if (sbp->sb_features2 & XFS_SB_VERSION2_FTYPE)
145 30 : features |= XFS_FEAT_FTYPE;
146 : }
147 :
148 32811 : if (!xfs_sb_is_v5(sbp))
149 : return features;
150 :
151 : /* Always on V5 features */
152 32759 : features |= XFS_FEAT_ALIGN | XFS_FEAT_LOGV2 | XFS_FEAT_EXTFLG |
153 : XFS_FEAT_LAZYSBCOUNT | XFS_FEAT_ATTR2 | XFS_FEAT_PROJID32 |
154 : XFS_FEAT_V3INODES | XFS_FEAT_CRC | XFS_FEAT_PQUOTINO;
155 :
156 : /* Optional V5 features */
157 32759 : if (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_FINOBT)
158 32755 : features |= XFS_FEAT_FINOBT;
159 32759 : if (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_RMAPBT)
160 32576 : features |= XFS_FEAT_RMAPBT;
161 32759 : if (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_REFLINK)
162 32576 : features |= XFS_FEAT_REFLINK;
163 32759 : if (sbp->sb_features_ro_compat & XFS_SB_FEAT_RO_COMPAT_INOBTCNT)
164 32751 : features |= XFS_FEAT_INOBTCNT;
165 32759 : if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_FTYPE)
166 32759 : features |= XFS_FEAT_FTYPE;
167 32759 : if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_SPINODES)
168 32759 : features |= XFS_FEAT_SPINODES;
169 32759 : if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_META_UUID)
170 18 : features |= XFS_FEAT_META_UUID;
171 32759 : if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_BIGTIME)
172 32745 : features |= XFS_FEAT_BIGTIME;
173 32759 : if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_NEEDSREPAIR)
174 4 : features |= XFS_FEAT_NEEDSREPAIR;
175 32759 : if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_NREXT64)
176 32757 : features |= XFS_FEAT_NREXT64;
177 :
178 : return features;
179 : }
180 :
181 : /* Check all the superblock fields we care about when reading one in. */
182 : STATIC int
183 463544 : xfs_validate_sb_read(
184 : struct xfs_mount *mp,
185 : struct xfs_sb *sbp)
186 : {
187 463544 : if (!xfs_sb_is_v5(sbp))
188 : return 0;
189 :
190 : /*
191 : * Version 5 superblock feature mask validation. Reject combinations
192 : * the kernel cannot support up front before checking anything else.
193 : */
194 463490 : if (xfs_sb_has_compat_feature(sbp, XFS_SB_FEAT_COMPAT_UNKNOWN)) {
195 0 : xfs_warn(mp,
196 : "Superblock has unknown compatible features (0x%x) enabled.",
197 : (sbp->sb_features_compat & XFS_SB_FEAT_COMPAT_UNKNOWN));
198 0 : xfs_warn(mp,
199 : "Using a more recent kernel is recommended.");
200 : }
201 :
202 463490 : if (xfs_sb_has_ro_compat_feature(sbp, XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) {
203 4 : xfs_alert(mp,
204 : "Superblock has unknown read-only compatible features (0x%x) enabled.",
205 : (sbp->sb_features_ro_compat &
206 : XFS_SB_FEAT_RO_COMPAT_UNKNOWN));
207 8 : if (!xfs_is_readonly(mp)) {
208 2 : xfs_warn(mp,
209 : "Attempted to mount read-only compatible filesystem read-write.");
210 2 : xfs_warn(mp,
211 : "Filesystem can only be safely mounted read only.");
212 :
213 2 : return -EINVAL;
214 : }
215 : }
216 463488 : if (xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_UNKNOWN)) {
217 0 : xfs_warn(mp,
218 : "Superblock has unknown incompatible features (0x%x) enabled.",
219 : (sbp->sb_features_incompat &
220 : XFS_SB_FEAT_INCOMPAT_UNKNOWN));
221 0 : xfs_warn(mp,
222 : "Filesystem cannot be safely mounted by this kernel.");
223 0 : return -EINVAL;
224 : }
225 :
226 : return 0;
227 : }
228 :
229 : /* Check all the superblock fields we care about when writing one out. */
230 : STATIC int
231 196030 : xfs_validate_sb_write(
232 : struct xfs_mount *mp,
233 : struct xfs_buf *bp,
234 : struct xfs_sb *sbp)
235 : {
236 : /*
237 : * Carry out additional sb summary counter sanity checks when we write
238 : * the superblock. We skip this in the read validator because there
239 : * could be newer superblocks in the log and if the values are garbage
240 : * even after replay we'll recalculate them at the end of log mount.
241 : *
242 : * mkfs has traditionally written zeroed counters to inprogress and
243 : * secondary superblocks, so allow this usage to continue because
244 : * we never read counters from such superblocks.
245 : */
246 196030 : if (xfs_buf_daddr(bp) == XFS_SB_DADDR && !sbp->sb_inprogress &&
247 273062 : (sbp->sb_fdblocks > sbp->sb_dblocks ||
248 136530 : !xfs_verify_icount(mp, sbp->sb_icount) ||
249 136530 : sbp->sb_ifree > sbp->sb_icount)) {
250 2 : xfs_warn(mp, "SB summary counter sanity check failed");
251 2 : return -EFSCORRUPTED;
252 : }
253 :
254 196028 : if (!xfs_sb_is_v5(sbp))
255 : return 0;
256 :
257 : /*
258 : * Version 5 superblock feature mask validation. Reject combinations
259 : * the kernel cannot support since we checked for unsupported bits in
260 : * the read verifier, which means that memory is corrupt.
261 : */
262 191370 : if (xfs_sb_has_compat_feature(sbp, XFS_SB_FEAT_COMPAT_UNKNOWN)) {
263 0 : xfs_warn(mp,
264 : "Corruption detected in superblock compatible features (0x%x)!",
265 : (sbp->sb_features_compat & XFS_SB_FEAT_COMPAT_UNKNOWN));
266 0 : return -EFSCORRUPTED;
267 : }
268 :
269 191370 : if (xfs_sb_has_ro_compat_feature(sbp, XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) {
270 2 : xfs_alert(mp,
271 : "Corruption detected in superblock read-only compatible features (0x%x)!",
272 : (sbp->sb_features_ro_compat &
273 : XFS_SB_FEAT_RO_COMPAT_UNKNOWN));
274 2 : return -EFSCORRUPTED;
275 : }
276 191368 : if (xfs_sb_has_incompat_feature(sbp, XFS_SB_FEAT_INCOMPAT_UNKNOWN)) {
277 0 : xfs_warn(mp,
278 : "Corruption detected in superblock incompatible features (0x%x)!",
279 : (sbp->sb_features_incompat &
280 : XFS_SB_FEAT_INCOMPAT_UNKNOWN));
281 0 : return -EFSCORRUPTED;
282 : }
283 191368 : if (xfs_sb_has_incompat_log_feature(sbp,
284 : XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN)) {
285 0 : xfs_warn(mp,
286 : "Corruption detected in superblock incompatible log features (0x%x)!",
287 : (sbp->sb_features_log_incompat &
288 : XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN));
289 0 : return -EFSCORRUPTED;
290 : }
291 :
292 : /*
293 : * We can't read verify the sb LSN because the read verifier is called
294 : * before the log is allocated and processed. We know the log is set up
295 : * before write verifier calls, so check it here.
296 : */
297 191368 : if (!xfs_log_check_lsn(mp, sbp->sb_lsn))
298 0 : return -EFSCORRUPTED;
299 :
300 : return 0;
301 : }
302 :
303 : /* Check the validity of the SB. */
304 : STATIC int
305 659583 : xfs_validate_sb_common(
306 : struct xfs_mount *mp,
307 : struct xfs_buf *bp,
308 : struct xfs_sb *sbp)
309 : {
310 659583 : struct xfs_dsb *dsb = bp->b_addr;
311 659583 : uint32_t agcount = 0;
312 659583 : uint32_t rem;
313 659583 : bool has_dalign;
314 :
315 659583 : if (!xfs_verify_magic(bp, dsb->sb_magicnum)) {
316 2 : xfs_warn(mp,
317 : "Superblock has bad magic number 0x%x. Not an XFS filesystem?",
318 : be32_to_cpu(dsb->sb_magicnum));
319 2 : return -EWRONGFS;
320 : }
321 :
322 659582 : if (!xfs_sb_good_version(sbp)) {
323 0 : xfs_warn(mp,
324 : "Superblock has unknown features enabled or corrupted feature masks.");
325 0 : return -EWRONGFS;
326 : }
327 :
328 : /*
329 : * Validate feature flags and state
330 : */
331 659582 : if (xfs_sb_is_v5(sbp)) {
332 654870 : if (sbp->sb_blocksize < XFS_MIN_CRC_BLOCKSIZE) {
333 0 : xfs_notice(mp,
334 : "Block size (%u bytes) too small for Version 5 superblock (minimum %d bytes)",
335 : sbp->sb_blocksize, XFS_MIN_CRC_BLOCKSIZE);
336 0 : return -EFSCORRUPTED;
337 : }
338 :
339 : /* V5 has a separate project quota inode */
340 654870 : if (sbp->sb_qflags & (XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD)) {
341 0 : xfs_notice(mp,
342 : "Version 5 of Super block has XFS_OQUOTA bits.");
343 0 : return -EFSCORRUPTED;
344 : }
345 :
346 : /*
347 : * Full inode chunks must be aligned to inode chunk size when
348 : * sparse inodes are enabled to support the sparse chunk
349 : * allocation algorithm and prevent overlapping inode records.
350 : */
351 654870 : if (sbp->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_SPINODES) {
352 654870 : uint32_t align;
353 :
354 1309740 : align = XFS_INODES_PER_CHUNK * sbp->sb_inodesize
355 654870 : >> sbp->sb_blocklog;
356 654870 : if (sbp->sb_inoalignmt != align) {
357 0 : xfs_warn(mp,
358 : "Inode block alignment (%u) must match chunk size (%u) for sparse inodes.",
359 : sbp->sb_inoalignmt, align);
360 0 : return -EINVAL;
361 : }
362 : }
363 4712 : } else if (sbp->sb_qflags & (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD |
364 : XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD)) {
365 0 : xfs_notice(mp,
366 : "Superblock earlier than Version 5 has XFS_{P|G}QUOTA_{ENFD|CHKD} bits.");
367 0 : return -EFSCORRUPTED;
368 : }
369 :
370 659582 : if (unlikely(
371 : sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) {
372 2 : xfs_warn(mp,
373 : "filesystem is marked as having an external log; "
374 : "specify logdev on the mount command line.");
375 2 : return -EINVAL;
376 : }
377 :
378 659580 : if (unlikely(
379 : sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) {
380 2 : xfs_warn(mp,
381 : "filesystem is marked as having an internal log; "
382 : "do not specify logdev on the mount command line.");
383 2 : return -EINVAL;
384 : }
385 :
386 : /* Compute agcount for this number of dblocks and agblocks */
387 659578 : if (sbp->sb_agblocks) {
388 659578 : agcount = div_u64_rem(sbp->sb_dblocks, sbp->sb_agblocks, &rem);
389 659578 : if (rem)
390 14132 : agcount++;
391 : }
392 :
393 : /*
394 : * More sanity checking. Most of these were stolen directly from
395 : * xfs_repair.
396 : */
397 1319154 : if (unlikely(
398 : sbp->sb_agcount <= 0 ||
399 : sbp->sb_sectsize < XFS_MIN_SECTORSIZE ||
400 : sbp->sb_sectsize > XFS_MAX_SECTORSIZE ||
401 : sbp->sb_sectlog < XFS_MIN_SECTORSIZE_LOG ||
402 : sbp->sb_sectlog > XFS_MAX_SECTORSIZE_LOG ||
403 : sbp->sb_sectsize != (1 << sbp->sb_sectlog) ||
404 : sbp->sb_blocksize < XFS_MIN_BLOCKSIZE ||
405 : sbp->sb_blocksize > XFS_MAX_BLOCKSIZE ||
406 : sbp->sb_blocklog < XFS_MIN_BLOCKSIZE_LOG ||
407 : sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG ||
408 : sbp->sb_blocksize != (1 << sbp->sb_blocklog) ||
409 : sbp->sb_dirblklog + sbp->sb_blocklog > XFS_MAX_BLOCKSIZE_LOG ||
410 : sbp->sb_inodesize < XFS_DINODE_MIN_SIZE ||
411 : sbp->sb_inodesize > XFS_DINODE_MAX_SIZE ||
412 : sbp->sb_inodelog < XFS_DINODE_MIN_LOG ||
413 : sbp->sb_inodelog > XFS_DINODE_MAX_LOG ||
414 : sbp->sb_inodesize != (1 << sbp->sb_inodelog) ||
415 : sbp->sb_inopblock != howmany(sbp->sb_blocksize,sbp->sb_inodesize) ||
416 : XFS_FSB_TO_B(mp, sbp->sb_agblocks) < XFS_MIN_AG_BYTES ||
417 : XFS_FSB_TO_B(mp, sbp->sb_agblocks) > XFS_MAX_AG_BYTES ||
418 : sbp->sb_agblklog != xfs_highbit32(sbp->sb_agblocks - 1) + 1 ||
419 : agcount == 0 || agcount != sbp->sb_agcount ||
420 : (sbp->sb_blocklog - sbp->sb_inodelog != sbp->sb_inopblog) ||
421 : (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) ||
422 : (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) ||
423 : (sbp->sb_imax_pct > 100 /* zero sb_imax_pct is valid */) ||
424 : sbp->sb_dblocks == 0 ||
425 : sbp->sb_dblocks > XFS_MAX_DBLOCKS(sbp) ||
426 : sbp->sb_dblocks < XFS_MIN_DBLOCKS(sbp) ||
427 : sbp->sb_shared_vn != 0)) {
428 2 : xfs_notice(mp, "SB sanity check failed");
429 2 : return -EFSCORRUPTED;
430 : }
431 :
432 : /*
433 : * Logs that are too large are not supported at all. Reject them
434 : * outright. Logs that are too small are tolerated on v4 filesystems,
435 : * but we can only check that when mounting the log. Hence we skip
436 : * those checks here.
437 : */
438 659576 : if (sbp->sb_logblocks > XFS_MAX_LOG_BLOCKS) {
439 0 : xfs_notice(mp,
440 : "Log size 0x%x blocks too large, maximum size is 0x%llx blocks",
441 : sbp->sb_logblocks, XFS_MAX_LOG_BLOCKS);
442 0 : return -EFSCORRUPTED;
443 : }
444 :
445 659576 : if (XFS_FSB_TO_B(mp, sbp->sb_logblocks) > XFS_MAX_LOG_BYTES) {
446 0 : xfs_warn(mp,
447 : "log size 0x%llx bytes too large, maximum size is 0x%llx bytes",
448 : XFS_FSB_TO_B(mp, sbp->sb_logblocks),
449 : XFS_MAX_LOG_BYTES);
450 0 : return -EFSCORRUPTED;
451 : }
452 :
453 : /*
454 : * Do not allow filesystems with corrupted log sector or stripe units to
455 : * be mounted. We cannot safely size the iclogs or write to the log if
456 : * the log stripe unit is not valid.
457 : */
458 659576 : if (sbp->sb_versionnum & XFS_SB_VERSION_SECTORBIT) {
459 656830 : if (sbp->sb_logsectsize != (1U << sbp->sb_logsectlog)) {
460 0 : xfs_notice(mp,
461 : "log sector size in bytes/log2 (0x%x/0x%x) must match",
462 : sbp->sb_logsectsize, 1U << sbp->sb_logsectlog);
463 0 : return -EFSCORRUPTED;
464 : }
465 2746 : } else if (sbp->sb_logsectsize || sbp->sb_logsectlog) {
466 0 : xfs_notice(mp,
467 : "log sector size in bytes/log2 (0x%x/0x%x) are not zero",
468 : sbp->sb_logsectsize, sbp->sb_logsectlog);
469 0 : return -EFSCORRUPTED;
470 : }
471 :
472 659576 : if (sbp->sb_logsunit > 1) {
473 657068 : if (sbp->sb_logsunit % sbp->sb_blocksize) {
474 2 : xfs_notice(mp,
475 : "log stripe unit 0x%x bytes must be a multiple of block size",
476 : sbp->sb_logsunit);
477 2 : return -EFSCORRUPTED;
478 : }
479 657066 : if (sbp->sb_logsunit > XLOG_MAX_RECORD_BSIZE) {
480 0 : xfs_notice(mp,
481 : "log stripe unit 0x%x bytes over maximum size (0x%x bytes)",
482 : sbp->sb_logsunit, XLOG_MAX_RECORD_BSIZE);
483 0 : return -EFSCORRUPTED;
484 : }
485 : }
486 :
487 : /* Validate the realtime geometry; stolen from xfs_repair */
488 659574 : if (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE ||
489 : sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) {
490 0 : xfs_notice(mp,
491 : "realtime extent sanity check failed");
492 0 : return -EFSCORRUPTED;
493 : }
494 :
495 659574 : if (sbp->sb_rblocks == 0) {
496 414226 : if (sbp->sb_rextents != 0 || sbp->sb_rbmblocks != 0 ||
497 414226 : sbp->sb_rextslog != 0 || sbp->sb_frextents != 0) {
498 0 : xfs_notice(mp,
499 : "realtime zeroed geometry check failed");
500 0 : return -EFSCORRUPTED;
501 : }
502 : } else {
503 245348 : uint64_t rexts;
504 245348 : uint64_t rbmblocks;
505 :
506 245348 : rexts = div_u64(sbp->sb_rblocks, sbp->sb_rextsize);
507 245348 : rbmblocks = howmany_64(sbp->sb_rextents,
508 245348 : NBBY * sbp->sb_blocksize);
509 :
510 490696 : if (sbp->sb_rextents != rexts ||
511 245348 : sbp->sb_rextslog != xfs_highbit32(sbp->sb_rextents) ||
512 245348 : sbp->sb_rbmblocks != rbmblocks) {
513 0 : xfs_notice(mp,
514 : "realtime geometry sanity check failed");
515 0 : return -EFSCORRUPTED;
516 : }
517 : }
518 :
519 : /*
520 : * Either (sb_unit and !hasdalign) or (!sb_unit and hasdalign)
521 : * would imply the image is corrupted.
522 : */
523 659574 : has_dalign = sbp->sb_versionnum & XFS_SB_VERSION_DALIGNBIT;
524 659574 : if (!!sbp->sb_unit ^ has_dalign) {
525 0 : xfs_notice(mp, "SB stripe alignment sanity check failed");
526 0 : return -EFSCORRUPTED;
527 : }
528 :
529 1319148 : if (!xfs_validate_stripe_geometry(mp, XFS_FSB_TO_B(mp, sbp->sb_unit),
530 659574 : XFS_FSB_TO_B(mp, sbp->sb_width), 0, false))
531 : return -EFSCORRUPTED;
532 :
533 : /*
534 : * Currently only very few inode sizes are supported.
535 : */
536 659574 : switch (sbp->sb_inodesize) {
537 : case 256:
538 : case 512:
539 : case 1024:
540 : case 2048:
541 : break;
542 0 : default:
543 0 : xfs_warn(mp, "inode size of %d bytes not supported",
544 : sbp->sb_inodesize);
545 0 : return -ENOSYS;
546 : }
547 :
548 : return 0;
549 : }
550 :
551 : void
552 55343 : xfs_sb_quota_from_disk(struct xfs_sb *sbp)
553 : {
554 : /*
555 : * older mkfs doesn't initialize quota inodes to NULLFSINO. This
556 : * leads to in-core values having two different values for a quota
557 : * inode to be invalid: 0 and NULLFSINO. Change it to a single value
558 : * NULLFSINO.
559 : *
560 : * Note that this change affect only the in-core values. These
561 : * values are not written back to disk unless any quota information
562 : * is written to the disk. Even in that case, sb_pquotino field is
563 : * not written to disk unless the superblock supports pquotino.
564 : */
565 55343 : if (sbp->sb_uquotino == 0)
566 7141 : sbp->sb_uquotino = NULLFSINO;
567 55343 : if (sbp->sb_gquotino == 0)
568 7141 : sbp->sb_gquotino = NULLFSINO;
569 55343 : if (sbp->sb_pquotino == 0)
570 7205 : sbp->sb_pquotino = NULLFSINO;
571 :
572 : /*
573 : * We need to do these manipilations only if we are working
574 : * with an older version of on-disk superblock.
575 : */
576 55343 : if (xfs_sb_is_v5(sbp))
577 : return;
578 :
579 105 : if (sbp->sb_qflags & XFS_OQUOTA_ENFD)
580 32 : sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ?
581 : XFS_PQUOTA_ENFD : XFS_GQUOTA_ENFD;
582 105 : if (sbp->sb_qflags & XFS_OQUOTA_CHKD)
583 32 : sbp->sb_qflags |= (sbp->sb_qflags & XFS_PQUOTA_ACCT) ?
584 : XFS_PQUOTA_CHKD : XFS_GQUOTA_CHKD;
585 105 : sbp->sb_qflags &= ~(XFS_OQUOTA_ENFD | XFS_OQUOTA_CHKD);
586 :
587 105 : if (sbp->sb_qflags & XFS_PQUOTA_ACCT &&
588 16 : sbp->sb_gquotino != NULLFSINO) {
589 : /*
590 : * In older version of superblock, on-disk superblock only
591 : * has sb_gquotino, and in-core superblock has both sb_gquotino
592 : * and sb_pquotino. But, only one of them is supported at any
593 : * point of time. So, if PQUOTA is set in disk superblock,
594 : * copy over sb_gquotino to sb_pquotino. The NULLFSINO test
595 : * above is to make sure we don't do this twice and wipe them
596 : * both out!
597 : */
598 16 : sbp->sb_pquotino = sbp->sb_gquotino;
599 16 : sbp->sb_gquotino = NULLFSINO;
600 : }
601 : }
602 :
603 : static void
604 714927 : __xfs_sb_from_disk(
605 : struct xfs_sb *to,
606 : struct xfs_dsb *from,
607 : bool convert_xquota)
608 : {
609 714927 : to->sb_magicnum = be32_to_cpu(from->sb_magicnum);
610 714927 : to->sb_blocksize = be32_to_cpu(from->sb_blocksize);
611 714927 : to->sb_dblocks = be64_to_cpu(from->sb_dblocks);
612 714927 : to->sb_rblocks = be64_to_cpu(from->sb_rblocks);
613 714927 : to->sb_rextents = be64_to_cpu(from->sb_rextents);
614 1429854 : memcpy(&to->sb_uuid, &from->sb_uuid, sizeof(to->sb_uuid));
615 714927 : to->sb_logstart = be64_to_cpu(from->sb_logstart);
616 714927 : to->sb_rootino = be64_to_cpu(from->sb_rootino);
617 714927 : to->sb_rbmino = be64_to_cpu(from->sb_rbmino);
618 714927 : to->sb_rsumino = be64_to_cpu(from->sb_rsumino);
619 714927 : to->sb_rextsize = be32_to_cpu(from->sb_rextsize);
620 714927 : to->sb_agblocks = be32_to_cpu(from->sb_agblocks);
621 714927 : to->sb_agcount = be32_to_cpu(from->sb_agcount);
622 714927 : to->sb_rbmblocks = be32_to_cpu(from->sb_rbmblocks);
623 714927 : to->sb_logblocks = be32_to_cpu(from->sb_logblocks);
624 714927 : to->sb_versionnum = be16_to_cpu(from->sb_versionnum);
625 714927 : to->sb_sectsize = be16_to_cpu(from->sb_sectsize);
626 714927 : to->sb_inodesize = be16_to_cpu(from->sb_inodesize);
627 714927 : to->sb_inopblock = be16_to_cpu(from->sb_inopblock);
628 1429854 : memcpy(&to->sb_fname, &from->sb_fname, sizeof(to->sb_fname));
629 714927 : to->sb_blocklog = from->sb_blocklog;
630 714927 : to->sb_sectlog = from->sb_sectlog;
631 714927 : to->sb_inodelog = from->sb_inodelog;
632 714927 : to->sb_inopblog = from->sb_inopblog;
633 714927 : to->sb_agblklog = from->sb_agblklog;
634 714927 : to->sb_rextslog = from->sb_rextslog;
635 714927 : to->sb_inprogress = from->sb_inprogress;
636 714927 : to->sb_imax_pct = from->sb_imax_pct;
637 714927 : to->sb_icount = be64_to_cpu(from->sb_icount);
638 714927 : to->sb_ifree = be64_to_cpu(from->sb_ifree);
639 714927 : to->sb_fdblocks = be64_to_cpu(from->sb_fdblocks);
640 714927 : to->sb_frextents = be64_to_cpu(from->sb_frextents);
641 714927 : to->sb_uquotino = be64_to_cpu(from->sb_uquotino);
642 714927 : to->sb_gquotino = be64_to_cpu(from->sb_gquotino);
643 714927 : to->sb_qflags = be16_to_cpu(from->sb_qflags);
644 714927 : to->sb_flags = from->sb_flags;
645 714927 : to->sb_shared_vn = from->sb_shared_vn;
646 714927 : to->sb_inoalignmt = be32_to_cpu(from->sb_inoalignmt);
647 714927 : to->sb_unit = be32_to_cpu(from->sb_unit);
648 714927 : to->sb_width = be32_to_cpu(from->sb_width);
649 714927 : to->sb_dirblklog = from->sb_dirblklog;
650 714927 : to->sb_logsectlog = from->sb_logsectlog;
651 714927 : to->sb_logsectsize = be16_to_cpu(from->sb_logsectsize);
652 714927 : to->sb_logsunit = be32_to_cpu(from->sb_logsunit);
653 714927 : to->sb_features2 = be32_to_cpu(from->sb_features2);
654 714927 : to->sb_bad_features2 = be32_to_cpu(from->sb_bad_features2);
655 714927 : to->sb_features_compat = be32_to_cpu(from->sb_features_compat);
656 714927 : to->sb_features_ro_compat = be32_to_cpu(from->sb_features_ro_compat);
657 714927 : to->sb_features_incompat = be32_to_cpu(from->sb_features_incompat);
658 1429854 : to->sb_features_log_incompat =
659 714927 : be32_to_cpu(from->sb_features_log_incompat);
660 : /* crc is only used on disk, not in memory; just init to 0 here. */
661 714927 : to->sb_crc = 0;
662 714927 : to->sb_spino_align = be32_to_cpu(from->sb_spino_align);
663 714927 : to->sb_pquotino = be64_to_cpu(from->sb_pquotino);
664 714927 : to->sb_lsn = be64_to_cpu(from->sb_lsn);
665 : /*
666 : * sb_meta_uuid is only on disk if it differs from sb_uuid and the
667 : * feature flag is set; if not set we keep it only in memory.
668 : */
669 714927 : if (xfs_sb_is_v5(to) &&
670 710110 : (to->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_META_UUID))
671 90 : uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid);
672 : else
673 714837 : uuid_copy(&to->sb_meta_uuid, &from->sb_uuid);
674 : /* Convert on-disk flags to in-memory flags? */
675 714926 : if (convert_xquota)
676 55343 : xfs_sb_quota_from_disk(to);
677 714926 : }
678 :
679 : void
680 55343 : xfs_sb_from_disk(
681 : struct xfs_sb *to,
682 : struct xfs_dsb *from)
683 : {
684 55343 : __xfs_sb_from_disk(to, from, true);
685 55343 : }
686 :
687 : static void
688 432248 : xfs_sb_quota_to_disk(
689 : struct xfs_dsb *to,
690 : struct xfs_sb *from)
691 : {
692 432248 : uint16_t qflags = from->sb_qflags;
693 :
694 432248 : to->sb_uquotino = cpu_to_be64(from->sb_uquotino);
695 :
696 : /*
697 : * The in-memory superblock quota state matches the v5 on-disk format so
698 : * just write them out and return
699 : */
700 432248 : if (xfs_sb_is_v5(from)) {
701 427570 : to->sb_qflags = cpu_to_be16(from->sb_qflags);
702 427570 : to->sb_gquotino = cpu_to_be64(from->sb_gquotino);
703 427570 : to->sb_pquotino = cpu_to_be64(from->sb_pquotino);
704 427570 : return;
705 : }
706 :
707 : /*
708 : * For older superblocks (v4), the in-core version of sb_qflags do not
709 : * have XFS_OQUOTA_* flags, whereas the on-disk version does. So,
710 : * convert incore XFS_{PG}QUOTA_* flags to on-disk XFS_OQUOTA_* flags.
711 : */
712 4678 : qflags &= ~(XFS_PQUOTA_ENFD | XFS_PQUOTA_CHKD |
713 : XFS_GQUOTA_ENFD | XFS_GQUOTA_CHKD);
714 :
715 4678 : if (from->sb_qflags &
716 : (XFS_PQUOTA_ENFD | XFS_GQUOTA_ENFD))
717 4304 : qflags |= XFS_OQUOTA_ENFD;
718 4678 : if (from->sb_qflags &
719 : (XFS_PQUOTA_CHKD | XFS_GQUOTA_CHKD))
720 4304 : qflags |= XFS_OQUOTA_CHKD;
721 4678 : to->sb_qflags = cpu_to_be16(qflags);
722 :
723 : /*
724 : * GQUOTINO and PQUOTINO cannot be used together in versions
725 : * of superblock that do not have pquotino. from->sb_flags
726 : * tells us which quota is active and should be copied to
727 : * disk. If neither are active, we should NULL the inode.
728 : *
729 : * In all cases, the separate pquotino must remain 0 because it
730 : * is beyond the "end" of the valid non-pquotino superblock.
731 : */
732 4678 : if (from->sb_qflags & XFS_GQUOTA_ACCT)
733 12 : to->sb_gquotino = cpu_to_be64(from->sb_gquotino);
734 4666 : else if (from->sb_qflags & XFS_PQUOTA_ACCT)
735 4304 : to->sb_gquotino = cpu_to_be64(from->sb_pquotino);
736 : else {
737 : /*
738 : * We can't rely on just the fields being logged to tell us
739 : * that it is safe to write NULLFSINO - we should only do that
740 : * if quotas are not actually enabled. Hence only write
741 : * NULLFSINO if both in-core quota inodes are NULL.
742 : */
743 362 : if (from->sb_gquotino == NULLFSINO &&
744 360 : from->sb_pquotino == NULLFSINO)
745 360 : to->sb_gquotino = cpu_to_be64(NULLFSINO);
746 : }
747 :
748 4678 : to->sb_pquotino = 0;
749 : }
750 :
751 : void
752 432232 : xfs_sb_to_disk(
753 : struct xfs_dsb *to,
754 : struct xfs_sb *from)
755 : {
756 432232 : xfs_sb_quota_to_disk(to, from);
757 :
758 432250 : to->sb_magicnum = cpu_to_be32(from->sb_magicnum);
759 432250 : to->sb_blocksize = cpu_to_be32(from->sb_blocksize);
760 432250 : to->sb_dblocks = cpu_to_be64(from->sb_dblocks);
761 432250 : to->sb_rblocks = cpu_to_be64(from->sb_rblocks);
762 432250 : to->sb_rextents = cpu_to_be64(from->sb_rextents);
763 864500 : memcpy(&to->sb_uuid, &from->sb_uuid, sizeof(to->sb_uuid));
764 432250 : to->sb_logstart = cpu_to_be64(from->sb_logstart);
765 432250 : to->sb_rootino = cpu_to_be64(from->sb_rootino);
766 432250 : to->sb_rbmino = cpu_to_be64(from->sb_rbmino);
767 432250 : to->sb_rsumino = cpu_to_be64(from->sb_rsumino);
768 432250 : to->sb_rextsize = cpu_to_be32(from->sb_rextsize);
769 432250 : to->sb_agblocks = cpu_to_be32(from->sb_agblocks);
770 432250 : to->sb_agcount = cpu_to_be32(from->sb_agcount);
771 432250 : to->sb_rbmblocks = cpu_to_be32(from->sb_rbmblocks);
772 432250 : to->sb_logblocks = cpu_to_be32(from->sb_logblocks);
773 432250 : to->sb_versionnum = cpu_to_be16(from->sb_versionnum);
774 432250 : to->sb_sectsize = cpu_to_be16(from->sb_sectsize);
775 432250 : to->sb_inodesize = cpu_to_be16(from->sb_inodesize);
776 432250 : to->sb_inopblock = cpu_to_be16(from->sb_inopblock);
777 864500 : memcpy(&to->sb_fname, &from->sb_fname, sizeof(to->sb_fname));
778 432250 : to->sb_blocklog = from->sb_blocklog;
779 432250 : to->sb_sectlog = from->sb_sectlog;
780 432250 : to->sb_inodelog = from->sb_inodelog;
781 432250 : to->sb_inopblog = from->sb_inopblog;
782 432250 : to->sb_agblklog = from->sb_agblklog;
783 432250 : to->sb_rextslog = from->sb_rextslog;
784 432250 : to->sb_inprogress = from->sb_inprogress;
785 432250 : to->sb_imax_pct = from->sb_imax_pct;
786 432250 : to->sb_icount = cpu_to_be64(from->sb_icount);
787 432250 : to->sb_ifree = cpu_to_be64(from->sb_ifree);
788 432250 : to->sb_fdblocks = cpu_to_be64(from->sb_fdblocks);
789 432250 : to->sb_frextents = cpu_to_be64(from->sb_frextents);
790 :
791 432250 : to->sb_flags = from->sb_flags;
792 432250 : to->sb_shared_vn = from->sb_shared_vn;
793 432250 : to->sb_inoalignmt = cpu_to_be32(from->sb_inoalignmt);
794 432250 : to->sb_unit = cpu_to_be32(from->sb_unit);
795 432250 : to->sb_width = cpu_to_be32(from->sb_width);
796 432250 : to->sb_dirblklog = from->sb_dirblklog;
797 432250 : to->sb_logsectlog = from->sb_logsectlog;
798 432250 : to->sb_logsectsize = cpu_to_be16(from->sb_logsectsize);
799 432250 : to->sb_logsunit = cpu_to_be32(from->sb_logsunit);
800 :
801 : /*
802 : * We need to ensure that bad_features2 always matches features2.
803 : * Hence we enforce that here rather than having to remember to do it
804 : * everywhere else that updates features2.
805 : */
806 432250 : from->sb_bad_features2 = from->sb_features2;
807 432250 : to->sb_features2 = cpu_to_be32(from->sb_features2);
808 432250 : to->sb_bad_features2 = cpu_to_be32(from->sb_bad_features2);
809 :
810 432250 : if (!xfs_sb_is_v5(from))
811 : return;
812 :
813 427575 : to->sb_features_compat = cpu_to_be32(from->sb_features_compat);
814 855150 : to->sb_features_ro_compat =
815 427575 : cpu_to_be32(from->sb_features_ro_compat);
816 855150 : to->sb_features_incompat =
817 427575 : cpu_to_be32(from->sb_features_incompat);
818 855150 : to->sb_features_log_incompat =
819 427575 : cpu_to_be32(from->sb_features_log_incompat);
820 427575 : to->sb_spino_align = cpu_to_be32(from->sb_spino_align);
821 427575 : to->sb_lsn = cpu_to_be64(from->sb_lsn);
822 427575 : if (from->sb_features_incompat & XFS_SB_FEAT_INCOMPAT_META_UUID)
823 30 : uuid_copy(&to->sb_meta_uuid, &from->sb_meta_uuid);
824 : }
825 :
826 : /*
827 : * If the superblock has the CRC feature bit set or the CRC field is non-null,
828 : * check that the CRC is valid. We check the CRC field is non-null because a
829 : * single bit error could clear the feature bit and unused parts of the
830 : * superblock are supposed to be zero. Hence a non-null crc field indicates that
831 : * we've potentially lost a feature bit and we should check it anyway.
832 : *
833 : * However, past bugs (i.e. in growfs) left non-zeroed regions beyond the
834 : * last field in V4 secondary superblocks. So for secondary superblocks,
835 : * we are more forgiving, and ignore CRC failures if the primary doesn't
836 : * indicate that the fs version is V5.
837 : */
838 : static void
839 463558 : xfs_sb_read_verify(
840 : struct xfs_buf *bp)
841 : {
842 463558 : struct xfs_sb sb;
843 463558 : struct xfs_mount *mp = bp->b_mount;
844 463558 : struct xfs_dsb *dsb = bp->b_addr;
845 463558 : int error;
846 :
847 : /*
848 : * open code the version check to avoid needing to convert the entire
849 : * superblock from disk order just to check the version number
850 : */
851 463558 : if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC) &&
852 463556 : (((be16_to_cpu(dsb->sb_versionnum) & XFS_SB_VERSION_NUMBITS) ==
853 54 : XFS_SB_VERSION_5) ||
854 54 : dsb->sb_crc != 0)) {
855 :
856 463502 : if (!xfs_buf_verify_cksum(bp, XFS_SB_CRC_OFF)) {
857 : /* Only fail bad secondaries on a known V5 filesystem */
858 4 : if (xfs_buf_daddr(bp) == XFS_SB_DADDR ||
859 : xfs_has_crc(mp)) {
860 4 : error = -EFSBADCRC;
861 4 : goto out_error;
862 : }
863 : }
864 : }
865 :
866 : /*
867 : * Check all the superblock fields. Don't byteswap the xquota flags
868 : * because _verify_common checks the on-disk values.
869 : */
870 463554 : __xfs_sb_from_disk(&sb, dsb, false);
871 463553 : error = xfs_validate_sb_common(mp, bp, &sb);
872 463554 : if (error)
873 10 : goto out_error;
874 463544 : error = xfs_validate_sb_read(mp, &sb);
875 :
876 463558 : out_error:
877 463558 : if (error == -EFSCORRUPTED || error == -EFSBADCRC)
878 8 : xfs_verifier_error(bp, error, __this_address);
879 463550 : else if (error)
880 8 : xfs_buf_ioerror(bp, error);
881 463558 : }
882 :
883 : /*
884 : * We may be probed for a filesystem match, so we may not want to emit
885 : * messages when the superblock buffer is not actually an XFS superblock.
886 : * If we find an XFS superblock, then run a normal, noisy mount because we are
887 : * really going to mount it and want to know about errors.
888 : */
889 : static void
890 0 : xfs_sb_quiet_read_verify(
891 : struct xfs_buf *bp)
892 : {
893 0 : struct xfs_dsb *dsb = bp->b_addr;
894 :
895 0 : if (dsb->sb_magicnum == cpu_to_be32(XFS_SB_MAGIC)) {
896 : /* XFS filesystem, verify noisily! */
897 0 : xfs_sb_read_verify(bp);
898 0 : return;
899 : }
900 : /* quietly fail */
901 0 : xfs_buf_ioerror(bp, -EWRONGFS);
902 : }
903 :
904 : static void
905 196030 : xfs_sb_write_verify(
906 : struct xfs_buf *bp)
907 : {
908 196030 : struct xfs_sb sb;
909 196030 : struct xfs_mount *mp = bp->b_mount;
910 196030 : struct xfs_buf_log_item *bip = bp->b_log_item;
911 196030 : struct xfs_dsb *dsb = bp->b_addr;
912 196030 : int error;
913 :
914 : /*
915 : * Check all the superblock fields. Don't byteswap the xquota flags
916 : * because _verify_common checks the on-disk values.
917 : */
918 196030 : __xfs_sb_from_disk(&sb, dsb, false);
919 196030 : error = xfs_validate_sb_common(mp, bp, &sb);
920 196030 : if (error)
921 0 : goto out_error;
922 196030 : error = xfs_validate_sb_write(mp, bp, &sb);
923 196030 : if (error)
924 4 : goto out_error;
925 :
926 196026 : if (!xfs_sb_is_v5(&sb))
927 196026 : return;
928 :
929 191368 : if (bip)
930 179785 : dsb->sb_lsn = cpu_to_be64(bip->bli_item.li_lsn);
931 :
932 191368 : xfs_buf_update_cksum(bp, XFS_SB_CRC_OFF);
933 : return;
934 :
935 4 : out_error:
936 4 : xfs_verifier_error(bp, error, __this_address);
937 : }
938 :
939 : const struct xfs_buf_ops xfs_sb_buf_ops = {
940 : .name = "xfs_sb",
941 : .magic = { cpu_to_be32(XFS_SB_MAGIC), cpu_to_be32(XFS_SB_MAGIC) },
942 : .verify_read = xfs_sb_read_verify,
943 : .verify_write = xfs_sb_write_verify,
944 : };
945 :
946 : const struct xfs_buf_ops xfs_sb_quiet_buf_ops = {
947 : .name = "xfs_sb_quiet",
948 : .magic = { cpu_to_be32(XFS_SB_MAGIC), cpu_to_be32(XFS_SB_MAGIC) },
949 : .verify_read = xfs_sb_quiet_read_verify,
950 : .verify_write = xfs_sb_write_verify,
951 : };
952 :
953 : /*
954 : * xfs_mount_common
955 : *
956 : * Mount initialization code establishing various mount
957 : * fields from the superblock associated with the given
958 : * mount structure.
959 : *
960 : * Inode geometry are calculated in xfs_ialloc_setup_geometry.
961 : */
962 : void
963 22501 : xfs_sb_mount_common(
964 : struct xfs_mount *mp,
965 : struct xfs_sb *sbp)
966 : {
967 22501 : mp->m_agfrotor = 0;
968 22501 : atomic_set(&mp->m_agirotor, 0);
969 22501 : mp->m_maxagi = mp->m_sb.sb_agcount;
970 22501 : mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG;
971 22501 : mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
972 22501 : mp->m_sectbb_log = sbp->sb_sectlog - BBSHIFT;
973 22501 : mp->m_agno_log = xfs_highbit32(sbp->sb_agcount - 1) + 1;
974 22501 : mp->m_blockmask = sbp->sb_blocksize - 1;
975 22501 : mp->m_blockwsize = sbp->sb_blocksize >> XFS_WORDLOG;
976 22501 : mp->m_blockwmask = mp->m_blockwsize - 1;
977 :
978 22501 : mp->m_alloc_mxr[0] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 1);
979 22501 : mp->m_alloc_mxr[1] = xfs_allocbt_maxrecs(mp, sbp->sb_blocksize, 0);
980 22501 : mp->m_alloc_mnr[0] = mp->m_alloc_mxr[0] / 2;
981 22501 : mp->m_alloc_mnr[1] = mp->m_alloc_mxr[1] / 2;
982 :
983 22501 : mp->m_bmap_dmxr[0] = xfs_bmbt_maxrecs(mp, sbp->sb_blocksize, 1);
984 22501 : mp->m_bmap_dmxr[1] = xfs_bmbt_maxrecs(mp, sbp->sb_blocksize, 0);
985 22501 : mp->m_bmap_dmnr[0] = mp->m_bmap_dmxr[0] / 2;
986 22501 : mp->m_bmap_dmnr[1] = mp->m_bmap_dmxr[1] / 2;
987 :
988 22501 : mp->m_rmap_mxr[0] = xfs_rmapbt_maxrecs(sbp->sb_blocksize, 1);
989 22501 : mp->m_rmap_mxr[1] = xfs_rmapbt_maxrecs(sbp->sb_blocksize, 0);
990 22501 : mp->m_rmap_mnr[0] = mp->m_rmap_mxr[0] / 2;
991 22501 : mp->m_rmap_mnr[1] = mp->m_rmap_mxr[1] / 2;
992 :
993 22501 : mp->m_refc_mxr[0] = xfs_refcountbt_maxrecs(sbp->sb_blocksize, true);
994 22501 : mp->m_refc_mxr[1] = xfs_refcountbt_maxrecs(sbp->sb_blocksize, false);
995 22501 : mp->m_refc_mnr[0] = mp->m_refc_mxr[0] / 2;
996 22501 : mp->m_refc_mnr[1] = mp->m_refc_mxr[1] / 2;
997 :
998 22501 : mp->m_bsize = XFS_FSB_TO_BB(mp, 1);
999 22501 : mp->m_alloc_set_aside = xfs_alloc_set_aside(mp);
1000 22501 : mp->m_ag_max_usable = xfs_alloc_ag_max_usable(mp);
1001 22501 : }
1002 :
1003 : /*
1004 : * xfs_log_sb() can be used to copy arbitrary changes to the in-core superblock
1005 : * into the superblock buffer to be logged. It does not provide the higher
1006 : * level of locking that is needed to protect the in-core superblock from
1007 : * concurrent access.
1008 : */
1009 : void
1010 126709 : xfs_log_sb(
1011 : struct xfs_trans *tp)
1012 : {
1013 126709 : struct xfs_mount *mp = tp->t_mountp;
1014 126709 : struct xfs_buf *bp = xfs_trans_getsb(tp);
1015 :
1016 : /*
1017 : * Lazy sb counters don't update the in-core superblock so do that now.
1018 : * If this is at unmount, the counters will be exactly correct, but at
1019 : * any other time they will only be ballpark correct because of
1020 : * reservations that have been taken out percpu counters. If we have an
1021 : * unclean shutdown, this will be corrected by log recovery rebuilding
1022 : * the counters from the AGF block counts.
1023 : *
1024 : * Do not update sb_frextents here because it is not part of the lazy
1025 : * sb counters, despite having a percpu counter. It is always kept
1026 : * consistent with the ondisk rtbitmap by xfs_trans_apply_sb_deltas()
1027 : * and hence we don't need have to update it here.
1028 : */
1029 126709 : if (xfs_has_lazysbcount(mp)) {
1030 126687 : mp->m_sb.sb_icount = percpu_counter_sum(&mp->m_icount);
1031 126687 : mp->m_sb.sb_ifree = min_t(uint64_t,
1032 : percpu_counter_sum(&mp->m_ifree),
1033 : mp->m_sb.sb_icount);
1034 126687 : mp->m_sb.sb_fdblocks = percpu_counter_sum(&mp->m_fdblocks);
1035 : }
1036 :
1037 126709 : xfs_sb_to_disk(bp->b_addr, &mp->m_sb);
1038 126709 : xfs_trans_buf_set_type(tp, bp, XFS_BLFT_SB_BUF);
1039 126709 : xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsb) - 1);
1040 126709 : }
1041 :
1042 : /*
1043 : * xfs_sync_sb
1044 : *
1045 : * Sync the superblock to disk.
1046 : *
1047 : * Note that the caller is responsible for checking the frozen state of the
1048 : * filesystem. This procedure uses the non-blocking transaction allocator and
1049 : * thus will allow modifications to a frozen fs. This is required because this
1050 : * code can be called during the process of freezing where use of the high-level
1051 : * allocator would deadlock.
1052 : */
1053 : int
1054 118056 : xfs_sync_sb(
1055 : struct xfs_mount *mp,
1056 : bool wait)
1057 : {
1058 118056 : struct xfs_trans *tp;
1059 118056 : int error;
1060 :
1061 118056 : error = xfs_trans_alloc(mp, &M_RES(mp)->tr_sb, 0, 0,
1062 : XFS_TRANS_NO_WRITECOUNT, &tp);
1063 118056 : if (error)
1064 : return error;
1065 :
1066 118056 : xfs_log_sb(tp);
1067 118056 : if (wait)
1068 114889 : xfs_trans_set_sync(tp);
1069 118056 : return xfs_trans_commit(tp);
1070 : }
1071 :
1072 : /*
1073 : * Update all the secondary superblocks to match the new state of the primary.
1074 : * Because we are completely overwriting all the existing fields in the
1075 : * secondary superblock buffers, there is no need to read them in from disk.
1076 : * Just get a new buffer, stamp it and write it.
1077 : *
1078 : * The sb buffers need to be cached here so that we serialise against other
1079 : * operations that access the secondary superblocks, but we don't want to keep
1080 : * them in memory once it is written so we mark it as a one-shot buffer.
1081 : */
1082 : int
1083 175 : xfs_update_secondary_sbs(
1084 : struct xfs_mount *mp)
1085 : {
1086 175 : struct xfs_perag *pag;
1087 175 : xfs_agnumber_t agno = 1;
1088 175 : int saved_error = 0;
1089 175 : int error = 0;
1090 175 : LIST_HEAD (buffer_list);
1091 :
1092 : /* update secondary superblocks. */
1093 8590 : for_each_perag_from(mp, agno, pag) {
1094 8415 : struct xfs_buf *bp;
1095 :
1096 16830 : error = xfs_buf_get(mp->m_ddev_targp,
1097 8415 : XFS_AG_DADDR(mp, pag->pag_agno, XFS_SB_DADDR),
1098 8415 : XFS_FSS_TO_BB(mp, 1), &bp);
1099 : /*
1100 : * If we get an error reading or writing alternate superblocks,
1101 : * continue. xfs_repair chooses the "best" superblock based
1102 : * on most matches; if we break early, we'll leave more
1103 : * superblocks un-updated than updated, and xfs_repair may
1104 : * pick them over the properly-updated primary.
1105 : */
1106 8415 : if (error) {
1107 0 : xfs_warn(mp,
1108 : "error allocating secondary superblock for ag %d",
1109 : pag->pag_agno);
1110 0 : if (!saved_error)
1111 0 : saved_error = error;
1112 7939 : continue;
1113 : }
1114 :
1115 8415 : bp->b_ops = &xfs_sb_buf_ops;
1116 8415 : xfs_buf_oneshot(bp);
1117 8415 : xfs_buf_zero(bp, 0, BBTOB(bp->b_length));
1118 8415 : xfs_sb_to_disk(bp->b_addr, &mp->m_sb);
1119 8415 : xfs_buf_delwri_queue(bp, &buffer_list);
1120 8415 : xfs_buf_relse(bp);
1121 :
1122 : /* don't hold too many buffers at once */
1123 8415 : if (agno % 16)
1124 7939 : continue;
1125 :
1126 476 : error = xfs_buf_delwri_submit(&buffer_list);
1127 476 : if (error) {
1128 0 : xfs_warn(mp,
1129 : "write error %d updating a secondary superblock near ag %d",
1130 : error, pag->pag_agno);
1131 0 : if (!saved_error)
1132 0 : saved_error = error;
1133 0 : continue;
1134 : }
1135 : }
1136 175 : error = xfs_buf_delwri_submit(&buffer_list);
1137 175 : if (error) {
1138 0 : xfs_warn(mp,
1139 : "write error %d updating a secondary superblock near ag %d",
1140 : error, agno);
1141 : }
1142 :
1143 175 : return saved_error ? saved_error : error;
1144 : }
1145 :
1146 : /*
1147 : * Same behavior as xfs_sync_sb, except that it is always synchronous and it
1148 : * also writes the superblock buffer to disk sector 0 immediately.
1149 : */
1150 : int
1151 52 : xfs_sync_sb_buf(
1152 : struct xfs_mount *mp)
1153 : {
1154 52 : struct xfs_trans *tp;
1155 52 : struct xfs_buf *bp;
1156 52 : int error;
1157 :
1158 52 : error = xfs_trans_alloc(mp, &M_RES(mp)->tr_sb, 0, 0, 0, &tp);
1159 52 : if (error)
1160 : return error;
1161 :
1162 52 : bp = xfs_trans_getsb(tp);
1163 52 : xfs_log_sb(tp);
1164 52 : xfs_trans_bhold(tp, bp);
1165 52 : xfs_trans_set_sync(tp);
1166 52 : error = xfs_trans_commit(tp);
1167 52 : if (error)
1168 0 : goto out;
1169 : /*
1170 : * write out the sb buffer to get the changes to disk
1171 : */
1172 52 : error = xfs_bwrite(bp);
1173 52 : out:
1174 52 : xfs_buf_relse(bp);
1175 52 : return error;
1176 : }
1177 :
1178 : void
1179 1904048 : xfs_fs_geometry(
1180 : struct xfs_mount *mp,
1181 : struct xfs_fsop_geom *geo,
1182 : int struct_version)
1183 : {
1184 1904048 : struct xfs_sb *sbp = &mp->m_sb;
1185 :
1186 1904048 : memset(geo, 0, sizeof(struct xfs_fsop_geom));
1187 :
1188 1904048 : geo->blocksize = sbp->sb_blocksize;
1189 1904048 : geo->rtextsize = sbp->sb_rextsize;
1190 1904048 : geo->agblocks = sbp->sb_agblocks;
1191 1904048 : geo->agcount = sbp->sb_agcount;
1192 1904048 : geo->logblocks = sbp->sb_logblocks;
1193 1904048 : geo->sectsize = sbp->sb_sectsize;
1194 1904048 : geo->inodesize = sbp->sb_inodesize;
1195 1904048 : geo->imaxpct = sbp->sb_imax_pct;
1196 1904048 : geo->datablocks = sbp->sb_dblocks;
1197 1904048 : geo->rtblocks = sbp->sb_rblocks;
1198 1904048 : geo->rtextents = sbp->sb_rextents;
1199 1904048 : geo->logstart = sbp->sb_logstart;
1200 1904048 : BUILD_BUG_ON(sizeof(geo->uuid) != sizeof(sbp->sb_uuid));
1201 3808096 : memcpy(geo->uuid, &sbp->sb_uuid, sizeof(sbp->sb_uuid));
1202 :
1203 1904048 : if (struct_version < 2)
1204 : return;
1205 :
1206 1904048 : geo->sunit = sbp->sb_unit;
1207 1904048 : geo->swidth = sbp->sb_width;
1208 :
1209 1904048 : if (struct_version < 3)
1210 : return;
1211 :
1212 1904048 : geo->version = XFS_FSOP_GEOM_VERSION;
1213 1904048 : geo->flags = XFS_FSOP_GEOM_FLAGS_NLINK |
1214 : XFS_FSOP_GEOM_FLAGS_DIRV2 |
1215 : XFS_FSOP_GEOM_FLAGS_EXTFLG;
1216 1904048 : if (xfs_has_attr(mp))
1217 939353 : geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR;
1218 1904048 : if (xfs_has_quota(mp))
1219 1589627 : geo->flags |= XFS_FSOP_GEOM_FLAGS_QUOTA;
1220 1904048 : if (xfs_has_align(mp))
1221 1904677 : geo->flags |= XFS_FSOP_GEOM_FLAGS_IALIGN;
1222 1904048 : if (xfs_has_dalign(mp))
1223 596 : geo->flags |= XFS_FSOP_GEOM_FLAGS_DALIGN;
1224 1904048 : if (xfs_has_asciici(mp))
1225 52 : geo->flags |= XFS_FSOP_GEOM_FLAGS_DIRV2CI;
1226 1904048 : if (xfs_has_lazysbcount(mp))
1227 1904225 : geo->flags |= XFS_FSOP_GEOM_FLAGS_LAZYSB;
1228 1904048 : if (xfs_has_attr2(mp))
1229 1904240 : geo->flags |= XFS_FSOP_GEOM_FLAGS_ATTR2;
1230 1904048 : if (xfs_has_projid32(mp))
1231 1904221 : geo->flags |= XFS_FSOP_GEOM_FLAGS_PROJID32;
1232 1904048 : if (xfs_has_crc(mp))
1233 1904190 : geo->flags |= XFS_FSOP_GEOM_FLAGS_V5SB;
1234 1904048 : if (xfs_has_ftype(mp))
1235 1904299 : geo->flags |= XFS_FSOP_GEOM_FLAGS_FTYPE;
1236 1904048 : if (xfs_has_finobt(mp))
1237 1904276 : geo->flags |= XFS_FSOP_GEOM_FLAGS_FINOBT;
1238 1904048 : if (xfs_has_sparseinodes(mp))
1239 1903964 : geo->flags |= XFS_FSOP_GEOM_FLAGS_SPINODES;
1240 1904048 : if (xfs_has_rmapbt(mp))
1241 1602306 : geo->flags |= XFS_FSOP_GEOM_FLAGS_RMAPBT;
1242 1904048 : if (xfs_has_reflink(mp))
1243 1602451 : geo->flags |= XFS_FSOP_GEOM_FLAGS_REFLINK;
1244 1904048 : if (xfs_has_bigtime(mp))
1245 1904454 : geo->flags |= XFS_FSOP_GEOM_FLAGS_BIGTIME;
1246 1904048 : if (xfs_has_inobtcounts(mp))
1247 1904457 : geo->flags |= XFS_FSOP_GEOM_FLAGS_INOBTCNT;
1248 1904048 : if (xfs_has_sector(mp)) {
1249 1895076 : geo->flags |= XFS_FSOP_GEOM_FLAGS_SECTOR;
1250 1895076 : geo->logsectsize = sbp->sb_logsectsize;
1251 : } else {
1252 8972 : geo->logsectsize = BBSIZE;
1253 : }
1254 1904048 : if (xfs_has_large_extent_counts(mp))
1255 1903043 : geo->flags |= XFS_FSOP_GEOM_FLAGS_NREXT64;
1256 1904048 : geo->rtsectsize = sbp->sb_blocksize;
1257 1904048 : geo->dirblocksize = xfs_dir2_dirblock_bytes(sbp);
1258 :
1259 1902190 : if (struct_version < 4)
1260 : return;
1261 :
1262 1902046 : if (xfs_has_logv2(mp))
1263 1902298 : geo->flags |= XFS_FSOP_GEOM_FLAGS_LOGV2;
1264 :
1265 1902046 : geo->logsunit = sbp->sb_logsunit;
1266 :
1267 1902046 : if (struct_version < 5)
1268 : return;
1269 :
1270 1902046 : geo->version = XFS_FSOP_GEOM_VERSION_V5;
1271 : }
1272 :
1273 : /* Read a secondary superblock. */
1274 : int
1275 1071471 : xfs_sb_read_secondary(
1276 : struct xfs_mount *mp,
1277 : struct xfs_trans *tp,
1278 : xfs_agnumber_t agno,
1279 : struct xfs_buf **bpp)
1280 : {
1281 1071471 : struct xfs_buf *bp;
1282 1071471 : int error;
1283 :
1284 1071471 : ASSERT(agno != 0 && agno != NULLAGNUMBER);
1285 3214413 : error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp,
1286 1071471 : XFS_AG_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
1287 1071471 : XFS_FSS_TO_BB(mp, 1), 0, &bp, &xfs_sb_buf_ops);
1288 1071483 : if (error)
1289 : return error;
1290 1071481 : xfs_buf_set_ref(bp, XFS_SSB_REF);
1291 1071436 : *bpp = bp;
1292 1071436 : return 0;
1293 : }
1294 :
1295 : /* Get an uninitialised secondary superblock buffer. */
1296 : int
1297 289377 : xfs_sb_get_secondary(
1298 : struct xfs_mount *mp,
1299 : struct xfs_trans *tp,
1300 : xfs_agnumber_t agno,
1301 : struct xfs_buf **bpp)
1302 : {
1303 289377 : struct xfs_buf *bp;
1304 289377 : int error;
1305 :
1306 289377 : ASSERT(agno != 0 && agno != NULLAGNUMBER);
1307 868131 : error = xfs_trans_get_buf(tp, mp->m_ddev_targp,
1308 289377 : XFS_AG_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
1309 289377 : XFS_FSS_TO_BB(mp, 1), 0, &bp);
1310 289361 : if (error)
1311 : return error;
1312 289361 : bp->b_ops = &xfs_sb_buf_ops;
1313 289361 : xfs_buf_oneshot(bp);
1314 289361 : *bpp = bp;
1315 289361 : return 0;
1316 : }
1317 :
1318 : /*
1319 : * sunit, swidth, sectorsize(optional with 0) should be all in bytes,
1320 : * so users won't be confused by values in error messages.
1321 : */
1322 : bool
1323 659574 : xfs_validate_stripe_geometry(
1324 : struct xfs_mount *mp,
1325 : __s64 sunit,
1326 : __s64 swidth,
1327 : int sectorsize,
1328 : bool silent)
1329 : {
1330 659574 : if (swidth > INT_MAX) {
1331 0 : if (!silent)
1332 0 : xfs_notice(mp,
1333 : "stripe width (%lld) is too large", swidth);
1334 0 : return false;
1335 : }
1336 :
1337 659574 : if (sunit > swidth) {
1338 0 : if (!silent)
1339 0 : xfs_notice(mp,
1340 : "stripe unit (%lld) is larger than the stripe width (%lld)", sunit, swidth);
1341 0 : return false;
1342 : }
1343 :
1344 659574 : if (sectorsize && (int)sunit % sectorsize) {
1345 0 : if (!silent)
1346 0 : xfs_notice(mp,
1347 : "stripe unit (%lld) must be a multiple of the sector size (%d)",
1348 : sunit, sectorsize);
1349 0 : return false;
1350 : }
1351 :
1352 659574 : if (sunit && !swidth) {
1353 0 : if (!silent)
1354 0 : xfs_notice(mp,
1355 : "invalid stripe unit (%lld) and stripe width of 0", sunit);
1356 0 : return false;
1357 : }
1358 :
1359 659574 : if (!sunit && swidth) {
1360 0 : if (!silent)
1361 0 : xfs_notice(mp,
1362 : "invalid stripe width (%lld) and stripe unit of 0", swidth);
1363 0 : return false;
1364 : }
1365 :
1366 659574 : if (sunit && (int)swidth % (int)sunit) {
1367 0 : if (!silent)
1368 0 : xfs_notice(mp,
1369 : "stripe width (%lld) must be a multiple of the stripe unit (%lld)",
1370 : swidth, sunit);
1371 0 : return false;
1372 : }
1373 : return true;
1374 : }
|