arm: simplify detection of memory zone boundaries
[linux-2.6-microblaze.git] / fs / buffer.c
index a60f603..64fe82e 100644 (file)
@@ -123,14 +123,6 @@ void __wait_on_buffer(struct buffer_head * bh)
 }
 EXPORT_SYMBOL(__wait_on_buffer);
 
-static void
-__clear_page_buffers(struct page *page)
-{
-       ClearPagePrivate(page);
-       set_page_private(page, 0);
-       put_page(page);
-}
-
 static void buffer_io_error(struct buffer_head *bh, char *msg)
 {
        if (!test_bit(BH_Quiet, &bh->b_state))
@@ -906,7 +898,7 @@ link_dev_buffers(struct page *page, struct buffer_head *head)
                bh = bh->b_this_page;
        } while (bh);
        tail->b_this_page = head;
-       attach_page_buffers(page, head);
+       attach_page_private(page, head);
 }
 
 static sector_t blkdev_max_block(struct block_device *bdev, unsigned int size)
@@ -1154,12 +1146,19 @@ EXPORT_SYMBOL(mark_buffer_dirty);
 
 void mark_buffer_write_io_error(struct buffer_head *bh)
 {
+       struct super_block *sb;
+
        set_buffer_write_io_error(bh);
        /* FIXME: do we need to set this in both places? */
        if (bh->b_page && bh->b_page->mapping)
                mapping_set_error(bh->b_page->mapping, -EIO);
        if (bh->b_assoc_map)
                mapping_set_error(bh->b_assoc_map, -EIO);
+       rcu_read_lock();
+       sb = READ_ONCE(bh->b_bdev->bd_super);
+       if (sb)
+               errseq_set(&sb->s_wb_err, -EIO);
+       rcu_read_unlock();
 }
 EXPORT_SYMBOL(mark_buffer_write_io_error);
 
@@ -1580,7 +1579,7 @@ void create_empty_buffers(struct page *page,
                        bh = bh->b_this_page;
                } while (bh != head);
        }
-       attach_page_buffers(page, head);
+       attach_page_private(page, head);
        spin_unlock(&page->mapping->private_lock);
 }
 EXPORT_SYMBOL(create_empty_buffers);
@@ -2567,7 +2566,7 @@ static void attach_nobh_buffers(struct page *page, struct buffer_head *head)
                        bh->b_this_page = head;
                bh = bh->b_this_page;
        } while (bh != head);
-       attach_page_buffers(page, head);
+       attach_page_private(page, head);
        spin_unlock(&page->mapping->private_lock);
 }
 
@@ -3227,7 +3226,7 @@ drop_buffers(struct page *page, struct buffer_head **buffers_to_free)
                bh = next;
        } while (bh != head);
        *buffers_to_free = head;
-       __clear_page_buffers(page);
+       detach_page_private(page);
        return 1;
 failed:
        return 0;