Al Viro
2019-Jun-26 04:11 UTC
[Ocfs2-devel] [PATCH 2/5] vfs: create a generic checking function for FS_IOC_FSSETXATTR
On Tue, Jun 25, 2019 at 07:32:18PM -0700, Darrick J. Wong wrote:> --- a/fs/btrfs/ioctl.c > +++ b/fs/btrfs/ioctl.c > @@ -373,10 +373,9 @@ static int check_xflags(unsigned int flags) > static int btrfs_ioctl_fsgetxattr(struct file *file, void __user *arg) > { > struct btrfs_inode *binode = BTRFS_I(file_inode(file)); > - struct fsxattr fa; > - > - memset(&fa, 0, sizeof(fa)); > - fa.fsx_xflags = btrfs_inode_flags_to_xflags(binode->flags); > + struct fsxattr fa = { > + .fsx_xflags = btrfs_inode_flags_to_xflags(binode->flags), > + };Umm... Sure, there's no padding, but still - you are going to copy that thing to userland... How about static inline void simple_fill_fsxattr(struct fsxattr *fa, unsigned xflags) { memset(fa, 0, sizeof(*fa)); fa->fsx_xflags = xflags; } and let the compiler optimize the crap out?
Darrick J. Wong
2019-Jun-26 15:35 UTC
[Ocfs2-devel] [PATCH 2/5] vfs: create a generic checking function for FS_IOC_FSSETXATTR
On Wed, Jun 26, 2019 at 05:11:33AM +0100, Al Viro wrote:> On Tue, Jun 25, 2019 at 07:32:18PM -0700, Darrick J. Wong wrote: > > --- a/fs/btrfs/ioctl.c > > +++ b/fs/btrfs/ioctl.c > > @@ -373,10 +373,9 @@ static int check_xflags(unsigned int flags) > > static int btrfs_ioctl_fsgetxattr(struct file *file, void __user *arg) > > { > > struct btrfs_inode *binode = BTRFS_I(file_inode(file)); > > - struct fsxattr fa; > > - > > - memset(&fa, 0, sizeof(fa)); > > - fa.fsx_xflags = btrfs_inode_flags_to_xflags(binode->flags); > > + struct fsxattr fa = { > > + .fsx_xflags = btrfs_inode_flags_to_xflags(binode->flags), > > + }; > > Umm... Sure, there's no padding, but still - you are going to copy that thing > to userland... How about > > static inline void simple_fill_fsxattr(struct fsxattr *fa, unsigned xflags) > { > memset(fa, 0, sizeof(*fa)); > fa->fsx_xflags = xflags; > } > > and let the compiler optimize the crap out?The v2 series used to do that, but Christoph complained that having a helper for a two-line memset and initialization was silly[1] so now we have this version. I don't mind reinstating it as a static inline helper, but I'd like some input from any of the btrfs developers (or you, Al) about which form is preferred. --D [1] https://lkml.org/lkml/2019/6/25/533