diff options
Diffstat (limited to 'fs/xfs/xfs_trans.c')
| -rw-r--r-- | fs/xfs/xfs_trans.c | 31 | 
1 files changed, 20 insertions, 11 deletions
| diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index 7adcdf15ae0c..103b00c90004 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c @@ -681,7 +681,6 @@ xfs_trans_reserve(  	uint		flags,  	uint		logcount)  { -	int		log_flags;  	int		error = 0;  	int		rsvd = (tp->t_flags & XFS_TRANS_RESERVE) != 0; @@ -707,24 +706,32 @@ xfs_trans_reserve(  	 * Reserve the log space needed for this transaction.  	 */  	if (logspace > 0) { -		ASSERT((tp->t_log_res == 0) || (tp->t_log_res == logspace)); -		ASSERT((tp->t_log_count == 0) || -			(tp->t_log_count == logcount)); +		bool	permanent = false; + +		ASSERT(tp->t_log_res == 0 || tp->t_log_res == logspace); +		ASSERT(tp->t_log_count == 0 || tp->t_log_count == logcount); +  		if (flags & XFS_TRANS_PERM_LOG_RES) { -			log_flags = XFS_LOG_PERM_RESERV;  			tp->t_flags |= XFS_TRANS_PERM_LOG_RES; +			permanent = true;  		} else {  			ASSERT(tp->t_ticket == NULL);  			ASSERT(!(tp->t_flags & XFS_TRANS_PERM_LOG_RES)); -			log_flags = 0;  		} -		error = xfs_log_reserve(tp->t_mountp, logspace, logcount, -					&tp->t_ticket, -					XFS_TRANSACTION, log_flags, tp->t_type); -		if (error) { -			goto undo_blocks; +		if (tp->t_ticket != NULL) { +			ASSERT(flags & XFS_TRANS_PERM_LOG_RES); +			error = xfs_log_regrant(tp->t_mountp, tp->t_ticket); +		} else { +			error = xfs_log_reserve(tp->t_mountp, logspace, +						logcount, &tp->t_ticket, +						XFS_TRANSACTION, permanent, +						tp->t_type);  		} + +		if (error) +			goto undo_blocks; +  		tp->t_log_res = logspace;  		tp->t_log_count = logcount;  	} @@ -752,6 +759,8 @@ xfs_trans_reserve(  	 */  undo_log:  	if (logspace > 0) { +		int		log_flags; +  		if (flags & XFS_TRANS_PERM_LOG_RES) {  			log_flags = XFS_LOG_REL_PERM_RESERV;  		} else { | 
