* contents of the file are flushed to disk then the files
                 * may be full of holes (ie NULL files bug).
                 */
-               error = xfs_itruncate_extents(&tp, ip, XFS_DATA_FORK,
-                                             XFS_ISIZE(ip));
+               error = xfs_itruncate_extents_nodiscard(&tp, ip, XFS_DATA_FORK,
+                                                       XFS_ISIZE(ip));
                if (error) {
                        /*
                         * If we get an error at this point we simply don't
 
  * dirty on error so that transactions can be easily aborted if possible.
  */
 int
-xfs_itruncate_extents(
+__xfs_itruncate_extents(
        struct xfs_trans        **tpp,
        struct xfs_inode        *ip,
        int                     whichfork,
-       xfs_fsize_t             new_size)
+       xfs_fsize_t             new_size,
+       bool                    skip_discard)
 {
        struct xfs_mount        *mp = ip->i_mount;
        struct xfs_trans        *tp = *tpp;
        xfs_filblks_t           unmap_len;
        int                     error = 0;
        int                     done = 0;
+       int                     flags;
 
        ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
        ASSERT(!atomic_read(&VFS_I(ip)->i_count) ||
 
        trace_xfs_itruncate_extents_start(ip, new_size);
 
+       flags = xfs_bmapi_aflag(whichfork);
+       if (skip_discard)
+               flags |= XFS_BMAPI_NODISCARD;
+
        /*
         * Since it is possible for space to become allocated beyond
         * the end of the file (in a crash where the space is allocated
        unmap_len = last_block - first_unmap_block + 1;
        while (!done) {
                xfs_defer_init(&dfops, &first_block);
-               error = xfs_bunmapi(tp, ip,
-                                   first_unmap_block, unmap_len,
-                                   xfs_bmapi_aflag(whichfork),
-                                   XFS_ITRUNC_MAX_EXTENTS,
-                                   &first_block, &dfops,
-                                   &done);
+               error = xfs_bunmapi(tp, ip, first_unmap_block, unmap_len, flags,
+                                   XFS_ITRUNC_MAX_EXTENTS, &first_block,
+                                   &dfops, &done);
                if (error)
                        goto out_bmap_cancel;
 
 
 uint           xfs_ip2xflags(struct xfs_inode *);
 int            xfs_ifree(struct xfs_trans *, xfs_inode_t *,
                           struct xfs_defer_ops *);
-int            xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *,
-                                     int, xfs_fsize_t);
+int            __xfs_itruncate_extents(struct xfs_trans **, struct xfs_inode *,
+                                       int, xfs_fsize_t, bool);
 void           xfs_iext_realloc(xfs_inode_t *, int, int);
 
 void           xfs_iunpin_wait(xfs_inode_t *);
                               xfs_nlink_t, dev_t, prid_t,
                               struct xfs_inode **);
 
+static inline int
+xfs_itruncate_extents(
+       struct xfs_trans        **tpp,
+       struct xfs_inode        *ip,
+       int                     whichfork,
+       xfs_fsize_t             new_size)
+{
+       return __xfs_itruncate_extents(tpp, ip, whichfork, new_size, false);
+}
+
+static inline int
+xfs_itruncate_extents_nodiscard(
+       struct xfs_trans        **tpp,
+       struct xfs_inode        *ip,
+       int                     whichfork,
+       xfs_fsize_t             new_size)
+{
+       return __xfs_itruncate_extents(tpp, ip, whichfork, new_size, true);
+}
+
 /* from xfs_file.c */
 enum xfs_prealloc_flags {
        XFS_PREALLOC_SET        = (1 << 1),