diff options
author | Yingping Lu <yingping@sgi.com> | 2006-01-10 23:38:31 -0500 |
---|---|---|
committer | Nathan Scott <nathans@sgi.com> | 2006-01-10 23:38:31 -0500 |
commit | 68bdb6eabcd2869caa795019961a5445a11b5bc1 (patch) | |
tree | 5731c3af7454bca3c3d20604085d16545c98f046 /fs | |
parent | a6867a6815fa0241848d4620f2dbd2954f4405d7 (diff) |
[XFS] Fixed delayed_blks assert failure during umount. The delayed_blks
was caused by ENOSPC but not Rreclaimed by xfs_release or xfs_inactive.
The fix changed the condition in xfs_release and xfs_inactive to invoke
xfs_inactive_free_eofblocks for this special case, changed
xfs_inactive_free_eofblocks to clean the delayed blks after eof. It also
changed xfs_write to set correct eof when ENOSPC occurs.
SGI-PV: 946267
SGI-Modid: xfs-linux-melb:xfs-kern:203788a
Signed-off-by: Yingping Lu <yingping@sgi.com>
Signed-off-by: Nathan Scott <nathans@sgi.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_lrw.c | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 9 |
2 files changed, 10 insertions, 3 deletions
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 563cb9e975d2..147a28861f6b 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
@@ -809,6 +809,10 @@ retry: | |||
809 | goto retry; | 809 | goto retry; |
810 | } | 810 | } |
811 | 811 | ||
812 | isize = i_size_read(inode); | ||
813 | if (unlikely(ret < 0 && ret != -EFAULT && *offset > isize)) | ||
814 | *offset = isize; | ||
815 | |||
812 | if (*offset > xip->i_d.di_size) { | 816 | if (*offset > xip->i_d.di_size) { |
813 | xfs_ilock(xip, XFS_ILOCK_EXCL); | 817 | xfs_ilock(xip, XFS_ILOCK_EXCL); |
814 | if (*offset > xip->i_d.di_size) { | 818 | if (*offset > xip->i_d.di_size) { |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 688fc2cb4b8d..3e8f1cbb7049 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -1213,7 +1213,8 @@ xfs_inactive_free_eofblocks( | |||
1213 | xfs_iunlock(ip, XFS_ILOCK_SHARED); | 1213 | xfs_iunlock(ip, XFS_ILOCK_SHARED); |
1214 | 1214 | ||
1215 | if (!error && (nimaps != 0) && | 1215 | if (!error && (nimaps != 0) && |
1216 | (imap.br_startblock != HOLESTARTBLOCK)) { | 1216 | (imap.br_startblock != HOLESTARTBLOCK || |
1217 | ip->i_delayed_blks)) { | ||
1217 | /* | 1218 | /* |
1218 | * Attach the dquots to the inode up front. | 1219 | * Attach the dquots to the inode up front. |
1219 | */ | 1220 | */ |
@@ -1548,7 +1549,8 @@ xfs_release( | |||
1548 | 1549 | ||
1549 | if (ip->i_d.di_nlink != 0) { | 1550 | if (ip->i_d.di_nlink != 0) { |
1550 | if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && | 1551 | if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && |
1551 | ((ip->i_d.di_size > 0) || (VN_CACHED(vp) > 0)) && | 1552 | ((ip->i_d.di_size > 0) || (VN_CACHED(vp) > 0 || |
1553 | ip->i_delayed_blks > 0)) && | ||
1552 | (ip->i_df.if_flags & XFS_IFEXTENTS)) && | 1554 | (ip->i_df.if_flags & XFS_IFEXTENTS)) && |
1553 | (!(ip->i_d.di_flags & | 1555 | (!(ip->i_d.di_flags & |
1554 | (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { | 1556 | (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)))) { |
@@ -1627,7 +1629,8 @@ xfs_inactive( | |||
1627 | 1629 | ||
1628 | if (ip->i_d.di_nlink != 0) { | 1630 | if (ip->i_d.di_nlink != 0) { |
1629 | if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && | 1631 | if ((((ip->i_d.di_mode & S_IFMT) == S_IFREG) && |
1630 | ((ip->i_d.di_size > 0) || (VN_CACHED(vp) > 0)) && | 1632 | ((ip->i_d.di_size > 0) || (VN_CACHED(vp) > 0 || |
1633 | ip->i_delayed_blks > 0)) && | ||
1631 | (ip->i_df.if_flags & XFS_IFEXTENTS) && | 1634 | (ip->i_df.if_flags & XFS_IFEXTENTS) && |
1632 | (!(ip->i_d.di_flags & | 1635 | (!(ip->i_d.di_flags & |
1633 | (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || | 1636 | (XFS_DIFLAG_PREALLOC | XFS_DIFLAG_APPEND)) || |