From: Andrew Morton <akpm@linux-foundation.org>
To: Jan Kara <jack@suse.cz>
Cc: linux-kernel@vger.kernel.org, supriyak@in.ibm.com
Subject: Re: [PATCH] Fix private_list handling
Date: Thu, 10 Jan 2008 16:36:35 -0800 [thread overview]
Message-ID: <20080110163635.33e7640e.akpm@linux-foundation.org> (raw)
In-Reply-To: <20080110155513.GB12697@duck.suse.cz>
On Thu, 10 Jan 2008 16:55:13 +0100
Jan Kara <jack@suse.cz> wrote:
> Hi,
>
> sorry for the previous empty email...
>
> Supriya noted in his testing that sometimes buffers removed by
> __remove_assoc_queue() don't have b_assoc_mapping set (and thus IO error
> won't be properly propagated). Actually, looking more into the code I found
> there are some more races. The patch below should fix them. It survived
> beating with LTP and fsstress on ext2 filesystem on my testing machine so
> it should be reasonably bugfree... Andrew, would you put the patch into
> -mm? Thanks.
>
> Honza
> --
> Jan Kara <jack@suse.cz>
> SUSE Labs, CR
> ---
>
> There are two possible races in handling of private_list in buffer cache.
> 1) When fsync_buffers_list() processes a private_list, it clears
> b_assoc_mapping and moves buffer to its private list. Now drop_buffers() comes,
> sees a buffer is on list so it calls __remove_assoc_queue() which complains
> about b_assoc_mapping being cleared (as it cannot propagate possible IO error).
> This race has been actually observed in the wild.
private_lock should prevent this race.
Which call to drop_buffers() is the culprit? The first one in
try_to_free_buffers(), I assume? The "can this still happen?" one?
If so, it can happen. How? Perhaps this is a bug.
> 2) When fsync_buffers_list() processes a private_list,
> mark_buffer_dirty_inode() can be called on bh which is already on the private
> list of fsync_buffers_list(). As buffer is on some list (note that the check is
> performed without private_lock), it is not readded to the mapping's
> private_list and after fsync_buffers_list() finishes, we have a dirty buffer
> which should be on private_list but it isn't. This race has not been reported,
> probably because most (but not all) callers of mark_buffer_dirty_inode() hold
> i_mutex and thus are serialized with fsync().
Maybe fsync_buffers_list should put the buffer back onto private_list if it
got dirtied again.
next prev parent reply other threads:[~2008-01-11 0:37 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-01-10 15:50 [PATCH] Fix private_list handling Jan Kara
2008-01-10 15:55 ` Jan Kara
2008-01-11 0:36 ` Andrew Morton [this message]
2008-01-11 14:21 ` Jan Kara
2008-01-11 23:33 ` Andrew Morton
2008-01-14 11:59 ` Jan Kara
2008-01-14 18:14 ` Jan Kara
-- strict thread matches above, loose matches on Subject: below --
2008-02-04 16:44 Jan Kara
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=20080110163635.33e7640e.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=jack@suse.cz \
--cc=linux-kernel@vger.kernel.org \
--cc=supriyak@in.ibm.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 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.