diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_discard.c')
| -rw-r--r-- | fs/xfs/linux-2.6/xfs_discard.c | 29 | 
1 files changed, 29 insertions, 0 deletions
diff --git a/fs/xfs/linux-2.6/xfs_discard.c b/fs/xfs/linux-2.6/xfs_discard.c index d61611c8801..244e797dae3 100644 --- a/fs/xfs/linux-2.6/xfs_discard.c +++ b/fs/xfs/linux-2.6/xfs_discard.c @@ -191,3 +191,32 @@ xfs_ioc_trim(  		return -XFS_ERROR(EFAULT);  	return 0;  } + +int +xfs_discard_extents( +	struct xfs_mount	*mp, +	struct list_head	*list) +{ +	struct xfs_busy_extent	*busyp; +	int			error = 0; + +	list_for_each_entry(busyp, list, list) { +		trace_xfs_discard_extent(mp, busyp->agno, busyp->bno, +					 busyp->length); + +		error = -blkdev_issue_discard(mp->m_ddev_targp->bt_bdev, +				XFS_AGB_TO_DADDR(mp, busyp->agno, busyp->bno), +				XFS_FSB_TO_BB(mp, busyp->length), +				GFP_NOFS, 0); +		if (error && error != EOPNOTSUPP) { +			xfs_info(mp, +	 "discard failed for extent [0x%llu,%u], error %d", +				 (unsigned long long)busyp->bno, +				 busyp->length, +				 error); +			return error; +		} +	} + +	return 0; +}  |