From: Ted Ts'o <tytso@mit.edu>
To: Allison Henderson <achender@linux.vnet.ibm.com>
Cc: linux-ext4@vger.kernel.org
Subject: Re: [PATCH 1/5 v6] ext4: Add new ext4_discard_partial_page_buffers routines
Date: Sat, 27 Aug 2011 00:06:09 -0400 [thread overview]
Message-ID: <20110827040609.GA5374@thunk.org> (raw)
In-Reply-To: <1314212842-16741-2-git-send-email-achender@linux.vnet.ibm.com>
On Wed, Aug 24, 2011 at 12:07:18PM -0700, Allison Henderson wrote:
> + while (pos < offset + length) {
> + err = 0;
> +
> + /* The length of space left to zero and unmap */
> + range_to_discard = offset + length - pos;
> +
> + /* The length of space until the end of the block */
> + end_of_block = blocksize - (pos & (blocksize-1));
> +
> + /*
> + * Do not unmap or zero past end of block
> + * for this buffer head
> + */
> + if (range_to_discard > end_of_block)
> + range_to_discard = end_of_block;
> +
> +
> + /*
> + * Skip this buffer head if we are only zeroing unampped
> + * regions of the page
> + */
> + if (flags & EXT4_DSCRD_PARTIAL_PG_ZERO_UNMAPED &&
> + buffer_mapped(bh))
> + goto next;
> +
You should move this bit of code here:
/* If the range is block aligned, unmap */
if (range_to_discard == blocksize) {
clear_buffer_dirty(bh);
bh->b_bdev = NULL;
clear_buffer_mapped(bh);
clear_buffer_req(bh);
clear_buffer_new(bh);
clear_buffer_delay(bh);
clear_buffer_unwritten(bh);
clear_buffer_uptodate(bh);
and add these two lines:
+ zero_user(page, pos, blocksize);
+ goto next;
}
Why? Because if the range is block aligned, all you have to do is
unmap the buffer and call zero_user() just in case the page was
mmap'ed into some process's address space. You don't want to mark the
block dirty --- in fact, if the buffer was already unmapped, you'll
trigger a WARN_ON in fs/buffer.c in mark_buffer_dirty() --- which is
how I noticed the problem and decided to look more closely at this bit
of code.
You also don't want to engage the journaling machinery and journal the
data block in data=journalling mode, or to put the inode on the
data=ordered writeback list just because of this write. That's just
wasted work.
If you do this, then you also don't need the conditional below:
> + /*
> + * If this block is not completely contained in the range
> + * to be discarded, then it is not going to be released. Because
> + * we need to keep this block, we need to make sure this part
> + * of the page is uptodate before we modify it by writeing
> + * partial zeros on it.
> + */
> + if (range_to_discard != blocksize) {
... which will also reduce a level of indentation, in the code, which
is good.
- Ted
next prev parent reply other threads:[~2011-08-27 4:06 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-24 19:07 [PATCH 0/5 v6] ext4: fix 1k block bugs Allison Henderson
2011-08-24 19:07 ` [PATCH 1/5 v6] ext4: Add new ext4_discard_partial_page_buffers routines Allison Henderson
2011-08-27 4:06 ` Ted Ts'o [this message]
2011-08-28 2:22 ` Allison Henderson
2011-08-24 19:07 ` [PATCH 2/5 v6] ext4: fix xfstests 75, 112, 127 punch hole failure Allison Henderson
2011-08-24 19:07 ` [PATCH 3/5 v6] ext4: fix 2nd xfstests " Allison Henderson
2011-08-24 19:07 ` [PATCH 4/5 v6] ext4: fix fsx truncate failure Allison Henderson
2011-08-24 19:07 ` [PATCH 5/5 v6] ext4: fix partial page writes Allison Henderson
2011-08-26 15:47 ` Ted Ts'o
2011-08-26 22:46 ` Allison Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20110827040609.GA5374@thunk.org \
--to=tytso@mit.edu \
--cc=achender@linux.vnet.ibm.com \
--cc=linux-ext4@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.