> diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c
> index 50753d3..504a804 100644
> --- a/fs/xfs/xfs_trans.c
> +++ b/fs/xfs/xfs_trans.c
> @@ -1754,15 +1754,26 @@ xfs_trans_commit_cil(
> */
> log_vector = xfs_trans_alloc_log_vecs(tp);
> if (!log_vector)
> - return ENOMEM;
> + goto out_enomem;
>
> error = xfs_log_commit_cil(mp, tp, log_vector, commit_lsn, flags);
> - if (error)
> - return error;
> + if (error) {
> + /*
> + * We will only get an error if no modifications have been
> + * made to the items in the transaction. Hence treat it
> + the same as a memory allocation failure.
> + */
> + goto out_enomem;
> + }
>
> current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
> xfs_trans_free(tp);
> return 0;
> +
> +out_enomem:
> + /* caller cleans up transaction */
> + current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS);
> + return ENOMEM;
_xfs_trans_commit already restores the process flags for an ENOMEM
return, so the failure from xfs_trans_alloc_log_vecs is already
handled correctly. If we want to handle the EIO return from
xfs_log_commit_cil the same way it just needs to be turned into an
ENOMEM. The big questions is if there's any point in having the
shutdown check in xfs_trans_commit_cil - we already do one just before
applying the trans deltas in _xfs_trans_commit, which is handled
correctly and should be sufficient.
|