total++;
break;
}
+ if ((map.m_flags & LDISKFS_MAP_UNWRITTEN) &&
+ !create) {
+ /* don't try to read allocated, but
+ * unwritten blocks, instead fill the
+ * patches with zeros in osd_do_bio() */
+ *(blocks + total) = 0;
+ continue;
+ }
*(blocks + total) = map.m_pblk + c;
/* unmap any possible underlying
* metadata from the block device
if (mode & ~FALLOC_FL_KEEP_SIZE)
RETURN(-EOPNOTSUPP);
+ /* disable fallocate completely */
+ if (osd_dev(dt->do_lu.lo_dev)->od_fallocate_zero_blocks < 0)
+ RETURN(-EOPNOTSUPP);
+
LASSERT(th);
LASSERT(inode);
boff = start >> inode->i_blkbits;
blen = (ALIGN(end, 1 << inode->i_blkbits) >> inode->i_blkbits) - boff;
- flags = LDISKFS_GET_BLOCKS_CREATE;
+ /* Create and mark new extents as either zero or unwritten */
+ flags = osd_dev(dt->do_lu.lo_dev)->od_fallocate_zero_blocks ?
+ LDISKFS_GET_BLOCKS_CREATE_ZERO :
+ LDISKFS_GET_BLOCKS_CREATE_UNWRIT_EXT;
if (mode & FALLOC_FL_KEEP_SIZE)
flags |= LDISKFS_GET_BLOCKS_KEEP_SIZE;