From: Ross Zwisler <ross.zwisler@linux.intel.com>
To: Matthew Wilcox <willy@linux.intel.com>
Cc: Ross Zwisler <ross.zwisler@linux.intel.com>,
Matthew Wilcox <matthew.r.wilcox@intel.com>,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org, linux-ext4@vger.kernel.org
Subject: Re: [PATCH v5 22/22] XIP: Add support for unwritten extents
Date: Mon, 27 Jan 2014 16:32:07 -0700 (MST) [thread overview]
Message-ID: <alpine.OSX.2.00.1401271617570.9254@scrumpy> (raw)
In-Reply-To: <CF0C370C.235F1%willy@linux.intel.com>
On Thu, 23 Jan 2014, Matthew Wilcox wrote:
> On Wed, Jan 22, 2014 at 03:51:56PM -0700, Ross Zwisler wrote:
> > > + if (hole) {
> > > addr = NULL;
> > > - hole = true;
> > > size = bh->b_size;
> > > + } else {
> > > + unsigned first;
> > > + retval = xip_get_addr(inode, bh, &addr);
> > > + if (retval < 0)
> > > + break;
> > > + size = retval;
> > > + first = offset - (block << inode->i_blkbits);
> > > + if (buffer_unwritten(bh))
> > > + memset(addr, 0, first);
> > > + addr += first;
> >
> > + size -= first;
> >
> > This is needed so that we don't overrun the XIP buffer we are given in the
> > event that our user buffer >= our XIP buffer and the start of our I/O isn't
> > block aligned.
>
> You're right! Thank you! However, we also need it for the hole ==
> true case, don't we? So maybe something like this, incrementally on top of
> patch 22/22:
>
> P.S. Can someone come up with a better name for this variable than 'first'?
> I'd usually use 'offset', but that's already taken. 'annoying_bit' seems a
> bit judgemental. 'misaligned', maybe? 'skip' or 'seek' like dd uses?
>
> diff --git a/fs/xip.c b/fs/xip.c
> index 92157ff..1ae00db 100644
> --- a/fs/xip.c
> +++ b/fs/xip.c
> @@ -103,6 +103,7 @@ static ssize_t xip_io(int rw, struct inode *inode, const
> struct iovec *iov,
>
> if (max == offset) {
> sector_t block = offset >> inode->i_blkbits;
> + unsigned first = offset - (block << inode->i_blkbits);
> long size;
> memset(bh, 0, sizeof(*bh));
> bh->b_size = ALIGN(end - offset, PAGE_SIZE);
> @@ -121,14 +122,12 @@ static ssize_t xip_io(int rw, struct inode *inode,
> const struct iovec *iov,
>
> if (hole) {
> addr = NULL;
> - size = bh->b_size;
> + size = bh->b_size - first;
It looks like we have an additional bit of complexity with the hole case. The
issue is that for holes, bh->b_size is just the full size of the write as set
earlier in the function:
bh->b_size = ALIGN(end - offset, PAGE_SIZE);
>From this code it seems like you hoped the call into get_block() would adjust
bh->b_size to the size of the hole, allowing you to zero just the hole space
in the user buffer. It doesn't look like it does, though, at least for ext4.
In looking at the direct I/O case (do_direct_IO()), they deal with holes on a
per FS block basis, and don't ever look at bh->b_size once they've figured out
the buffer is unmapped.
The result of this is that when you get a read that starts at a hole but moves
into real data, the read will just see a hole and return data of all zeros.
To just assume the current FS block is a hole, we can do something like this:
diff --git a/fs/xip.c b/fs/xip.c
index 35e401e..e902593 100644
--- a/fs/xip.c
+++ b/fs/xip.c
@@ -122,7 +122,7 @@ static ssize_t xip_io(int rw, struct inode *inode, const struct
if (hole) {
addr = NULL;
- size = bh->b_size - first;
+ size = (1 << inode->i_blkbits) - first;
} else {
retval = xip_get_addr(inode, bh, &addr);
if (retval < 0)
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2014-01-27 23:31 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-16 1:24 [PATCH v5 00/22] Rewrite XIP code and add XIP support to ext4 Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 01/22] Fix XIP fault vs truncate race Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 02/22] Allow page fault handlers to perform the COW Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 03/22] axonram: Fix bug in direct_access Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 04/22] Change direct_access calling convention Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 05/22] Introduce IS_XIP(inode) Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 06/22] Treat XIP like O_DIRECT Matthew Wilcox
2014-01-31 16:59 ` Jan Kara
2014-01-16 1:24 ` [PATCH v5 07/22] Rewrite XIP page fault handling Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 08/22] Change xip_truncate_page to take a get_block parameter Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 09/22] Remove mm/filemap_xip.c Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 10/22] Remove get_xip_mem Matthew Wilcox
2014-01-16 1:46 ` Randy Dunlap
2014-01-27 13:26 ` Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 11/22] Replace ext2_clear_xip_target with xip_clear_blocks Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 12/22] ext2: Remove ext2_xip_verify_sb() Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 13/22] ext2: Remove ext2_use_xip Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 14/22] ext2: Remove xip.c and xip.h Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 15/22] Remove CONFIG_EXT2_FS_XIP Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 16/22] ext2: Remove ext2_aops_xip Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 17/22] xip: Add xip_zero_page_range Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 18/22] ext4: Make ext4_block_zero_page_range static Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 19/22] ext4: Add XIP functionality Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 20/22] ext4: Fix typos Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 21/22] xip: Add reporting of major faults Matthew Wilcox
2014-01-16 1:24 ` [PATCH v5 22/22] XIP: Add support for unwritten extents Matthew Wilcox
[not found] ` <CEFDA737.22F87%matthew.r.wilcox@intel.com>
2014-01-17 0:00 ` [PATCH v5 19/22] ext4: Add XIP functionality Ross Zwisler
[not found] ` <CEFD7DAD.22F65%matthew.r.wilcox@intel.com>
2014-01-22 22:51 ` [PATCH v5 22/22] XIP: Add support for unwritten extents Ross Zwisler
2014-01-23 12:08 ` Matthew Wilcox
2014-01-23 19:13 ` Ross Zwisler
[not found] ` <CF0C370C.235F1%willy@linux.intel.com>
2014-01-27 23:32 ` Ross Zwisler [this message]
2014-01-28 3:49 ` Matthew Wilcox
2014-01-23 7:48 ` [PATCH v5 00/22] Rewrite XIP code and add XIP support to ext4 Dave Chinner
2014-01-23 7:53 ` Dave Chinner
2014-01-23 9:01 ` Dave Chinner
2014-01-23 12:12 ` Wilcox, Matthew R
2014-01-28 6:06 ` Dave Chinner
2014-01-30 6:42 ` Dave Chinner
2014-01-30 9:25 ` Dave Chinner
2014-01-31 3:06 ` Dave Chinner
2014-01-31 5:45 ` Ross Zwisler
2014-01-31 13:04 ` Dave Chinner
[not found] ` <CF1FF3EB.24114%matthew.r.wilcox@intel.com>
2014-02-11 23:12 ` [PATCH v5 19/22] ext4: Add XIP functionality Ross Zwisler
2014-02-13 0:00 ` Ross Zwisler
[not found] ` <CF215477.24281%matthew.r.wilcox@intel.com>
2014-02-12 23:53 ` [PATCH v5 06/22] Treat XIP like O_DIRECT Ross Zwisler
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=alpine.OSX.2.00.1401271617570.9254@scrumpy \
--to=ross.zwisler@linux.intel.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=matthew.r.wilcox@intel.com \
--cc=willy@linux.intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).