From 37d9176e34244bb95564a00fcf01df2642bc6ab5 Mon Sep 17 00:00:00 2001 From: Ryusuke Konishi Date: Fri, 24 May 2013 15:55:29 -0700 Subject: [PATCH] --- yaml --- r: 376275 b: refs/heads/master c: 136e8770cd5d1fe38b3c613100dd6dc4db6d4fa6 h: refs/heads/master i: 376273: 4bfbf745af88cd410bc2d8592c7b9a19c593be13 376271: aec6b367370bc080be921ac8df9789975c3d4e26 v: v3 --- [refs] | 2 +- trunk/fs/nilfs2/inode.c | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index e7d4db35674b..2bbcfafad22f 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: dfd20b2b174d3a9b258ea3b7a35ead33576587b1 +refs/heads/master: 136e8770cd5d1fe38b3c613100dd6dc4db6d4fa6 diff --git a/trunk/fs/nilfs2/inode.c b/trunk/fs/nilfs2/inode.c index 689fb608648e..bccfec8343c5 100644 --- a/trunk/fs/nilfs2/inode.c +++ b/trunk/fs/nilfs2/inode.c @@ -219,13 +219,32 @@ static int nilfs_writepage(struct page *page, struct writeback_control *wbc) static int nilfs_set_page_dirty(struct page *page) { - int ret = __set_page_dirty_buffers(page); + int ret = __set_page_dirty_nobuffers(page); - if (ret) { + if (page_has_buffers(page)) { struct inode *inode = page->mapping->host; - unsigned nr_dirty = 1 << (PAGE_SHIFT - inode->i_blkbits); + unsigned nr_dirty = 0; + struct buffer_head *bh, *head; - nilfs_set_file_dirty(inode, nr_dirty); + /* + * This page is locked by callers, and no other thread + * concurrently marks its buffers dirty since they are + * only dirtied through routines in fs/buffer.c in + * which call sites of mark_buffer_dirty are protected + * by page lock. + */ + bh = head = page_buffers(page); + do { + /* Do not mark hole blocks dirty */ + if (buffer_dirty(bh) || !buffer_mapped(bh)) + continue; + + set_buffer_dirty(bh); + nr_dirty++; + } while (bh = bh->b_this_page, bh != head); + + if (nr_dirty) + nilfs_set_file_dirty(inode, nr_dirty); } return ret; }