diff options
Diffstat (limited to 'fs/nilfs2/segment.c')
| -rw-r--r-- | fs/nilfs2/segment.c | 21 | 
1 files changed, 15 insertions, 6 deletions
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c index bd88a746106..a1a191634ab 100644 --- a/fs/nilfs2/segment.c +++ b/fs/nilfs2/segment.c @@ -665,7 +665,7 @@ static size_t nilfs_lookup_dirty_data_buffers(struct inode *inode,  		bh = head = page_buffers(page);  		do { -			if (!buffer_dirty(bh)) +			if (!buffer_dirty(bh) || buffer_async_write(bh))  				continue;  			get_bh(bh);  			list_add_tail(&bh->b_assoc_buffers, listp); @@ -699,7 +699,8 @@ static void nilfs_lookup_dirty_node_buffers(struct inode *inode,  		for (i = 0; i < pagevec_count(&pvec); i++) {  			bh = head = page_buffers(pvec.pages[i]);  			do { -				if (buffer_dirty(bh)) { +				if (buffer_dirty(bh) && +						!buffer_async_write(bh)) {  					get_bh(bh);  					list_add_tail(&bh->b_assoc_buffers,  						      listp); @@ -1439,17 +1440,19 @@ static int nilfs_segctor_collect(struct nilfs_sc_info *sci,  		nilfs_clear_logs(&sci->sc_segbufs); -		err = nilfs_segctor_extend_segments(sci, nilfs, nadd); -		if (unlikely(err)) -			return err; -  		if (sci->sc_stage.flags & NILFS_CF_SUFREED) {  			err = nilfs_sufile_cancel_freev(nilfs->ns_sufile,  							sci->sc_freesegs,  							sci->sc_nfreesegs,  							NULL);  			WARN_ON(err); /* do not happen */ +			sci->sc_stage.flags &= ~NILFS_CF_SUFREED;  		} + +		err = nilfs_segctor_extend_segments(sci, nilfs, nadd); +		if (unlikely(err)) +			return err; +  		nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA);  		sci->sc_stage = prev_stage;  	} @@ -1579,6 +1582,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci)  		list_for_each_entry(bh, &segbuf->sb_segsum_buffers,  				    b_assoc_buffers) { +			set_buffer_async_write(bh);  			if (bh->b_page != bd_page) {  				if (bd_page) {  					lock_page(bd_page); @@ -1592,6 +1596,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci)  		list_for_each_entry(bh, &segbuf->sb_payload_buffers,  				    b_assoc_buffers) { +			set_buffer_async_write(bh);  			if (bh == segbuf->sb_super_root) {  				if (bh->b_page != bd_page) {  					lock_page(bd_page); @@ -1677,6 +1682,7 @@ static void nilfs_abort_logs(struct list_head *logs, int err)  	list_for_each_entry(segbuf, logs, sb_list) {  		list_for_each_entry(bh, &segbuf->sb_segsum_buffers,  				    b_assoc_buffers) { +			clear_buffer_async_write(bh);  			if (bh->b_page != bd_page) {  				if (bd_page)  					end_page_writeback(bd_page); @@ -1686,6 +1692,7 @@ static void nilfs_abort_logs(struct list_head *logs, int err)  		list_for_each_entry(bh, &segbuf->sb_payload_buffers,  				    b_assoc_buffers) { +			clear_buffer_async_write(bh);  			if (bh == segbuf->sb_super_root) {  				if (bh->b_page != bd_page) {  					end_page_writeback(bd_page); @@ -1755,6 +1762,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci)  				    b_assoc_buffers) {  			set_buffer_uptodate(bh);  			clear_buffer_dirty(bh); +			clear_buffer_async_write(bh);  			if (bh->b_page != bd_page) {  				if (bd_page)  					end_page_writeback(bd_page); @@ -1776,6 +1784,7 @@ static void nilfs_segctor_complete_write(struct nilfs_sc_info *sci)  				    b_assoc_buffers) {  			set_buffer_uptodate(bh);  			clear_buffer_dirty(bh); +			clear_buffer_async_write(bh);  			clear_buffer_delay(bh);  			clear_buffer_nilfs_volatile(bh);  			clear_buffer_nilfs_redirected(bh);  | 
