xfs
[Top] [All Lists]

review: fix remount vs barrier options

To: xfs@xxxxxxxxxxx
Subject: review: fix remount vs barrier options
From: Nathan Scott <nathans@xxxxxxx>
Date: Fri, 21 Jul 2006 15:28:07 +1000
Cc: jeremy@xxxxxxx
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Mutt/1.2.5i
Hi,

Jeremy has had me scratching my head for a few days trying to
figure out how the SCSI traces he's looking at can still show
signs of write barriers being issued to the device, despite a
"remount,nobarrier" having been done.

It finally clicked that we are not clearing the buffer flag
from a previously written log buffer, even though we'll no
longer set a new flag into a buffer (due to the mount flag
being cleared), so we _can_ still issue barrier writes when
remounted without barriers.

This was made more complicated by the way a freshly mounted
filesystem with 8 log buffers wouldn't show up the problem,
since we have to slowly cycle through the "clear" log buffers
before we see the bug.  This seems like the simplest fix...

(Hmmm, actually, I wonder if this will also resolve the quota
log I/O problem that was reported the other day too).

-- 
Nathan


Index: xfs-linux/xfs_log.c
===================================================================
--- xfs-linux.orig/xfs_log.c    2006-07-21 08:55:24.520992250 +1000
+++ xfs-linux/xfs_log.c 2006-07-21 09:47:08.429216000 +1000
@@ -1471,6 +1471,8 @@ xlog_sync(xlog_t          *log,
         */
        if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
                XFS_BUF_ORDERED(bp);
+       else
+               XFS_BUF_UNORDERED(bp);
 
        ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);
        ASSERT(XFS_BUF_ADDR(bp) + BTOBB(count) <= log->l_logBBsize);
@@ -1503,6 +1505,8 @@ xlog_sync(xlog_t          *log,
                XFS_BUF_ASYNC(bp);
                if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
                        XFS_BUF_ORDERED(bp);
+               else
+                       XFS_BUF_UNORDERED(bp);
                dptr = XFS_BUF_PTR(bp);
                /*
                 * Bump the cycle numbers at the start of each block


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