bh_result->b_bdev = iomap.iomap_target->bt_bdev;
 
        /*
-        * If we previously allocated a block out beyond eof and we are
-        * now coming back to use it then we will need to flag it as new
-        * even if it has a disk address.
+        * If we previously allocated a block out beyond eof and we are now
+        * coming back to use it then we will need to flag it as new even if it
+        * has a disk address.
+        *
+        * With sub-block writes into unwritten extents we also need to mark
+        * the buffer as new so that the unwritten parts of the buffer gets
+        * correctly zeroed.
         */
        if (create &&
            ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) ||
-            (offset >= i_size_read(inode)) || (iomap.iomap_flags & IOMAP_NEW)))
+            (offset >= i_size_read(inode)) ||
+            (iomap.iomap_flags & (IOMAP_NEW|IOMAP_UNWRITTEN))))
                set_buffer_new(bh_result);
 
        if (iomap.iomap_flags & IOMAP_DELAY) {