diff options
| -rw-r--r-- | fs/buffer.c | 20 | ||||
| -rw-r--r-- | fs/gfs2/lops.c | 2 | ||||
| -rw-r--r-- | include/linux/buffer_head.h | 1 |
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 | } |
| 1182 | EXPORT_SYMBOL(mark_buffer_dirty); | 1179 | EXPORT_SYMBOL(mark_buffer_dirty); |
| 1183 | 1180 | ||
| 1181 | void 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 | } | ||
| 1190 | EXPORT_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 | ||
| 151 | void mark_buffer_dirty(struct buffer_head *bh); | 151 | void mark_buffer_dirty(struct buffer_head *bh); |
| 152 | void mark_buffer_write_io_error(struct buffer_head *bh); | ||
| 152 | void init_buffer(struct buffer_head *, bh_end_io_t *, void *); | 153 | void init_buffer(struct buffer_head *, bh_end_io_t *, void *); |
| 153 | void touch_buffer(struct buffer_head *bh); | 154 | void touch_buffer(struct buffer_head *bh); |
| 154 | void set_bh_page(struct buffer_head *bh, | 155 | void set_bh_page(struct buffer_head *bh, |
