mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-09-22 09:34:56 +02:00
xfs: fix ilock leak on error in xfs_dq_get_next_id
commit63320a0f70upstream. xfs_dq_get_next_id() takes the quota inode ILOCK before calling xfs_iread_extents(). If xfs_iread_extents() fails, the function returns immediately without releasing the lock, leaking the quota inode ILOCK. This can leave the quota inode locked and cause subsequent quota operations to hang. Fix this by jumping to a common unlock path on error instead of returning directly. Fixes:bda250dbaf("xfs: rewrite xfs_dq_get_next_id using xfs_iext_lookup_extent") Cc: stable@vger.kernel.org # v4.12 Signed-off-by: Long Li <leo.lilong@huawei.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Carlos Maiolino <cem@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
472cfa4ba2
commit
ed8bfb43de
+2
-1
@@ -723,7 +723,7 @@ xfs_dq_get_next_id(
|
||||
lock_flags = xfs_ilock_data_map_shared(quotip);
|
||||
error = xfs_iread_extents(NULL, quotip, XFS_DATA_FORK);
|
||||
if (error)
|
||||
return error;
|
||||
goto out_unlock;
|
||||
|
||||
if (xfs_iext_lookup_extent(quotip, "ip->i_df, start, &cur, &got)) {
|
||||
/* contiguous chunk, bump startoff for the id calculation */
|
||||
@@ -734,6 +734,7 @@ xfs_dq_get_next_id(
|
||||
error = -ENOENT;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
xfs_iunlock(quotip, lock_flags);
|
||||
|
||||
return error;
|
||||
|
||||
Reference in New Issue
Block a user