This function is similar to xfs_attr_rmtval_remove, but adapted to return EAGAIN for new transactions. We will use this later when we introduce delayed attributes Signed-off-by: Allison Collins <allison.henderson@xxxxxxxxxx> --- libxfs/xfs_attr_remote.c | 28 ++++++++++++++++++++++++++++ libxfs/xfs_attr_remote.h | 1 + 2 files changed, 29 insertions(+) diff --git a/libxfs/xfs_attr_remote.c b/libxfs/xfs_attr_remote.c index cfeca71..5b92f2d 100644 --- a/libxfs/xfs_attr_remote.c +++ b/libxfs/xfs_attr_remote.c @@ -681,3 +681,31 @@ xfs_attr_rmtval_remove( } return 0; } + +/* + * Remove the value associated with an attribute by deleting the out-of-line + * buffer that it is stored on. Returns EAGAIN for the caller to refresh the + * transaction and recall the function + */ +int +xfs_attr_rmtval_unmap( + struct xfs_da_args *args) +{ + int error, done; + + /* + * Unmap value blocks for this attr. This is similar to + * xfs_attr_rmtval_remove, but open coded here to return EAGAIN + * for new transactions + */ + error = xfs_bunmapi(args->trans, args->dp, + args->rmtblkno, args->rmtblkcnt, + XFS_BMAPI_ATTRFORK, 1, &done); + if (error) + return error; + + if (!done) + return -EAGAIN; + + return 0; +} diff --git a/libxfs/xfs_attr_remote.h b/libxfs/xfs_attr_remote.h index 85f2593..7ab3770 100644 --- a/libxfs/xfs_attr_remote.h +++ b/libxfs/xfs_attr_remote.h @@ -12,4 +12,5 @@ int xfs_attr_rmtval_get(struct xfs_da_args *args); int xfs_attr_rmtval_set(struct xfs_da_args *args); int xfs_attr_rmtval_remove(struct xfs_da_args *args); int xfs_attr_rmtval_invalidate(struct xfs_da_args *args); +int xfs_attr_rmtval_unmap(struct xfs_da_args *args); #endif /* __XFS_ATTR_REMOTE_H__ */ -- 2.7.4