From: Al Viro <viro@ZenIV.linux.org.uk>
To: Theodore Ts'o <tytso@mit.edu>
Cc: linux-ext4@vger.kernel.org, Eric Sandeen <sandeen@redhat.com>,
linux-fsdevel@vger.kernel.org
Subject: Re: [heads-up][RFC] ext4_file_write() breakage
Date: Sat, 5 Apr 2014 05:32:43 +0100 [thread overview]
Message-ID: <20140405043243.GT18016@ZenIV.linux.org.uk> (raw)
In-Reply-To: <20140405031507.GA18456@thunk.org>
On Fri, Apr 04, 2014 at 11:15:07PM -0400, Theodore Ts'o wrote:
> Hang on a second. What are you assuming the block size to be in this
> example? If the block size is 4k, then this doesn't make any sense,
> because unmapped memory will be in units of the block size, so we
> couldn't have the second 512 byte segment be unmapped. Blocks are
> unmaped, not individual 512 byte sectors.
char *p = (char *)mmap(NULL, 8192, PROT_READ | PROT_WRITE, MAP_ANON, -1, 0);
struct iovec v[8];
memset(p, 'a', 4096);
munmap(p + 4096, 4096);
for (int i = 0; i < 8; i++)
v[i] = (struct iovec){p + i * 512, 512};
v[1].iov_base = p + 4096; /* unmapped */
The rest of feeding v to aio (with AIO_PWRITEV) is left as an exercise.
v[0] points to 512 bytes of RAM, all present (and filled with 'a').
v[1] points to the memory we'd just munmapped; trying to dereference it
would segfault, passing it to write() would give -EFAULT and passing the
entire array to writev(2) will result in short write - 512 bytes (all 'a')
written to file, return value is 512.
Unmapped memory is in 4K units, all right - and iovec elements are free to
point whereever they bloody please. Sure, v[0].iov_base is 4K-aligned
and v[0].iov_len is 512, but that doesn't mean that v[1].iov_base can't point
into completely different page. It does *not* have to be v[0].iov_base + 512.
That's the whole point of iovec, after all - ability to take an arbitrary
bunch of memory objects and write them all in one syscall, without having to
copy them into adjacent addresses...
next prev parent reply other threads:[~2014-04-05 4:32 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-03 16:37 [heads-up][RFC] ext4_file_write() breakage Al Viro
2014-04-04 2:55 ` Theodore Ts'o
2014-04-04 6:11 ` Al Viro
2014-04-05 3:15 ` Theodore Ts'o
2014-04-05 4:32 ` Al Viro [this message]
2014-04-08 2:01 ` Theodore Ts'o
2014-04-05 6:53 ` Al Viro
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=20140405043243.GT18016@ZenIV.linux.org.uk \
--to=viro@zeniv.linux.org.uk \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=sandeen@redhat.com \
--cc=tytso@mit.edu \
/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.