|
@@ -1233,6 +1233,22 @@ xfs_vm_releasepage(
|
|
|
return try_to_free_buffers(page);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * do all the direct IO specific mapping buffer manipulation here.
|
|
|
+ */
|
|
|
+static void
|
|
|
+xfs_map_direct(
|
|
|
+ struct inode *inode,
|
|
|
+ struct buffer_head *bh_result,
|
|
|
+ struct xfs_bmbt_irec *imap,
|
|
|
+ xfs_off_t offset)
|
|
|
+{
|
|
|
+ if (ISUNWRITTEN(imap)) {
|
|
|
+ bh_result->b_private = inode;
|
|
|
+ set_buffer_defer_completion(bh_result);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
STATIC int
|
|
|
__xfs_get_blocks(
|
|
|
struct inode *inode,
|
|
@@ -1331,21 +1347,19 @@ __xfs_get_blocks(
|
|
|
goto out_unlock;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * For unwritten extents do not report a disk address in the buffered
|
|
|
+ * read case (treat as if we're reading into a hole).
|
|
|
+ */
|
|
|
if (imap.br_startblock != HOLESTARTBLOCK &&
|
|
|
- imap.br_startblock != DELAYSTARTBLOCK) {
|
|
|
- /*
|
|
|
- * For unwritten extents do not report a disk address on
|
|
|
- * the read case (treat as if we're reading into a hole).
|
|
|
- */
|
|
|
- if (create || !ISUNWRITTEN(&imap))
|
|
|
- xfs_map_buffer(inode, bh_result, &imap, offset);
|
|
|
- if (create && ISUNWRITTEN(&imap)) {
|
|
|
- if (direct) {
|
|
|
- bh_result->b_private = inode;
|
|
|
- set_buffer_defer_completion(bh_result);
|
|
|
- }
|
|
|
+ imap.br_startblock != DELAYSTARTBLOCK &&
|
|
|
+ (create || !ISUNWRITTEN(&imap))) {
|
|
|
+ xfs_map_buffer(inode, bh_result, &imap, offset);
|
|
|
+ if (ISUNWRITTEN(&imap))
|
|
|
set_buffer_unwritten(bh_result);
|
|
|
- }
|
|
|
+ /* direct IO needs special help */
|
|
|
+ if (create && direct)
|
|
|
+ xfs_map_direct(inode, bh_result, &imap, offset);
|
|
|
}
|
|
|
|
|
|
/*
|