···213STATIC int214xfs_mount_validate_sb(215 xfs_mount_t *mp,216- xfs_sb_t *sbp)0217{218 /*219 * If the log device and data device have the···224 * a volume filesystem in a non-volume manner.225 */226 if (sbp->sb_magicnum != XFS_SB_MAGIC) {227- cmn_err(CE_WARN, "XFS: bad magic number");228 return XFS_ERROR(EWRONGFS);229 }230231 if (!XFS_SB_GOOD_VERSION(sbp)) {232- cmn_err(CE_WARN, "XFS: bad version");233 return XFS_ERROR(EWRONGFS);234 }235236 if (unlikely(237 sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) {238- cmn_err(CE_WARN,239- "XFS: filesystem is marked as having an external log; "240- "specify logdev on the\nmount command line.");241- XFS_CORRUPTION_ERROR("xfs_mount_validate_sb(1)",242- XFS_ERRLEVEL_HIGH, mp, sbp);243- return XFS_ERROR(EFSCORRUPTED);244 }245246 if (unlikely(247 sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) {248- cmn_err(CE_WARN,249- "XFS: filesystem is marked as having an internal log; "250- "don't specify logdev on\nthe mount command line.");251- XFS_CORRUPTION_ERROR("xfs_mount_validate_sb(2)",252- XFS_ERRLEVEL_HIGH, mp, sbp);253- return XFS_ERROR(EFSCORRUPTED);254 }255256 /*···271 (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) ||272 (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) ||273 (sbp->sb_imax_pct > 100 || sbp->sb_imax_pct < 1))) {274- cmn_err(CE_WARN, "XFS: SB sanity check 1 failed");275- XFS_CORRUPTION_ERROR("xfs_mount_validate_sb(3)",276- XFS_ERRLEVEL_LOW, mp, sbp);277 return XFS_ERROR(EFSCORRUPTED);278 }279···284 (xfs_drfsbno_t)sbp->sb_agcount * sbp->sb_agblocks ||285 sbp->sb_dblocks < (xfs_drfsbno_t)(sbp->sb_agcount - 1) *286 sbp->sb_agblocks + XFS_MIN_AG_BLOCKS)) {287- cmn_err(CE_WARN, "XFS: SB sanity check 2 failed");288- XFS_ERROR_REPORT("xfs_mount_validate_sb(4)",289- XFS_ERRLEVEL_LOW, mp);290 return XFS_ERROR(EFSCORRUPTED);291 }292···300 (sbp->sb_dblocks << (sbp->sb_blocklog - BBSHIFT)) > UINT_MAX ||301 (sbp->sb_rblocks << (sbp->sb_blocklog - BBSHIFT)) > UINT_MAX)) {302#endif303- cmn_err(CE_WARN,304- "XFS: File system is too large to be mounted on this system.");305 return XFS_ERROR(E2BIG);306 }307308 if (unlikely(sbp->sb_inprogress)) {309- cmn_err(CE_WARN, "XFS: file system busy");310- XFS_ERROR_REPORT("xfs_mount_validate_sb(5)",311- XFS_ERRLEVEL_LOW, mp);312 return XFS_ERROR(EFSCORRUPTED);313 }314···314 * Version 1 directory format has never worked on Linux.315 */316 if (unlikely(!XFS_SB_VERSION_HASDIRV2(sbp))) {317- cmn_err(CE_WARN,318- "XFS: Attempted to mount file system using version 1 directory format");319 return XFS_ERROR(ENOSYS);320 }321···323 * Until this is fixed only page-sized or smaller data blocks work.324 */325 if (unlikely(sbp->sb_blocksize > PAGE_SIZE)) {326- cmn_err(CE_WARN,327- "XFS: Attempted to mount file system with blocksize %d bytes",328 sbp->sb_blocksize);329- cmn_err(CE_WARN,330- "XFS: Only page-sized (%ld) or less blocksizes currently work.",331 PAGE_SIZE);332 return XFS_ERROR(ENOSYS);333 }···475 * Does the initial read of the superblock.476 */477int478-xfs_readsb(xfs_mount_t *mp)479{480 unsigned int sector_size;481 unsigned int extra_flags;···497 bp = xfs_buf_read_flags(mp->m_ddev_targp, XFS_SB_DADDR,498 BTOBB(sector_size), extra_flags);499 if (!bp || XFS_BUF_ISERROR(bp)) {500- cmn_err(CE_WARN, "XFS: SB read failed");501 error = bp ? XFS_BUF_GETERROR(bp) : ENOMEM;502 goto fail;503 }···511 sbp = XFS_BUF_TO_SBP(bp);512 xfs_xlatesb(XFS_BUF_PTR(bp), &(mp->m_sb), 1, XFS_SB_ALL_BITS);513514- error = xfs_mount_validate_sb(mp, &(mp->m_sb));515 if (error) {516- cmn_err(CE_WARN, "XFS: SB validate failed");517 goto fail;518 }519···521 * We must be able to do sector-sized and sector-aligned IO.522 */523 if (sector_size > mp->m_sb.sb_sectsize) {524- cmn_err(CE_WARN,525- "XFS: device supports only %u byte sectors (not %u)",526 sector_size, mp->m_sb.sb_sectsize);527 error = ENOSYS;528 goto fail;···539 bp = xfs_buf_read_flags(mp->m_ddev_targp, XFS_SB_DADDR,540 BTOBB(sector_size), extra_flags);541 if (!bp || XFS_BUF_ISERROR(bp)) {542- cmn_err(CE_WARN, "XFS: SB re-read failed");543 error = bp ? XFS_BUF_GETERROR(bp) : ENOMEM;544 goto fail;545 }···669 int error = 0;670671 if (mp->m_sb_bp == NULL) {672- if ((error = xfs_readsb(mp))) {673 return error;674 }675 }
···213STATIC int214xfs_mount_validate_sb(215 xfs_mount_t *mp,216+ xfs_sb_t *sbp,217+ int flags)218{219 /*220 * If the log device and data device have the···223 * a volume filesystem in a non-volume manner.224 */225 if (sbp->sb_magicnum != XFS_SB_MAGIC) {226+ xfs_fs_mount_cmn_err(flags, "bad magic number");227 return XFS_ERROR(EWRONGFS);228 }229230 if (!XFS_SB_GOOD_VERSION(sbp)) {231+ xfs_fs_mount_cmn_err(flags, "bad version");232 return XFS_ERROR(EWRONGFS);233 }234235 if (unlikely(236 sbp->sb_logstart == 0 && mp->m_logdev_targp == mp->m_ddev_targp)) {237+ xfs_fs_mount_cmn_err(flags,238+ "filesystem is marked as having an external log; "239+ "specify logdev on the\nmount command line.");240+ return XFS_ERROR(EINVAL);00241 }242243 if (unlikely(244 sbp->sb_logstart != 0 && mp->m_logdev_targp != mp->m_ddev_targp)) {245+ xfs_fs_mount_cmn_err(flags,246+ "filesystem is marked as having an internal log; "247+ "do not specify logdev on\nthe mount command line.");248+ return XFS_ERROR(EINVAL);00249 }250251 /*···274 (sbp->sb_rextsize * sbp->sb_blocksize > XFS_MAX_RTEXTSIZE) ||275 (sbp->sb_rextsize * sbp->sb_blocksize < XFS_MIN_RTEXTSIZE) ||276 (sbp->sb_imax_pct > 100 || sbp->sb_imax_pct < 1))) {277+ xfs_fs_mount_cmn_err(flags, "SB sanity check 1 failed");00278 return XFS_ERROR(EFSCORRUPTED);279 }280···289 (xfs_drfsbno_t)sbp->sb_agcount * sbp->sb_agblocks ||290 sbp->sb_dblocks < (xfs_drfsbno_t)(sbp->sb_agcount - 1) *291 sbp->sb_agblocks + XFS_MIN_AG_BLOCKS)) {292+ xfs_fs_mount_cmn_err(flags, "SB sanity check 2 failed");00293 return XFS_ERROR(EFSCORRUPTED);294 }295···307 (sbp->sb_dblocks << (sbp->sb_blocklog - BBSHIFT)) > UINT_MAX ||308 (sbp->sb_rblocks << (sbp->sb_blocklog - BBSHIFT)) > UINT_MAX)) {309#endif310+ xfs_fs_mount_cmn_err(flags,311+ "file system too large to be mounted on this system.");312 return XFS_ERROR(E2BIG);313 }314315 if (unlikely(sbp->sb_inprogress)) {316+ xfs_fs_mount_cmn_err(flags, "file system busy");00317 return XFS_ERROR(EFSCORRUPTED);318 }319···323 * Version 1 directory format has never worked on Linux.324 */325 if (unlikely(!XFS_SB_VERSION_HASDIRV2(sbp))) {326+ xfs_fs_mount_cmn_err(flags,327+ "file system using version 1 directory format");328 return XFS_ERROR(ENOSYS);329 }330···332 * Until this is fixed only page-sized or smaller data blocks work.333 */334 if (unlikely(sbp->sb_blocksize > PAGE_SIZE)) {335+ xfs_fs_mount_cmn_err(flags,336+ "file system with blocksize %d bytes",337 sbp->sb_blocksize);338+ xfs_fs_mount_cmn_err(flags,339+ "only pagesize (%ld) or less will currently work.",340 PAGE_SIZE);341 return XFS_ERROR(ENOSYS);342 }···484 * Does the initial read of the superblock.485 */486int487+xfs_readsb(xfs_mount_t *mp, int flags)488{489 unsigned int sector_size;490 unsigned int extra_flags;···506 bp = xfs_buf_read_flags(mp->m_ddev_targp, XFS_SB_DADDR,507 BTOBB(sector_size), extra_flags);508 if (!bp || XFS_BUF_ISERROR(bp)) {509+ xfs_fs_mount_cmn_err(flags, "SB read failed");510 error = bp ? XFS_BUF_GETERROR(bp) : ENOMEM;511 goto fail;512 }···520 sbp = XFS_BUF_TO_SBP(bp);521 xfs_xlatesb(XFS_BUF_PTR(bp), &(mp->m_sb), 1, XFS_SB_ALL_BITS);522523+ error = xfs_mount_validate_sb(mp, &(mp->m_sb), flags);524 if (error) {525+ xfs_fs_mount_cmn_err(flags, "SB validate failed");526 goto fail;527 }528···530 * We must be able to do sector-sized and sector-aligned IO.531 */532 if (sector_size > mp->m_sb.sb_sectsize) {533+ xfs_fs_mount_cmn_err(flags,534+ "device supports only %u byte sectors (not %u)",535 sector_size, mp->m_sb.sb_sectsize);536 error = ENOSYS;537 goto fail;···548 bp = xfs_buf_read_flags(mp->m_ddev_targp, XFS_SB_DADDR,549 BTOBB(sector_size), extra_flags);550 if (!bp || XFS_BUF_ISERROR(bp)) {551+ xfs_fs_mount_cmn_err(flags, "SB re-read failed");552 error = bp ? XFS_BUF_GETERROR(bp) : ENOMEM;553 goto fail;554 }···678 int error = 0;679680 if (mp->m_sb_bp == NULL) {681+ if ((error = xfs_readsb(mp, mfsi_flags))) {682 return error;683 }684 }
+4-1
fs/xfs/xfs_mount.h
···510 */511#define XFS_MFSI_SECOND 0x01 /* Secondary mount -- skip stuff */512#define XFS_MFSI_CLIENT 0x02 /* Is a client -- skip lots of stuff */0513#define XFS_MFSI_NOUNLINK 0x08 /* Skip unlinked inode processing in */514 /* log recovery */515#define XFS_MFSI_NO_QUOTACHECK 0x10 /* Skip quotacheck processing */00516517/*518 * Macros for getting from mount to vfs and back.···584extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *,585 uint, int);586extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int);587-extern int xfs_readsb(xfs_mount_t *mp);588extern void xfs_freesb(xfs_mount_t *);589extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int);590extern int xfs_syncsub(xfs_mount_t *, int, int, int *);
···510 */511#define XFS_MFSI_SECOND 0x01 /* Secondary mount -- skip stuff */512#define XFS_MFSI_CLIENT 0x02 /* Is a client -- skip lots of stuff */513+/* XFS_MFSI_RRINODES */514#define XFS_MFSI_NOUNLINK 0x08 /* Skip unlinked inode processing in */515 /* log recovery */516#define XFS_MFSI_NO_QUOTACHECK 0x10 /* Skip quotacheck processing */517+/* XFS_MFSI_CONVERT_SUNIT */518+#define XFS_MFSI_QUIET 0x40 /* Be silent if mount errors found */519520/*521 * Macros for getting from mount to vfs and back.···581extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *,582 uint, int);583extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int);584+extern int xfs_readsb(xfs_mount_t *, int);585extern void xfs_freesb(xfs_mount_t *);586extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int);587extern int xfs_syncsub(xfs_mount_t *, int, int, int *);
+4-1
fs/xfs/xfs_vfsops.c
···442 p = vfs_bhv_lookup(vfsp, VFS_POSITION_IO);443 mp->m_io_ops = p ? *(xfs_ioops_t *) vfs_bhv_custom(p) : xfs_iocore_xfs;444000445 /*446 * Open real time and log devices - order is important.447 */···495 error = xfs_start_flags(vfsp, args, mp);496 if (error)497 goto error1;498- error = xfs_readsb(mp);499 if (error)500 goto error1;501 error = xfs_finish_flags(vfsp, args, mp);
···442 p = vfs_bhv_lookup(vfsp, VFS_POSITION_IO);443 mp->m_io_ops = p ? *(xfs_ioops_t *) vfs_bhv_custom(p) : xfs_iocore_xfs;444445+ if (args->flags & XFSMNT_QUIET)446+ flags |= XFS_MFSI_QUIET;447+448 /*449 * Open real time and log devices - order is important.450 */···492 error = xfs_start_flags(vfsp, args, mp);493 if (error)494 goto error1;495+ error = xfs_readsb(mp, flags);496 if (error)497 goto error1;498 error = xfs_finish_flags(vfsp, args, mp);