diff options
author | Michal Marek <mmarek@suse.cz> | 2007-07-10 21:10:19 -0400 |
---|---|---|
committer | Tim Shimmin <tes@chook.melbourne.sgi.com> | 2007-07-14 01:42:50 -0400 |
commit | faa63e9584df41020440756b8b90b7b63f95e4f6 (patch) | |
tree | 9b0369a028d682e36ab91396bcebb1ecfb298e29 /fs/xfs/xfs_itable.h | |
parent | 1fa503df66f7bffc0ff62662626897eec79446c2 (diff) |
[XFS] Fix XFS_IOC_FSBULKSTAT{,_SINGLE} & XFS_IOC_FSINUMBERS in compat mode
* 32bit struct xfs_fsop_bulkreq has different size and layout of
members, no matter the alignment. Move the code out of the #else
branch (why was it there in the first place?). Define _32 variants of
the ioctl constants.
* 32bit struct xfs_bstat is different because of time_t and on
i386 because of different padding. Make xfs_bulkstat_one() accept a
custom "output formatter" in the private_data argument which takes care
of the xfs_bulkstat_one_compat() that takes care of the different
layout in the compat case.
* i386 struct xfs_inogrp has different padding.
Add a similar "output formatter" mecanism to xfs_inumbers().
SGI-PV: 967354
SGI-Modid: xfs-linux-melb:xfs-kern:29102a
Signed-off-by: Michal Marek <mmarek@suse.cz>
Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Tim Shimmin <tes@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_itable.h')
-rw-r--r-- | fs/xfs/xfs_itable.h | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/fs/xfs/xfs_itable.h b/fs/xfs/xfs_itable.h index f25a28862a17..a1f18fce9b70 100644 --- a/fs/xfs/xfs_itable.h +++ b/fs/xfs/xfs_itable.h | |||
@@ -69,6 +69,10 @@ xfs_bulkstat_single( | |||
69 | char __user *buffer, | 69 | char __user *buffer, |
70 | int *done); | 70 | int *done); |
71 | 71 | ||
72 | typedef int (*bulkstat_one_fmt_pf)( /* used size in bytes or negative error */ | ||
73 | void __user *ubuffer, /* buffer to write to */ | ||
74 | const xfs_bstat_t *buffer); /* buffer to read from */ | ||
75 | |||
72 | int | 76 | int |
73 | xfs_bulkstat_one( | 77 | xfs_bulkstat_one( |
74 | xfs_mount_t *mp, | 78 | xfs_mount_t *mp, |
@@ -86,11 +90,25 @@ xfs_internal_inum( | |||
86 | xfs_mount_t *mp, | 90 | xfs_mount_t *mp, |
87 | xfs_ino_t ino); | 91 | xfs_ino_t ino); |
88 | 92 | ||
93 | typedef int (*inumbers_fmt_pf)( | ||
94 | void __user *ubuffer, /* buffer to write to */ | ||
95 | const xfs_inogrp_t *buffer, /* buffer to read from */ | ||
96 | long count, /* # of elements to read */ | ||
97 | long *written); /* # of bytes written */ | ||
98 | |||
99 | int | ||
100 | xfs_inumbers_fmt( | ||
101 | void __user *ubuffer, /* buffer to write to */ | ||
102 | const xfs_inogrp_t *buffer, /* buffer to read from */ | ||
103 | long count, /* # of elements to read */ | ||
104 | long *written); /* # of bytes written */ | ||
105 | |||
89 | int /* error status */ | 106 | int /* error status */ |
90 | xfs_inumbers( | 107 | xfs_inumbers( |
91 | xfs_mount_t *mp, /* mount point for filesystem */ | 108 | xfs_mount_t *mp, /* mount point for filesystem */ |
92 | xfs_ino_t *last, /* last inode returned */ | 109 | xfs_ino_t *last, /* last inode returned */ |
93 | int *count, /* size of buffer/count returned */ | 110 | int *count, /* size of buffer/count returned */ |
94 | xfs_inogrp_t __user *buffer);/* buffer with inode info */ | 111 | void __user *buffer, /* buffer with inode info */ |
112 | inumbers_fmt_pf formatter); | ||
95 | 113 | ||
96 | #endif /* __XFS_ITABLE_H__ */ | 114 | #endif /* __XFS_ITABLE_H__ */ |