xfs
[Top] [All Lists]

[PATCH 02/17] xfs: make sure to free the real-time inodes in the mount e

To: xfs@xxxxxxxxxxx
Subject: [PATCH 02/17] xfs: make sure to free the real-time inodes in the mount error path
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Mon, 26 Jan 2009 02:31:38 -0500
References: <20090126073136.384490000@xxxxxxxxxxxxxxxxxxxxxx>
User-agent: quilt/0.47-1
When mount failes after allocating the real-time inodes we currently leak
them.  Add a new helper to free the real-time inodes which can be used by
both the mount and unmount path.


Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Index: xfs/fs/xfs/xfs_rtalloc.c
===================================================================
--- xfs.orig/fs/xfs/xfs_rtalloc.c       2009-01-24 18:02:17.458778944 +0100
+++ xfs/fs/xfs/xfs_rtalloc.c    2009-01-24 18:04:16.922779103 +0100
@@ -2288,6 +2288,16 @@ xfs_rtmount_inodes(
        return 0;
 }
 
+void
+xfs_rtunmount_inodes(
+       struct xfs_mount        *mp)
+{
+       if (mp->m_rbmip)
+               IRELE(mp->m_rbmip);
+       if (mp->m_rsumip)
+               IRELE(mp->m_rsumip);
+}
+
 /*
  * Pick an extent for allocation at the start of a new realtime file.
  * Use the sequence number stored in the atime field of the bitmap inode.
Index: xfs/fs/xfs/xfs_rtalloc.h
===================================================================
--- xfs.orig/fs/xfs/xfs_rtalloc.h       2009-01-24 18:02:17.462779035 +0100
+++ xfs/fs/xfs/xfs_rtalloc.h    2009-01-24 18:04:16.929904172 +0100
@@ -108,6 +108,9 @@ xfs_rtfree_extent(
 int                                    /* error */
 xfs_rtmount_init(
        struct xfs_mount        *mp);   /* file system mount structure */
+void
+xfs_rtunmount_inodes(
+       struct xfs_mount        *mp);
 
 /*
  * Get the bitmap and summary inodes into the mount structure
@@ -146,6 +149,7 @@ xfs_growfs_rt(
 # define xfs_growfs_rt(mp,in)                           (ENOSYS)
 # define xfs_rtmount_init(m)    (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS))
 # define xfs_rtmount_inodes(m)  (((mp)->m_sb.sb_rblocks == 0)? 0 : (ENOSYS))
+# define xfs_rtunmount_inodes(m)
 #endif /* CONFIG_XFS_RT */
 
 #endif /* __KERNEL__ */
Index: xfs/fs/xfs/xfs_mount.c
===================================================================
--- xfs.orig/fs/xfs/xfs_mount.c 2009-01-24 18:02:20.240779188 +0100
+++ xfs/fs/xfs/xfs_mount.c      2009-01-24 18:04:16.931903659 +0100
@@ -1138,7 +1138,7 @@ xfs_mountfs(
                error = xfs_mount_log_sb(mp, mp->m_update_flags);
                if (error) {
                        cmn_err(CE_WARN, "XFS: failed to write sb changes");
-                       goto out_rele_rip;
+                       goto out_rtunmount;
                }
        }
 
@@ -1147,7 +1147,7 @@ xfs_mountfs(
         */
        error = XFS_QM_INIT(mp, &quotamount, &quotaflags);
        if (error)
-               goto out_rele_rip;
+               goto out_rtunmount;
 
        /*
         * Finish recovering the file system.  This part needed to be
@@ -1157,7 +1157,7 @@ xfs_mountfs(
        error = xfs_log_mount_finish(mp);
        if (error) {
                cmn_err(CE_WARN, "XFS: log mount finish failed");
-               goto out_rele_rip;
+               goto out_rtunmount;
        }
 
        /*
@@ -1165,7 +1165,7 @@ xfs_mountfs(
         */
        error = XFS_QM_MOUNT(mp, quotamount, quotaflags);
        if (error)
-               goto out_rele_rip;
+               goto out_rtunmount;
 
        /*
         * Now we are mounted, reserve a small amount of unused space for
@@ -1189,6 +1189,8 @@ xfs_mountfs(
 
        return 0;
 
+ out_rtunmount:
+       xfs_rtunmount_inodes(mp);
  out_rele_rip:
        IRELE(rip);
  out_log_dealloc:
@@ -1219,10 +1221,7 @@ xfs_unmountfs(
         */
        XFS_QM_UNMOUNT(mp);
 
-       if (mp->m_rbmip)
-               IRELE(mp->m_rbmip);
-       if (mp->m_rsumip)
-               IRELE(mp->m_rsumip);
+       xfs_rtunmount_inodes(mp);
        IRELE(mp->m_rootip);
 
        /*

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