|
@@ -110,10 +110,14 @@ static void buffer_io_error(struct buffer_head *bh)
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
- * Default synchronous end-of-IO handler.. Just mark it up-to-date and
|
|
|
- * unlock the buffer. This is what ll_rw_block uses too.
|
|
|
+ * End-of-IO handler helper function which does not touch the bh after
|
|
|
+ * unlocking it.
|
|
|
+ * Note: unlock_buffer() sort-of does touch the bh after unlocking it, but
|
|
|
+ * a race there is benign: unlock_buffer() only use the bh's address for
|
|
|
+ * hashing after unlocking the buffer, so it doesn't actually touch the bh
|
|
|
+ * itself.
|
|
|
*/
|
|
|
-void end_buffer_read_sync(struct buffer_head *bh, int uptodate)
|
|
|
+static void __end_buffer_read_notouch(struct buffer_head *bh, int uptodate)
|
|
|
{
|
|
|
if (uptodate) {
|
|
|
set_buffer_uptodate(bh);
|
|
@@ -122,6 +126,15 @@ void end_buffer_read_sync(struct buffer_head *bh, int uptodate)
|
|
|
clear_buffer_uptodate(bh);
|
|
|
}
|
|
|
unlock_buffer(bh);
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Default synchronous end-of-IO handler.. Just mark it up-to-date and
|
|
|
+ * unlock the buffer. This is what ll_rw_block uses too.
|
|
|
+ */
|
|
|
+void end_buffer_read_sync(struct buffer_head *bh, int uptodate)
|
|
|
+{
|
|
|
+ __end_buffer_read_notouch(bh, uptodate);
|
|
|
put_bh(bh);
|
|
|
}
|
|
|
|
|
@@ -2245,21 +2258,10 @@ out_unlock:
|
|
|
* nobh_prepare_write()'s prereads are special: the buffer_heads are freed
|
|
|
* immediately, while under the page lock. So it needs a special end_io
|
|
|
* handler which does not touch the bh after unlocking it.
|
|
|
- *
|
|
|
- * Note: unlock_buffer() sort-of does touch the bh after unlocking it, but
|
|
|
- * a race there is benign: unlock_buffer() only use the bh's address for
|
|
|
- * hashing after unlocking the buffer, so it doesn't actually touch the bh
|
|
|
- * itself.
|
|
|
*/
|
|
|
static void end_buffer_read_nobh(struct buffer_head *bh, int uptodate)
|
|
|
{
|
|
|
- if (uptodate) {
|
|
|
- set_buffer_uptodate(bh);
|
|
|
- } else {
|
|
|
- /* This happens, due to failed READA attempts. */
|
|
|
- clear_buffer_uptodate(bh);
|
|
|
- }
|
|
|
- unlock_buffer(bh);
|
|
|
+ __end_buffer_read_notouch(bh, uptodate);
|
|
|
}
|
|
|
|
|
|
/*
|