ocfs2: fix inode leak
authorMark Fasheh <mark.fasheh@oracle.com>
Thu, 10 May 2007 00:34:26 +0000 (17:34 -0700)
committerMark Fasheh <mark.fasheh@oracle.com>
Fri, 25 May 2007 18:00:46 +0000 (11:00 -0700)
We weren't cleaning up our inode reference on error in
ocfs2_reserve_local_alloc_bits(). Add a check for error return and iput() if
need be. Move the code to set the alloc context inode info to the end of the
function so we don't have any possibility of passing back a bad pointer.

Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
fs/ocfs2/localalloc.c

index 4dedd9789108193eee3b107c84053270255e5a9b..545f7892cdf39b645888e12fa8614598dbb86bfb 100644 (file)
@@ -471,9 +471,6 @@ int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb,
 
        mutex_lock(&local_alloc_inode->i_mutex);
 
-       ac->ac_inode = local_alloc_inode;
-       ac->ac_which = OCFS2_AC_USE_LOCAL;
-
        if (osb->local_alloc_state != OCFS2_LA_ENABLED) {
                status = -ENOSPC;
                goto bail;
@@ -511,10 +508,14 @@ int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb,
                }
        }
 
+       ac->ac_inode = local_alloc_inode;
+       ac->ac_which = OCFS2_AC_USE_LOCAL;
        get_bh(osb->local_alloc_bh);
        ac->ac_bh = osb->local_alloc_bh;
        status = 0;
 bail:
+       if (status < 0 && local_alloc_inode)
+               iput(local_alloc_inode);
 
        mlog_exit(status);
        return status;