xfs: create internal eofblocks structure with kuid_t types
PATCH v5 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 | 12 ++++++------ fs/xfs/xfs_icache.h | 33 +++++++++++++++++++++++++++++++++ fs/xfs/xfs_ioctl.c | 10 +++++++--- 4 files changed, 47 insertions(+), 10 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 +6 -6
@@ -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(
@@ -1203,15 +1203,15 @@ xfs_inode_match_id( struct xfs_inode *ip, struct xfs_eofblocks *eofb) { -if (eofb->eof_flags &XFS_EOF_FLAGS_UID && - ip->i_d.di_uid != eofb->eof_uid) +if ((eofb->eof_flags &XFS_EOF_FLAGS_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) +if ((eofb->eof_flags &XFS_EOF_FLAGS_GID ) && + !gid_eq (VFS_I (ip)->i_gid, eofb->eof_gid))return 0 ; -if (eofb->eof_flags &XFS_EOF_FLAGS_PRID && +if ((eofb->eof_flags &XFS_EOF_FLAGS_PRID ) &&xfs_get_projid (ip) != eofb->eof_prid)return 0 ;
fs/xfs/xfs_icache.h +33 -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,29 @@ int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, int flags, void *args), int flags, void *args, int tag); +static inline int +xfs_fs_eofblocks_from_user ( +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 =INVALID_UID ; +if (src->eof_flags &XFS_EOF_FLAGS_UID ) { + dst->eof_uid =make_kuid (current_user_ns (), src->eof_uid); +if (!uid_valid (dst->eof_uid)) +return EINVAL ; + } + + dst->eof_gid =INVALID_GID ; +if (src->eof_flags &XFS_EOF_FLAGS_GID ) { + dst->eof_gid =make_kgid (current_user_ns (), src->eof_gid); +if (!gid_valid (dst->eof_gid)) +return EINVAL ; + } +return 0 ; +} +#endif
fs/xfs/xfs_ioctl.c +7 -3
@@ -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,8 +1626,11 @@ xfs_file_ioctl( memchr_inv(eofb.pad64, 0, sizeof(eofb.pad64))) return -XFS_ERROR(EINVAL); - error =xfs_icache_free_eofblocks (mp, &eofb); -return -error; + error =xfs_fs_eofblocks_from_user (&eofb, &keofb); +if (error) +return -error; + +return -xfs_icache_free_eofblocks (mp, &keofb); }default :
Signature · 6 lines
1.8.1.4 _______________________________________________ xfs mailing list [email protected] http://oss.sgi.com/mailman/listinfo/xfs
Quoted 96 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_fs.h | 2 +- fs/xfs/xfs_icache.c | 12 ++++++------ fs/xfs/xfs_icache.h | 33 +++++++++++++++++++++++++++++++++ fs/xfs/xfs_ioctl.c | 10 +++++++--- 4 files changed, 47 insertions(+), 10 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 +6
-6@@ -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(@@ -1203,15 +1203,15 @@ xfs_inode_match_id( struct xfs_inode *ip, struct xfs_eofblocks *eofb) { -if (eofb->eof_flags &XFS_EOF_FLAGS_UID && - ip->i_d.di_uid != eofb->eof_uid) +if ((eofb->eof_flags &XFS_EOF_FLAGS_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) +if ((eofb->eof_flags &XFS_EOF_FLAGS_GID ) && + !gid_eq (VFS_I (ip)->i_gid, eofb->eof_gid))return 0 ; -if (eofb->eof_flags &XFS_EOF_FLAGS_PRID && +if ((eofb->eof_flags &XFS_EOF_FLAGS_PRID ) &&xfs_get_projid (ip) != eofb->eof_prid)return 0 ;fs/xfs/xfs_icache.h +23
-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,29 @@ int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, int flags, void *args), int flags, void *args, int tag); +static inline int +xfs_fs_eofblocks_from_user ( +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 =INVALID_UID ; +if (src->eof_flags &XFS_EOF_FLAGS_UID ) { + dst->eof_uid =make_kuid (current_user_ns (), src->eof_uid); +if (!uid_valid (dst->eof_uid)) +return EINVAL ; + }
fs/xfs/xfs_icache.h int xfs_inode_ag_iterator_tag(struct xfs_mount *mp, · line 84
Quoted 10 lines
fs/xfs/xfs_icache.h +10
-0+ + dst->eof_gid =INVALID_GID ; +if (src->eof_flags &XFS_EOF_FLAGS_GID ) { + dst->eof_gid =make_kgid (current_user_ns (), src->eof_gid); +if (!gid_valid (dst->eof_gid)) +return EINVAL ; + } +return 0 ; +} +
Originally I thought the error checking in the ioctl() was more clear, but it's not a big deal and the rename to *_from_user() clarifies the functionality.
Quoted 16 lines
fs/xfs/xfs_icache.h +0
-0#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 );
fs/xfs/xfs_ioctl.c xfs_file_ioctl( · line 1633
Quoted 10 lines
fs/xfs/xfs_ioctl.c +5
-2@@ -1625,8 +1626,11 @@ xfs_file_ioctl( memchr_inv(eofb.pad64, 0, sizeof(eofb.pad64)))return -XFS_ERROR (EINVAL ); - error =xfs_icache_free_eofblocks (mp, &eofb); -return -error; + error =xfs_fs_eofblocks_from_user (&eofb, &keofb); +if (error) +return -error; + +return -xfs_icache_free_eofblocks (mp, &keofb);
But if we're going to create a generic *_from_user() helper, why not be consistent and push all of the validity checks into the helper? E.g., the version check, flags validity check and zeroed-padding checks...
Brian
fs/xfs/xfs_ioctl.c xfs_file_ioctl( · line 1636
Quoted 4 lines
fs/xfs/xfs_ioctl.c +0
-0}default :
_______________________________________________
xfs mailing list
[email protected]
http://oss.sgi.com/mailman/listinfo/xfs