All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nick Piggin <npiggin@suse.de>
To: Andrew Morton <akpm@osdl.org>
Cc: Linus Torvalds <torvalds@osdl.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Linux Memory Management List <linux-mm@kvack.org>,
	Greg KH <gregkh@suse.de>
Subject: Re: [patch] mm: bug in set_page_dirty_buffers
Date: Tue, 10 Oct 2006 10:18:20 +0200	[thread overview]
Message-ID: <20061010081820.GA24748@wotan.suse.de> (raw)
In-Reply-To: <20061010010742.50cbe1b1.akpm@osdl.org>

On Tue, Oct 10, 2006 at 01:07:42AM -0700, Andrew Morton wrote:
> On Tue, 10 Oct 2006 09:21:29 +0200
> Nick Piggin <npiggin@suse.de> wrote:
> 
> >  void block_invalidatepage(struct page *page, unsigned long offset)
> >  {
> > + 	struct address_space *mapping = page->mapping;
> >  	struct buffer_head *head, *bh, *next;
> > -	unsigned int curr_off = 0;
> > +	unsigned int curr_off;
> >  
> >  	BUG_ON(!PageLocked(page));
> >  	if (!page_has_buffers(page))
> >  		goto out;
> >  
> > +	curr_off = 0;
> >  	head = page_buffers(page);
> >  	bh = head;
> >  	do {
> > @@ -1455,6 +1457,24 @@ void block_invalidatepage(struct page *p
> >  		bh = next;
> >  	} while (bh != head);
> >  
> > +	/* strip the dirty bits and protect against concurrent set_page_dirty */
> > +	spin_lock(&mapping->private_lock);
> > +	curr_off = 0;
> > +	head = page_buffers(page);
> > +	bh = head;
> > +	do {
> > +		unsigned int next_off = curr_off + bh->b_size;
> > +		next = bh->b_this_page;
> > +
> > +		if (offset <= curr_off) {
> > +			clear_buffer_dirty(bh);
> > +			set_buffer_invalid(bh);
> > +		}
> > +		curr_off = next_off;
> > +		bh = next;
> > +	} while (bh != head);
> > +	spin_unlock(&mapping->private_lock);
> 
> If the buffer's redirtied after discard_buffer() got at it, we've got some
> nasty problems in there.
> 
> Are you sure this race can happen?  Nobody's allowed to have a page mapped
> while it's undergoing truncation (vmtruncate()).

Well, not technically. I think it can happen with nonlinear pages now,
but that is a bug in truncate and I have some patches to fix them.

But anyone who has done a get_user_pages, AFAIKS, can later run a
set_page_dirty on the pages. Nasty problem, but I think we are OK to
just ignore the dirty bits in this case, because the truncate might
well have happened _after_ the get_user_pages guy set the page dirty
anyway.

> There might be a problem with the final blocks in the page outside i_size. 
> iirc what happens here is that the bh outside i_size _is_ marked dirty, but
> writepage() will notice that it's outside i_size and will just mark it
> clean again without doing IO.

Didn't think of that. How does it get to writepage though, if it has
lost its mapping?

--
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>

  reply	other threads:[~2006-10-10  8:18 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-10  2:36 [patch] mm: bug in set_page_dirty_buffers Nick Piggin
2006-10-10  3:06 ` Linus Torvalds
2006-10-10  3:19   ` Nick Piggin
2006-10-10  3:20   ` Andrew Morton
2006-10-10  3:34     ` Nick Piggin
2006-10-10  3:50       ` Andrew Morton
2006-10-10  3:58         ` Nick Piggin
2006-10-10  4:14           ` Andrew Morton
2006-10-10  4:21             ` Nick Piggin
2006-10-10  4:38               ` Andrew Morton
2006-10-10  4:47                 ` Nick Piggin
2006-10-10  5:01                   ` Andrew Morton
2006-10-10  5:22                     ` Nick Piggin
2006-10-10  5:29                       ` Andrew Morton
2006-10-10  5:48                         ` Nick Piggin
2006-10-10  6:08                           ` Andrew Morton
2006-10-10  6:19                             ` Nick Piggin
2006-10-10  6:27                               ` Andrew Morton
2006-10-10  6:39                                 ` Nick Piggin
2006-10-10  6:52                                   ` Nick Piggin
2006-10-10  7:06                                     ` Andrew Morton
2006-10-10  7:21                                       ` Nick Piggin
2006-10-10  8:07                                         ` Andrew Morton
2006-10-10  8:18                                           ` Nick Piggin [this message]
2006-10-10  8:41                                             ` Andrew Morton
2006-10-10  8:49                                               ` Nick Piggin
2006-10-10  9:07                                                 ` Andrew Morton
2006-10-10  9:23                                                   ` Nick Piggin
2006-10-10  6:48                       ` Peter Zijlstra
2006-10-10  6:59                         ` Nick Piggin
2006-10-10  7:11                           ` Peter Zijlstra
2006-10-10  7:30                             ` Nick Piggin
2006-10-10  4:11         ` Nick Piggin
2006-10-10  3:37     ` Andrew Morton
2006-10-10  3:42       ` Nick Piggin
2006-10-10  7:42 ` patch mm-bug-in-set_page_dirty_buffers.patch queued to -stable tree gregkh

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=20061010081820.GA24748@wotan.suse.de \
    --to=npiggin@suse.de \
    --cc=a.p.zijlstra@chello.nl \
    --cc=akpm@osdl.org \
    --cc=gregkh@suse.de \
    --cc=linux-mm@kvack.org \
    --cc=torvalds@osdl.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.