xfs
[Top] [All Lists]

[PATCH] log reasons for mount-time sunit/swidth rejection

To: xfs-oss <xfs@xxxxxxxxxxx>
Subject: [PATCH] log reasons for mount-time sunit/swidth rejection
From: Eric Sandeen <sandeen@xxxxxxxxxxx>
Date: Tue, 09 Sep 2008 21:48:50 -0500
User-agent: Thunderbird 2.0.0.16 (Macintosh/20080707)
In xfs_mountfs ....

        /*
         * Check if sb_agblocks is aligned at stripe boundary
         * If sb_agblocks is NOT aligned turn off m_dalign since
         * allocator alignment is within an ag, therefore ag has
         * to be aligned at stripe boundary.
         */
        update_flags = 0LL;
        if (mp->m_dalign && !(mfsi_flags & XFS_MFSI_SECOND)) {
                /*
                 * If stripe unit and stripe width are not multiples
                 * of the fs blocksize turn off alignment.
                 */
                if ((BBTOB(mp->m_dalign) & mp->m_blockmask) ||
                    (BBTOB(mp->m_swidth) & mp->m_blockmask)) {
                        if (mp->m_flags & XFS_MOUNT_RETERR) {
                                cmn_err(CE_WARN,
                                        "XFS: alignment check 1 failed");
                                error = XFS_ERROR(EINVAL);
                                goto error1;
                        }

^^^^ here we fail with an oh-so-helpful warning

                        mp->m_dalign = mp->m_swidth = 0;
                } else {
                        /*
                         * Convert the stripe unit and width to FSBs.
                         */
                        mp->m_dalign = XFS_BB_TO_FSBT(mp, mp->m_dalign);
                        if (mp->m_dalign && (sbp->sb_agblocks % mp->m_dalign)) {
                                if (mp->m_flags & XFS_MOUNT_RETERR) {
                                        error = XFS_ERROR(EINVAL);
                                        goto error1;
                                }

^^^ here we fail with no message from mount whatsoever!

                                xfs_fs_cmn_err(CE_WARN, mp,
"stripe alignment turned off: sunit(%d)/swidth(%d) incompatible with 
agsize(%d)",
                                        mp->m_dalign, mp->m_swidth,
                                        sbp->sb_agblocks);

                                mp->m_dalign = 0;
                                mp->m_swidth = 0;
                        } else if (mp->m_dalign) {
                                mp->m_swidth = XFS_BB_TO_FSBT(mp, mp->m_swidth);
                        } else {
                                if (mp->m_flags & XFS_MOUNT_RETERR) {
                                        xfs_fs_cmn_err(CE_WARN, mp,
"stripe alignment turned off: sunit(%d) less than bsize(%d)",
                                                mp->m_dalign,
                                                mp->m_blockmask +1);
                                        error = XFS_ERROR(EINVAL);
                                        goto error1;
                                }

^^^ here we fail with a misleading message (it's not turned off; it's a failure
and we return as such).

                                mp->m_swidth = 0;
                        }
                }

http://oss.sgi.com/cgi-bin/cvsweb.cgi/xfs-linux/xfs_mount.c.diff?r1=1.342;r2=1.343

Did that commit just misplace one of the error messages?

I'm thinking that we should certainly printk a message in all cases, and the 
"turned off" messages should only come if !XFS_MOUNT_RETERR; something like 
this?
(might want to clean up messages or cmn_err vs. xfs_fs_cmn_err or whatnot,
but you get the idea ....

-----------------------------------

XFS: log reasons for mount-time sunit/swidth rejection

When mount-time sunit/swidth are deemed incompatible with fs
geometry, leave a message in the logs rather than failing
silently.

Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxxx>
---


Index: linux-2.6.26.x86_64/fs/xfs/xfs_mount.c
===================================================================
--- linux-2.6.26.x86_64.orig/fs/xfs/xfs_mount.c
+++ linux-2.6.26.x86_64/fs/xfs/xfs_mount.c
@@ -745,11 +745,13 @@ xfs_update_alignment(xfs_mount_t *mp, in
                 */
                if ((BBTOB(mp->m_dalign) & mp->m_blockmask) ||
                    (BBTOB(mp->m_swidth) & mp->m_blockmask)) {
-                       if (mp->m_flags & XFS_MOUNT_RETERR) {
-                               cmn_err(CE_WARN,
-                                       "XFS: alignment check 1 failed");
+                       cmn_err(CE_WARN,
+                               "XFS: sunit (%d) or swidth (%d) not "
+                               "blocksize (%d) multiples",
+                               mp->m_dalign, mp->m_swidth,
+                               mp->m_blockmask +1);
+                       if (mp->m_flags & XFS_MOUNT_RETERR)
                                return XFS_ERROR(EINVAL);
-                       }
                        mp->m_dalign = mp->m_swidth = 0;
                } else {
                        /*
@@ -757,28 +759,26 @@ xfs_update_alignment(xfs_mount_t *mp, in
                         */
                        mp->m_dalign = XFS_BB_TO_FSBT(mp, mp->m_dalign);
                        if (mp->m_dalign && (sbp->sb_agblocks % mp->m_dalign)) {
-                               if (mp->m_flags & XFS_MOUNT_RETERR) {
-                                       return XFS_ERROR(EINVAL);
-                               }
                                xfs_fs_cmn_err(CE_WARN, mp,
-"stripe alignment turned off: sunit(%d)/swidth(%d) incompatible with 
agsize(%d)",
-                                       mp->m_dalign, mp->m_swidth,
-                                       sbp->sb_agblocks);
-
+                                       "agsize (%d) not multiple of sunit 
(%d)",
+                                       sbp->sb_agblocks, mp->m_dalign);
+                               if (mp->m_flags & XFS_MOUNT_RETERR)
+                                       return XFS_ERROR(EINVAL);
                                mp->m_dalign = 0;
                                mp->m_swidth = 0;
                        } else if (mp->m_dalign) {
                                mp->m_swidth = XFS_BB_TO_FSBT(mp, mp->m_swidth);
                        } else {
-                               if (mp->m_flags & XFS_MOUNT_RETERR) {
-                                       xfs_fs_cmn_err(CE_WARN, mp,
-"stripe alignment turned off: sunit(%d) less than bsize(%d)",
-                                               mp->m_dalign,
-                                               mp->m_blockmask +1);
+                               xfs_fs_cmn_err(CE_WARN, mp,
+                                       "sunit (%d) less than bsize (%d)",
+                                               mp->m_dalign, mp->m_blockmask 
+1);
+                               if (mp->m_flags & XFS_MOUNT_RETERR)
                                        return XFS_ERROR(EINVAL);
-                               }
                                mp->m_swidth = 0;
                        }
+                       if (mp->m_dalign == 0 && mp->m_swidth == 0)
+                               xfs_fs_cmn_err(CE_WARN, mp,
+                                       "stripe aligment turned off.");
                }
 
                /*

<Prev in Thread] Current Thread [Next in Thread>