aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/buffer.c20
-rw-r--r--fs/gfs2/lops.c2
-rw-r--r--include/linux/buffer_head.h1
3 files changed, 15 insertions, 8 deletions
diff --git a/fs/buffer.c b/fs/buffer.c
index 4be8b914a222..b946149e8214 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -178,7 +178,7 @@ void end_buffer_write_sync(struct buffer_head *bh, int uptodate)
178 set_buffer_uptodate(bh); 178 set_buffer_uptodate(bh);
179 } else { 179 } else {
180 buffer_io_error(bh, ", lost sync page write"); 180 buffer_io_error(bh, ", lost sync page write");
181 set_buffer_write_io_error(bh); 181 mark_buffer_write_io_error(bh);
182 clear_buffer_uptodate(bh); 182 clear_buffer_uptodate(bh);
183 } 183 }
184 unlock_buffer(bh); 184 unlock_buffer(bh);
@@ -352,8 +352,7 @@ void end_buffer_async_write(struct buffer_head *bh, int uptodate)
352 set_buffer_uptodate(bh); 352 set_buffer_uptodate(bh);
353 } else { 353 } else {
354 buffer_io_error(bh, ", lost async page write"); 354 buffer_io_error(bh, ", lost async page write");
355 mapping_set_error(page->mapping, -EIO); 355 mark_buffer_write_io_error(bh);
356 set_buffer_write_io_error(bh);
357 clear_buffer_uptodate(bh); 356 clear_buffer_uptodate(bh);
358 SetPageError(page); 357 SetPageError(page);
359 } 358 }
@@ -481,8 +480,6 @@ static void __remove_assoc_queue(struct buffer_head *bh)
481{ 480{
482 list_del_init(&bh->b_assoc_buffers); 481 list_del_init(&bh->b_assoc_buffers);
483 WARN_ON(!bh->b_assoc_map); 482 WARN_ON(!bh->b_assoc_map);
484 if (buffer_write_io_error(bh))
485 mapping_set_error(bh->b_assoc_map, -EIO);
486 bh->b_assoc_map = NULL; 483 bh->b_assoc_map = NULL;
487} 484}
488 485
@@ -1181,6 +1178,17 @@ void mark_buffer_dirty(struct buffer_head *bh)
1181} 1178}
1182EXPORT_SYMBOL(mark_buffer_dirty); 1179EXPORT_SYMBOL(mark_buffer_dirty);
1183 1180
1181void mark_buffer_write_io_error(struct buffer_head *bh)
1182{
1183 set_buffer_write_io_error(bh);
1184 /* FIXME: do we need to set this in both places? */
1185 if (bh->b_page && bh->b_page->mapping)
1186 mapping_set_error(bh->b_page->mapping, -EIO);
1187 if (bh->b_assoc_map)
1188 mapping_set_error(bh->b_assoc_map, -EIO);
1189}
1190EXPORT_SYMBOL(mark_buffer_write_io_error);
1191
1184/* 1192/*
1185 * Decrement a buffer_head's reference count. If all buffers against a page 1193 * Decrement a buffer_head's reference count. If all buffers against a page
1186 * have zero reference count, are clean and unlocked, and if the page is clean 1194 * have zero reference count, are clean and unlocked, and if the page is clean
@@ -3279,8 +3287,6 @@ drop_buffers(struct page *page, struct buffer_head **buffers_to_free)
3279 3287
3280 bh = head; 3288 bh = head;
3281 do { 3289 do {
3282 if (buffer_write_io_error(bh) && page->mapping)
3283 mapping_set_error(page->mapping, -EIO);
3284 if (buffer_busy(bh)) 3290 if (buffer_busy(bh))
3285 goto failed; 3291 goto failed;
3286 bh = bh->b_this_page; 3292 bh = bh->b_this_page;
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index b1f9144b42c7..cd7857ab1a6a 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -182,7 +182,7 @@ static void gfs2_end_log_write_bh(struct gfs2_sbd *sdp, struct bio_vec *bvec,
182 bh = bh->b_this_page; 182 bh = bh->b_this_page;
183 do { 183 do {
184 if (error) 184 if (error)
185 set_buffer_write_io_error(bh); 185 mark_buffer_write_io_error(bh);
186 unlock_buffer(bh); 186 unlock_buffer(bh);
187 next = bh->b_this_page; 187 next = bh->b_this_page;
188 size -= bh->b_size; 188 size -= bh->b_size;
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
index bd029e52ef5e..e0abeba3ced7 100644
--- a/include/linux/buffer_head.h
+++ b/include/linux/buffer_head.h
@@ -149,6 +149,7 @@ void buffer_check_dirty_writeback(struct page *page,
149 */ 149 */
150 150
151void mark_buffer_dirty(struct buffer_head *bh); 151void mark_buffer_dirty(struct buffer_head *bh);
152void mark_buffer_write_io_error(struct buffer_head *bh);
152void init_buffer(struct buffer_head *, bh_end_io_t *, void *); 153void init_buffer(struct buffer_head *, bh_end_io_t *, void *);
153void touch_buffer(struct buffer_head *bh); 154void touch_buffer(struct buffer_head *bh);
154void set_bh_page(struct buffer_head *bh, 155void set_bh_page(struct buffer_head *bh,