return 0;
start = fe.fe_logical >> inode->i_blkbits;
+ if (fei.fi_extents_mapped == 0) {
+ /* a special case - no extent found at this offset and forward.
+ * we can consider this as a hole to EOF. it's safe to cache
+ * as other threads can not allocate/punch blocks this thread
+ * is working on (LDLM). */
+ cached_extent->start = block;
+ cached_extent->end = i_size_read(inode) >> inode->i_blkbits;
+ cached_extent->mapped = 0;
+ return 0;
+ }
if (start > block) {
cached_extent->start = block;
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;
- /* Create and Write zeros to new extents */
- flags = LDISKFS_GET_BLOCKS_CREATE_ZERO;
+ /* 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;