summaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_itable.h
diff options
context:
space:
mode:
authorDave Chinner <dchinner@redhat.com>2014-11-07 08:30:30 +1100
committerDave Chinner <david@fromorbit.com>2014-11-07 08:30:30 +1100
commitbf4a5af20d25ecc8876978ad34b8db83b4235f3c (patch)
tree0eb16d3c6176c769c2f8802422fa94bdf72fb209 /fs/xfs/xfs_itable.h
parentafa947cb52a8e73fe71915a0b0af6fcf98dfbe1a (diff)
downloadlinux-bf4a5af20d25ecc8876978ad34b8db83b4235f3c.tar.gz
linux-bf4a5af20d25ecc8876978ad34b8db83b4235f3c.tar.bz2
linux-bf4a5af20d25ecc8876978ad34b8db83b4235f3c.zip
xfs: bulkstat chunk formatting cursor is broken
The xfs_bulkstat_agichunk formatting cursor takes buffer values from the main loop and passes them via the structure to the chunk formatter, and the writes the changed values back into the main loop local variables. Unfortunately, this complex dance is full of corner cases that aren't handled correctly. The biggest problem is that it is double handling the information in both the main loop and the chunk formatting function, leading to inconsistent updates and endless loops where progress is not made. To fix this, push the struct xfs_bulkstat_agichunk outwards to be the primary holder of user buffer information. this removes the double handling in the main loop. Also, pass the last inode processed by the chunk formatter as a separate parameter as it purely an output variable and is not related to the user buffer consumption cursor. Finally, the chunk formatting code is not shared by anyone, so make it local to xfs_itable.c. cc: <stable@vger.kernel.org> # 3.17 Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Brian Foster <bfoster@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/xfs_itable.h')
-rw-r--r--fs/xfs/xfs_itable.h16
1 files changed, 0 insertions, 16 deletions
diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h
index aaed08022eb9..6ea8b3912fa4 100644
--- a/fs/xfs/xfs_itable.h
+++ b/fs/xfs/xfs_itable.h
@@ -30,22 +30,6 @@ typedef int (*bulkstat_one_pf)(struct xfs_mount *mp,
int *ubused,
int *stat);
-struct xfs_bulkstat_agichunk {
- xfs_ino_t ac_lastino; /* last inode returned */
- char __user **ac_ubuffer;/* pointer into user's buffer */
- int ac_ubleft; /* bytes left in user's buffer */
- int ac_ubelem; /* spaces used in user's buffer */
-};
-
-int
-xfs_bulkstat_ag_ichunk(
- struct xfs_mount *mp,
- xfs_agnumber_t agno,
- struct xfs_inobt_rec_incore *irbp,
- bulkstat_one_pf formatter,
- size_t statstruct_size,
- struct xfs_bulkstat_agichunk *acp);
-
/*
* Values for stat return value.
*/