ocfs2: Read from an unwritten extent returns zeros

Return an optional extent flags field from our lookup functions and wire up
callers to treat unwritten regions as holes for the purpose of returning
zeros to the user.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
index 0eab0d3..412a288 100644
--- a/fs/ocfs2/alloc.c
+++ b/fs/ocfs2/alloc.c
@@ -3487,6 +3487,7 @@
 {
 	int i, numpages = 0, ret = 0;
 	unsigned int csize = OCFS2_SB(inode->i_sb)->s_clustersize;
+	unsigned int ext_flags;
 	struct super_block *sb = inode->i_sb;
 	struct address_space *mapping = inode->i_mapping;
 	unsigned long index;
@@ -3499,7 +3500,7 @@
 		goto out;
 
 	ret = ocfs2_extent_map_get_blocks(inode, isize >> sb->s_blocksize_bits,
-					  phys, NULL);
+					  phys, NULL, &ext_flags);
 	if (ret) {
 		mlog_errno(ret);
 		goto out;
@@ -3509,6 +3510,11 @@
 	if (*phys == 0)
 		goto out;
 
+	/* Tail is marked as unwritten, we can count on write to zero
+	 * in that case. */
+	if (ext_flags & OCFS2_EXT_UNWRITTEN)
+		goto out;
+
 	next_cluster_bytes = ocfs2_align_bytes_to_clusters(inode->i_sb, isize);
 	index = isize >> PAGE_CACHE_SHIFT;
 	do {
@@ -3579,9 +3585,6 @@
 		goto out;
 	}
 
-	/*
-	 * Truncate on an i_size boundary - nothing more to do.
-	 */
 	if (numpages == 0)
 		goto out;