diff options
author | Jie Liu <jeff.liu@oracle.com> | 2013-10-25 14:52:44 +0800 |
---|---|---|
committer | Jiri Slaby <jslaby@suse.cz> | 2014-07-04 10:06:58 +0200 |
commit | 67820ad00235119639737a7a4bcf4e526de43d54 (patch) | |
tree | aa29fbe4838c31db316b4d58be43dd853b85bc88 /fs | |
parent | 9af76725ffcc8517643fd07d379f4a1232f6ae92 (diff) |
xfs: fix the extent count when allocating an new indirection array entry
commit bb86d21cba22a045b09d11b71decf5ca7c3d5def upstream.
At xfs_iext_add(), if extent(s) are being appended to the last page in
the indirection array and the new extent(s) don't fit in the page, the
number of extents(erp->er_extcount) in a new allocated entry should be
the minimum value between count and XFS_LINEAR_EXTS, instead of count.
For now, there is no existing test case can demonstrates a problem with
the er_extcount being set incorrectly here, but it obviously like a bug.
Signed-off-by: Jie Liu <jeff.liu@oracle.com>
Reviewed-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Ben Myers <bpm@sgi.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/xfs_inode_fork.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/xfs/xfs_inode_fork.c b/fs/xfs/xfs_inode_fork.c index 4fa56fcb38d1..6829134de253 100644 --- a/fs/xfs/xfs_inode_fork.c +++ b/fs/xfs/xfs_inode_fork.c @@ -1031,15 +1031,14 @@ xfs_iext_add( * the next index needed in the indirection array. */ else { - int count = ext_diff; + uint count = ext_diff; while (count) { erp = xfs_iext_irec_new(ifp, erp_idx); - erp->er_extcount = count; - count -= MIN(count, (int)XFS_LINEAR_EXTS); - if (count) { + erp->er_extcount = min(count, XFS_LINEAR_EXTS); + count -= erp->er_extcount; + if (count) erp_idx++; - } } } } |