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