|
@@ -3213,6 +3213,50 @@ static int buffer_cpu_notify(struct notifier_block *self,
|
|
|
return NOTIFY_OK;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * bh_uptodate_or_lock: Test whether the buffer is uptodate
|
|
|
+ * @bh: struct buffer_head
|
|
|
+ *
|
|
|
+ * Return true if the buffer is up-to-date and false,
|
|
|
+ * with the buffer locked, if not.
|
|
|
+ */
|
|
|
+int bh_uptodate_or_lock(struct buffer_head *bh)
|
|
|
+{
|
|
|
+ if (!buffer_uptodate(bh)) {
|
|
|
+ lock_buffer(bh);
|
|
|
+ if (!buffer_uptodate(bh))
|
|
|
+ return 0;
|
|
|
+ unlock_buffer(bh);
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(bh_uptodate_or_lock);
|
|
|
+
|
|
|
+/**
|
|
|
+ * bh_submit_read: Submit a locked buffer for reading
|
|
|
+ * @bh: struct buffer_head
|
|
|
+ *
|
|
|
+ * Returns zero on success and -EIO on error.
|
|
|
+ */
|
|
|
+int bh_submit_read(struct buffer_head *bh)
|
|
|
+{
|
|
|
+ BUG_ON(!buffer_locked(bh));
|
|
|
+
|
|
|
+ if (buffer_uptodate(bh)) {
|
|
|
+ unlock_buffer(bh);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ get_bh(bh);
|
|
|
+ bh->b_end_io = end_buffer_read_sync;
|
|
|
+ submit_bh(READ, bh);
|
|
|
+ wait_on_buffer(bh);
|
|
|
+ if (buffer_uptodate(bh))
|
|
|
+ return 0;
|
|
|
+ return -EIO;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(bh_submit_read);
|
|
|
+
|
|
|
void __init buffer_init(void)
|
|
|
{
|
|
|
int nrpages;
|