xfs: create internal eofblocks structure with kuid_t types
PATCH v4 5/7 xfs: create internal eofblocks structure with kuid_t types
Have eofblocks ioctl convert uid_t to kuid_t into internal structure. Update internal filter matching to compare ids with kuid_t types.
--- fs/xfs/xfs_fs.h | 2 +- fs/xfs/xfs_icache.c | 6 +++--- fs/xfs/xfs_icache.h | 20 ++++++++++++++++++++ fs/xfs/xfs_ioctl.c | 15 +++++++++++++-- 4 files changed, 37 insertions(+), 6 deletions(-)
fs/xfs/xfs_fs.h +1 -1
@@ -344,7 +344,7 @@ typedef struct xfs_error_injection {* Speculative preallocation trimming. */ #define XFS_EOFBLOCKS_VERSION 1 -struct xfs_eofblocks { +struct xfs_fs_eofblocks {__u32 eof_version;__u32 eof_flags;uid_t eof_uid;
fs/xfs/xfs_icache.c +3 -3
@@ -619,7 +619,7 @@ restart:/* * Background scanning to trim post-EOF preallocated space. This is queued -* based on the 'background_prealloc_discard_period' tunable (5m by default). +* based on the 'speculative_prealloc_lifetime' tunable (5m by default). */ STATIC void xfs_queue_eofblocks(
@@ -1204,11 +1204,11 @@ xfs_inode_match_id( struct xfs_eofblocks *eofb) {if (eofb->eof_flags &XFS_EOF_FLAGS_UID && - ip->i_d.di_uid != eofb->eof_uid) + !uid_eq (VFS_I (ip)->i_uid, eofb->eof_uid))return 0 ;if (eofb->eof_flags &XFS_EOF_FLAGS_GID && - ip->i_d.di_gid != eofb->eof_gid) + !gid_eq (VFS_I (ip)->i_gid, eofb->eof_gid))return 0 ; if (eofb->eof_flags & XFS_EOF_FLAGS_PRID &&
fs/xfs/xfs_icache.h +20 -0
@@ -21,6 +21,14 @@struct xfs_mount ;struct xfs_perag ; +struct xfs_eofblocks { +__u32 eof_flags; +kuid_t eof_uid; +kgid_t eof_gid; +prid_t eof_prid; +__u64 eof_min_file_size; +}; +#define SYNC_WAIT 0x0001/* wait for i/o to complete */ #define SYNC_TRYLOCK 0x0002/* only try to lock inodes */
@@ -49,4 +57,16 @@ int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, int flags, void *args), int flags, void *args, int tag); +static inline void +xfs_fs_eofblocks_to_internal ( +struct xfs_fs_eofblocks *src, +struct xfs_eofblocks *dst) +{ + dst->eof_flags = src->eof_flags; + dst->eof_prid = src->eof_prid; + dst->eof_min_file_size = src->eof_min_file_size; + dst->eof_uid =make_kuid (current_user_ns (), src->eof_uid); + dst->eof_gid =make_kgid (current_user_ns (), src->eof_gid); +} +#endif
fs/xfs/xfs_ioctl.c +13 -2
@@ -1610,7 +1610,8 @@ xfs_file_ioctl(return -error;case XFS_IOC_FREE_EOFBLOCKS : { -struct xfs_eofblocks eofb; +struct xfs_fs_eofblocks eofb; +struct xfs_eofblocks keofb;if (copy_from_user (&eofb, arg,sizeof (eofb)))return -XFS_ERROR (EFAULT );
@@ -1625,7 +1626,17 @@ xfs_file_ioctl( memchr_inv(eofb.pad64, 0, sizeof(eofb.pad64))) return -XFS_ERROR(EINVAL); - error =xfs_icache_free_eofblocks (mp, &eofb); +xfs_fs_eofblocks_to_internal (&eofb, &keofb); + +if (keofb.eof_flags &XFS_EOF_FLAGS_UID && + !uid_valid (keofb.eof_uid)) +return XFS_ERROR (EINVAL ); + +if (keofb.eof_flags &XFS_EOF_FLAGS_GID && + !gid_valid (keofb.eof_gid)) +return XFS_ERROR (EINVAL ); + + error =xfs_icache_free_eofblocks (mp, &keofb);return -error; }
Signature · 6 lines
1.8.1.4 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 4 lines · Dwight Engen
Have eofblocks ioctl convert
uid_ttokuid_tinto internal structure. Update internal filter matching to compare ids withkuid_ttypes.Signed-off-by Dwight Engen <[email protected]>
....
fs/xfs/xfs_icache.h int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, · line 63
Quoted 5 lines
fs/xfs/xfs_icache.h +4
-0+static inline void +xfs_fs_eofblocks_to_internal ( +struct xfs_fs_eofblocks *src, +struct xfs_eofblocks *dst)
I'd prefer that be named xfs_fs_eofblocks_from_user() to make it clear that we don't trust the contents of src at all...
Quoted 27 lines
fs/xfs/xfs_icache.h +8
-0+{ + dst->eof_flags = src->eof_flags; + dst->eof_prid = src->eof_prid; + dst->eof_min_file_size = src->eof_min_file_size; + dst->eof_uid =make_kuid (current_user_ns (), src->eof_uid); + dst->eof_gid =make_kgid (current_user_ns (), src->eof_gid); +} +#endif fs/xfs/xfs_ioctl.c +2
-1@@ -1610,7 +1610,8 @@ xfs_file_ioctl(return -error;case XFS_IOC_FREE_EOFBLOCKS : { -struct xfs_eofblocks eofb; +struct xfs_fs_eofblocks eofb; +struct xfs_eofblocks keofb;if (copy_from_user (&eofb, arg,sizeof (eofb)))return -XFS_ERROR (EFAULT );@@ -1625,7 +1626,17 @@ xfs_file_ioctl( memchr_inv(eofb.pad64, 0, sizeof(eofb.pad64)))return -XFS_ERROR (EINVAL );
fs/xfs/xfs_ioctl.c xfs_file_ioctl( · line 1637
Quoted 10 lines
fs/xfs/xfs_ioctl.c +9
-1- error =xfs_icache_free_eofblocks (mp, &eofb); +xfs_fs_eofblocks_to_internal (&eofb, &keofb); + +if (keofb.eof_flags &XFS_EOF_FLAGS_UID && + !uid_valid (keofb.eof_uid)) +return XFS_ERROR (EINVAL ); + +if (keofb.eof_flags &XFS_EOF_FLAGS_GID && + !gid_valid (keofb.eof_gid)) +return XFS_ERROR (EINVAL );
And I think these two checks should be in xfs_fs_eofblocks_from_user(), hence pushing all the conversion and validation of the user-supplied parameters into the one function.
Also, we need to return negative errors from this function....
fs/xfs/xfs_ioctl.c xfs_file_ioctl( · line 1640
Quoted 2 lines
fs/xfs/xfs_ioctl.c +1
-0+ error =xfs_icache_free_eofblocks (mp, &keofb);return -error;
return -xfs_icache_free_eofblocks(mp, &keofb);
Cheers,
Dave.
Signature · 7 lines
Dave Chinner [email protected] _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 8 lines · On Fri, 19 Jul 2013 15:46:18 +1000 Dave Chinner <[email protected]> wrote:
Quoted 5 lines · Dwight Engen
Have eofblocks ioctl convert
uid_ttokuid_tinto internal structure. Update internal filter matching to compare ids withkuid_ttypes.Signed-off-by Dwight Engen <[email protected]>....
Quoted 1 line
Quoted 7 lines
fs/xfs/xfs_icache.h int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, · line 63
Quoted 4 lines
fs/xfs/xfs_icache.h +4
-0+static inline void +xfs_fs_eofblocks_to_internal ( +struct xfs_fs_eofblocks *src, +struct xfs_eofblocks *dst)I'd prefer that be named
xfs_fs_eofblocks_from_user()to make it clear that we don't trust the contents of src at all...
Sure, I'll rename it.
Quoted 42 lines
Quoted 27 lines
fs/xfs/xfs_icache.h +8
-0+{ + dst->eof_flags = src->eof_flags; + dst->eof_prid = src->eof_prid; + dst->eof_min_file_size = src->eof_min_file_size; + dst->eof_uid =make_kuid (current_user_ns (), src->eof_uid); + dst->eof_gid =make_kgid (current_user_ns (), src->eof_gid); +} +#endif fs/xfs/xfs_ioctl.c +2
-1@@ -1610,7 +1610,8 @@ xfs_file_ioctl(return -error;case XFS_IOC_FREE_EOFBLOCKS : { -struct xfs_eofblocks eofb; +struct xfs_fs_eofblocks eofb; +struct xfs_eofblocks keofb;if (copy_from_user (&eofb, arg,sizeof (eofb)))return -XFS_ERROR (EFAULT );@@ -1625,7 +1626,17 @@ xfs_file_ioctl( memchr_inv(eofb.pad64, 0, sizeof(eofb.pad64)))return -XFS_ERROR (EINVAL );fs/xfs/xfs_ioctl.c xfs_file_ioctl( · line 1637
Quoted 10 lines
fs/xfs/xfs_ioctl.c +9
-1- error =xfs_icache_free_eofblocks (mp, &eofb); +xfs_fs_eofblocks_to_internal (&eofb, &keofb); + +if (keofb.eof_flags &XFS_EOF_FLAGS_UID && + !uid_valid (keofb.eof_uid)) +return XFS_ERROR (EINVAL ); + +if (keofb.eof_flags &XFS_EOF_FLAGS_GID && + !gid_valid (keofb.eof_gid)) +return XFS_ERROR (EINVAL );And I think these two checks should be in
xfs_fs_eofblocks_from_user(), hence pushing all the conversion and validation of the user-supplied parameters into the one function.
Quoted 1 line
Also, we need to return negative errors from this function....
That is the way I originally had it in v3 but Brian had suggested
(http://oss.sgi.com/archives/xfs/2013-06/msg00952.html) it might be better to move the policy out of the conversion function and put it in ioctl itself. I agree with you that makes sense to have it all together so I'm happy to put it back in xfs_fs_eofblocks_from_user().
Quoted 8 lines
fs/xfs/xfs_ioctl.c xfs_file_ioctl( · line 1640
Quoted 2 lines
fs/xfs/xfs_ioctl.c +1
-0+ error =xfs_icache_free_eofblocks (mp, &keofb);return -error;return -xfs_icache_free_eofblocks(mp, &keofb);Cheers,
Dave.
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs