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.
MFC after:	3 days
This commit is contained in:
Scott Long 2014-05-06 20:40:16 +00:00
parent c562fda42a
commit 7d155880ee
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=265463

View File

@ -1275,6 +1275,7 @@ static int stat_cleanup_blkrequests; /* Number of block cleanup requests */
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, cleanup_failures, CTLFLAG_RW,
&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, flags)
*/
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, flags)
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.
*/