diff options
author | David Chinner <dgc@sgi.com> | 2005-09-02 02:40:47 -0400 |
---|---|---|
committer | Nathan Scott <nathans@sgi.com> | 2005-09-02 02:40:47 -0400 |
commit | 3bdbfb104e53b367892cc9510e6722346dfb656b (patch) | |
tree | f4528809d197fc687a73b8152fab8356540455ba /fs | |
parent | bcec2b7f2bf856bdf2a8780a57fe78417a513682 (diff) |
[XFS] Prevent the incore superblock sb_fdblocks count from leaking when we
are getting ENOSPC errors on writes. When we fail to allocate space for
indirect blocks in xfs_bmapi() make sure we release the direct block
allocation before returning.
SGI-PV: 938502
SGI-Modid: xfs-linux:xfs-kern:22986a
Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Nathan Scott <nathans@sgi.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/xfs_bmap.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 6f5d283888aa..3e76def1283d 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
@@ -4754,10 +4754,20 @@ xfs_bmapi( | |||
4754 | error = xfs_mod_incore_sb(mp, | 4754 | error = xfs_mod_incore_sb(mp, |
4755 | XFS_SBS_FDBLOCKS, | 4755 | XFS_SBS_FDBLOCKS, |
4756 | -(alen), rsvd); | 4756 | -(alen), rsvd); |
4757 | if (!error) | 4757 | if (!error) { |
4758 | error = xfs_mod_incore_sb(mp, | 4758 | error = xfs_mod_incore_sb(mp, |
4759 | XFS_SBS_FDBLOCKS, | 4759 | XFS_SBS_FDBLOCKS, |
4760 | -(indlen), rsvd); | 4760 | -(indlen), rsvd); |
4761 | if (error && rt) { | ||
4762 | xfs_mod_incore_sb(ip->i_mount, | ||
4763 | XFS_SBS_FREXTENTS, | ||
4764 | extsz, rsvd); | ||
4765 | } else if (error) { | ||
4766 | xfs_mod_incore_sb(ip->i_mount, | ||
4767 | XFS_SBS_FDBLOCKS, | ||
4768 | alen, rsvd); | ||
4769 | } | ||
4770 | } | ||
4761 | 4771 | ||
4762 | if (error) { | 4772 | if (error) { |
4763 | if (XFS_IS_QUOTA_ON(ip->i_mount)) | 4773 | if (XFS_IS_QUOTA_ON(ip->i_mount)) |