svn commit: r268077 - stable/10/sys/ufs/ffs
Scott Long
scottl at FreeBSD.org
Tue Jul 1 06:59:24 UTC 2014
Author: scottl
Date: Tue Jul 1 06:59:23 2014
New Revision: 268077
URL: http://svnweb.freebsd.org/changeset/base/268077
Log:
Merge r265463:
Due to reasons unknown at this time, the system can be forced to write
a journal block even when there are no journal entries to be written.
Until the root cause is found, handle this case by ensuring that a
valid journal segment is always written.
Second, the data buffer used for writing journal entries was never
being scrubbed of old data. Fix this.
Submitted by: Takehara Mikihito
Obtained from: Netflix, Inc.
Modified:
stable/10/sys/ufs/ffs/ffs_softdep.c
Modified: stable/10/sys/ufs/ffs/ffs_softdep.c
==============================================================================
--- stable/10/sys/ufs/ffs/ffs_softdep.c Tue Jul 1 06:50:35 2014 (r268076)
+++ stable/10/sys/ufs/ffs/ffs_softdep.c Tue Jul 1 06:59:23 2014 (r268077)
@@ -1275,6 +1275,7 @@ static int stat_cleanup_blkrequests; /*
static int stat_cleanup_inorequests; /* Number of inode cleanup requests */
static int stat_cleanup_retries; /* Number of cleanups that needed to flush */
static int stat_cleanup_failures; /* Number of cleanup requests that failed */
+static int stat_emptyjblocks; /* Number of potentially empty journal blocks */
SYSCTL_INT(_debug_softdep, OID_AUTO, max_softdeps, CTLFLAG_RW,
&max_softdeps, 0, "");
@@ -1334,6 +1335,8 @@ SYSCTL_INT(_debug_softdep, OID_AUTO, cle
&stat_cleanup_failures, 0, "");
SYSCTL_INT(_debug_softdep, OID_AUTO, flushcache, CTLFLAG_RW,
&softdep_flushcache, 0, "");
+SYSCTL_INT(_debug_softdep, OID_AUTO, emptyjblocks, CTLFLAG_RD,
+ &stat_emptyjblocks, 0, "");
SYSCTL_DECL(_vfs_ffs);
@@ -3328,6 +3331,24 @@ softdep_process_journal(mp, needwk, flag
*/
data = bp->b_data;
off = 0;
+
+ /*
+ * Always put a header on the first block.
+ * XXX As with below, there might not be a chance to get
+ * into the loop. Ensure that something valid is written.
+ */
+ jseg_write(ump, jseg, data);
+ off += JREC_SIZE;
+ data = bp->b_data + off;
+
+ /*
+ * XXX Something is wrong here. There's no work to do,
+ * but we need to perform and I/O and allow it to complete
+ * anyways.
+ */
+ if (LIST_EMPTY(&ump->softdep_journal_pending))
+ stat_emptyjblocks++;
+
while ((wk = LIST_FIRST(&ump->softdep_journal_pending))
!= NULL) {
if (cnt == 0)
@@ -3377,6 +3398,11 @@ softdep_process_journal(mp, needwk, flag
data = bp->b_data + off;
cnt--;
}
+
+ /* Clear any remaining space so we don't leak kernel data */
+ if (size > off)
+ bzero(data, size - off);
+
/*
* Write this one buffer and continue.
*/
More information about the svn-src-all
mailing list