xfs
[Top] [All Lists]

Re: [PATCH 08/14] xfsprogs: free resources in libxfs_alloc_file_space er

To: Eric Sandeen <sandeen@xxxxxxxxxx>
Subject: Re: [PATCH 08/14] xfsprogs: free resources in libxfs_alloc_file_space error paths
From: Brian Foster <bfoster@xxxxxxxxxx>
Date: Fri, 11 Apr 2014 15:03:31 -0400
Cc: xfs@xxxxxxxxxxx
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1396999504-13769-9-git-send-email-sandeen@xxxxxxxxxx>
References: <1396999504-13769-1-git-send-email-sandeen@xxxxxxxxxx> <1396999504-13769-9-git-send-email-sandeen@xxxxxxxxxx>
User-agent: Mutt/1.5.21 (2010-09-15)
On Tue, Apr 08, 2014 at 06:24:58PM -0500, Eric Sandeen wrote:
> The bmap freelist & transaction pointer weren't
> being freed in libxfs_alloc_file_space error paths;
> more or less copy the error handling that exists
> in kernelspace to resolve this.
> 
> Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>
> ---
>  libxfs/util.c |   20 +++++++++++++++++---
>  1 files changed, 17 insertions(+), 3 deletions(-)
> 
> diff --git a/libxfs/util.c b/libxfs/util.c
> index 1b05540..f1aa4c6 100644
> --- a/libxfs/util.c
> +++ b/libxfs/util.c
> @@ -582,8 +582,17 @@ libxfs_alloc_file_space(
>               resblks = (uint)XFS_DIOSTRAT_SPACE_RES(mp, datablocks);
>               error = xfs_trans_reserve(tp, &M_RES(mp)->tr_write,
>                                         resblks, 0);
> -             if (error)
> +             /*
> +              * Check for running out of space
> +              */
> +             if (error) {
> +                     /*
> +                      * Free the transaction structure.
> +                      */
> +                     ASSERT(error == ENOSPC); /* XXX ERS? */

XXX ?

> +                     xfs_trans_cancel(tp, 0);
>                       break;
> +             }
>               xfs_trans_ijoin(tp, ip, 0);
>               xfs_trans_ihold(tp, ip);
>  
> @@ -593,12 +602,12 @@ libxfs_alloc_file_space(
>                               &reccount, &free_list);
>  
>               if (error)
> -                     break;
> +                     goto error0;
>  
>               /* complete the transaction */
>               error = xfs_bmap_finish(&tp, &free_list, &committed);
>               if (error)
> -                     break;
> +                     goto error0;
>  
>               error = xfs_trans_commit(tp, 0);
>               if (error)
> @@ -612,6 +621,11 @@ libxfs_alloc_file_space(
>               allocatesize_fsb -= allocated_fsb;
>       }
>       return error;
> +
> +error0:      /* Cancel bmap, unlock inode, cancel trans */

Nit, but since it appears we don't lock the inode, the comment is wrong.

Brian

> +     xfs_bmap_cancel(&free_list);
> +     xfs_trans_cancel(tp, 0);
> +     return error;
>  }
>  
>  unsigned int
> -- 
> 1.7.1
> 
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs

<Prev in Thread] Current Thread [Next in Thread>