[XFS] Implement the silent parameter to fill_super, previously ignored.

SGI-PV: 951299
SGI-Modid: xfs-linux-melb:xfs-kern:25632a

Signed-off-by: Nathan Scott <nathans@sgi.com>

+49 -47
+6 -5
fs/xfs/linux-2.6/xfs_super.c
··· 67 68 STATIC struct xfs_mount_args * 69 xfs_args_allocate( 70 - struct super_block *sb) 71 { 72 struct xfs_mount_args *args; 73 ··· 81 args->flags |= XFSMNT_DIRSYNC; 82 if (sb->s_flags & MS_SYNCHRONOUS) 83 args->flags |= XFSMNT_WSYNC; 84 - 85 - /* Default to 32 bit inodes on Linux all the time */ 86 args->flags |= XFSMNT_32BITINODES; 87 88 return args; ··· 720 char *options) 721 { 722 vfs_t *vfsp = vfs_from_sb(sb); 723 - struct xfs_mount_args *args = xfs_args_allocate(sb); 724 int error; 725 726 VFS_PARSEARGS(vfsp, options, args, 1, error); ··· 826 { 827 vnode_t *rootvp; 828 struct vfs *vfsp = vfs_allocate(sb); 829 - struct xfs_mount_args *args = xfs_args_allocate(sb); 830 struct kstatfs statvfs; 831 int error, error2; 832
··· 67 68 STATIC struct xfs_mount_args * 69 xfs_args_allocate( 70 + struct super_block *sb, 71 + int silent) 72 { 73 struct xfs_mount_args *args; 74 ··· 80 args->flags |= XFSMNT_DIRSYNC; 81 if (sb->s_flags & MS_SYNCHRONOUS) 82 args->flags |= XFSMNT_WSYNC; 83 + if (silent) 84 + args->flags |= XFSMNT_QUIET; 85 args->flags |= XFSMNT_32BITINODES; 86 87 return args; ··· 719 char *options) 720 { 721 vfs_t *vfsp = vfs_from_sb(sb); 722 + struct xfs_mount_args *args = xfs_args_allocate(sb, 0); 723 int error; 724 725 VFS_PARSEARGS(vfsp, options, args, 1, error); ··· 825 { 826 vnode_t *rootvp; 827 struct vfs *vfsp = vfs_allocate(sb); 828 + struct xfs_mount_args *args = xfs_args_allocate(sb, silent); 829 struct kstatfs statvfs; 830 int error, error2; 831
+1
fs/xfs/xfs_clnt.h
··· 68 * enforcement */ 69 #define XFSMNT_PQUOTAENF 0x00000040 /* IRIX project quota limit 70 * enforcement */ 71 #define XFSMNT_NOALIGN 0x00000200 /* don't allocate at 72 * stripe boundaries*/ 73 #define XFSMNT_RETERR 0x00000400 /* return error to user */
··· 68 * enforcement */ 69 #define XFSMNT_PQUOTAENF 0x00000040 /* IRIX project quota limit 70 * enforcement */ 71 + #define XFSMNT_QUIET 0x00000080 /* don't report mount errors */ 72 #define XFSMNT_NOALIGN 0x00000200 /* don't allocate at 73 * stripe boundaries*/ 74 #define XFSMNT_RETERR 0x00000400 /* return error to user */
+3
fs/xfs/xfs_error.h
··· 186 #define xfs_fs_repair_cmn_err(level, mp, fmt, args...) \ 187 xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## args) 188 189 #endif /* __XFS_ERROR_H__ */
··· 186 #define xfs_fs_repair_cmn_err(level, mp, fmt, args...) \ 187 xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## args) 188 189 + #define xfs_fs_mount_cmn_err(f, fmt, args...) \ 190 + ((f & XFS_MFSI_QUIET)? cmn_err(CE_WARN, "XFS: " fmt, ## args) : (void)0) 191 + 192 #endif /* __XFS_ERROR_H__ */
+31 -40
fs/xfs/xfs_mount.c
··· 213 STATIC int 214 xfs_mount_validate_sb( 215 xfs_mount_t *mp, 216 - xfs_sb_t *sbp) 217 { 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 } 230 231 if (!XFS_SB_GOOD_VERSION(sbp)) { 232 - cmn_err(CE_WARN, "XFS: bad version"); 233 return XFS_ERROR(EWRONGFS); 234 } 235 236 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 } 245 246 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 } 255 256 /* ··· 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 #endif 303 - cmn_err(CE_WARN, 304 - "XFS: File system is too large to be mounted on this system."); 305 return XFS_ERROR(E2BIG); 306 } 307 308 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 */ 477 int 478 - 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); 513 514 - 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; 670 671 if (mp->m_sb_bp == NULL) { 672 - if ((error = xfs_readsb(mp))) { 673 return error; 674 } 675 }
··· 213 STATIC int 214 xfs_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 } 229 230 if (!XFS_SB_GOOD_VERSION(sbp)) { 231 + xfs_fs_mount_cmn_err(flags, "bad version"); 232 return XFS_ERROR(EWRONGFS); 233 } 234 235 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); 241 } 242 243 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); 249 } 250 251 /* ··· 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"); 278 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"); 293 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 #endif 310 + xfs_fs_mount_cmn_err(flags, 311 + "file system too large to be mounted on this system."); 312 return XFS_ERROR(E2BIG); 313 } 314 315 if (unlikely(sbp->sb_inprogress)) { 316 + xfs_fs_mount_cmn_err(flags, "file system busy"); 317 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 */ 486 int 487 + 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); 522 523 + 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; 679 680 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 */ 513 #define XFS_MFSI_NOUNLINK 0x08 /* Skip unlinked inode processing in */ 514 /* log recovery */ 515 #define XFS_MFSI_NO_QUOTACHECK 0x10 /* Skip quotacheck processing */ 516 517 /* 518 * Macros for getting from mount to vfs and back. ··· 584 extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, 585 uint, int); 586 extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); 587 - extern int xfs_readsb(xfs_mount_t *mp); 588 extern void xfs_freesb(xfs_mount_t *); 589 extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int); 590 extern 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 */ 519 520 /* 521 * Macros for getting from mount to vfs and back. ··· 581 extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, 582 uint, int); 583 extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); 584 + extern int xfs_readsb(xfs_mount_t *, int); 585 extern void xfs_freesb(xfs_mount_t *); 586 extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int); 587 extern 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; 444 445 /* 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; 444 445 + 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);