From: Al Viro <viro@ftp.linux.org.uk>
To: Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 1/5]: ufs: missed brelse and wrong baseblk
Date: Mon, 19 Jun 2006 19:28:33 +0100 [thread overview]
Message-ID: <20060619182833.GJ27946@ftp.linux.org.uk> (raw)
In-Reply-To: <20060619131750.GA14770@rain.homenetwork>
On Mon, Jun 19, 2006 at 05:17:50PM +0400, Evgeniy Dushistov wrote:
> In case of 1k fragments, msync of two pages
> cause 8 calls of ufs's get_block_t with create == 1,
> they will be consequent because of synchronization.
_What_ synchronization?
To simplify the analysis, have one of those do msync() and another - write().
One triggers writeback, leading to ufs_writepage(). Another leads to call
of ufs_prepare_write(). Note that the latter call is process-synchronous,
so no implicit serialization could apply.
Now, which lock would, in your opinion, provide serialization between these
two calls? They apply to different pages, so page locks do not help.
And yes, we do need some serialization between get_block_t here, indeed.
As it is, we don't have any.
Note that there is another problem with use of fs/buffer.c helpers. They
assume that there are 3 states of buffer_head corresponding to fragment:
* mapped to known disk block
* known to be in hole
* not known
And that's where we have a problem. block_read_full_page() on page 0
will get all buffer_head on that page (one for each fragment) to
the second state. block_prepare_write() will get all buffer_head on
page 1 to the first state after the callback allocates the first direct block
of file (they will be mapped to the fragments in that block, at offsets 4Kb
and further).
But now we have the buffer_heads on page 0 in the state inconsistent with
the reality - basically, fs/buffer.c helpers will assume that they are
_still_ in the second state (known to be in hole), while in the reality
they should be either in the first or in the third one (mapped to known
disk block or not known).
It's not a fundamental problem; however, it does mean that using these
helpers means using library functions in situation they'd never been designed
for. IOW, you need very careful analysis of the assumptions made by
the entire bunch and, quite possibly, need versions modified for UFS.
next prev parent reply other threads:[~2006-06-19 18:28 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-06-17 10:14 [PATCH 1/5]: ufs: missed brelse and wrong baseblk Evgeniy Dushistov
2006-06-18 16:20 ` Al Viro
2006-06-18 17:50 ` Al Viro
2006-06-19 6:47 ` Evgeniy Dushistov
2006-06-19 7:32 ` Al Viro
2006-06-19 13:17 ` Evgeniy Dushistov
2006-06-19 18:28 ` Al Viro [this message]
2006-06-19 18:58 ` Evgeniy Dushistov
2006-06-19 19:13 ` Al Viro
2006-06-20 16:30 ` Evgeniy Dushistov
2006-06-20 16:30 ` Evgeniy Dushistov
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=20060619182833.GJ27946@ftp.linux.org.uk \
--to=viro@ftp.linux.org.uk \
--cc=akpm@osdl.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@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 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).