Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b93b6e43 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Christoph Hellwig
Browse files

xfs: make sure to free the real-time inodes in the mount error path



When mount fails 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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarFelix Blyakher <felixb@sgi.com>
parent f9057e3d
Loading
Loading
Loading
Loading
+7 −8
Original line number Diff line number Diff line
@@ -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);

	/*
+10 −0
Original line number Diff line number Diff line
@@ -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.
+4 −0
Original line number Diff line number Diff line
@@ -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__ */