Re: [PATCH 1/1] fs: Allows for xattr support to be compiled out

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



 2017-04-12 0:47 GMT+02:00 Brian Ashworth <bosrsf04@xxxxxxxxx>:
> Allows for xattr syscalls and related functions to be compiled out.
> These are not needed on machines that do not utilize filesystems that
> support xattrs or userspaces that require extended attributes. This will
> aid in the tinification efforts.

How much does this shrink things in the end?

> The xattr_full_name function was moved from fs/xattr.c to
> include/linux/xattr.h and made static inline. This function only deals
> with interaction of the xattr_handler struct and does not require any
> of the xattr functions to be implemented.

This seems unnecessary.: when there are no xattr syscalls,
xattr_full_name shouldn't be called anymore.

> The rest of the functions in fs/xattr.c have had stubs created in
> include/linux/xattr.h to return the appropriate value to indicate that
> it is not supported or that there is no data.
>
> add/remove: 0/39 grow/shrink: 0/5 up/down: 0/-4020 (-4020)
> function                                     old     new   delta
> xattr_getsecurity                              6       -      -6
> simple_xattr_list_add                         13       -     -13
> fdget                                         56      42     -14
> sys_lremovexattr                              15       -     -15
> sys_removexattr                               18       -     -18
> cap_inode_killpriv                            22       3     -19
> xattr_full_name                               25       -     -25
> sys_llistxattr                                25       -     -25
> sys_listxattr                                 25       -     -25
> cap_inode_need_killpriv                       28       3     -25
> sys_lgetxattr                                 33       -     -33
> sys_getxattr                                  33       -     -33
> vfs_listxattr                                 34       -     -34
> sys_setxattr                                  43       -     -43
> sys_lsetxattr                                 43       -     -43
> removexattr                                   56       -     -56
> simple_xattr_alloc                            59       -     -59
> sys_flistxattr                                61       -     -61
> sys_fgetxattr                                 66       -     -66
> vfs_getxattr                                  69       -     -69
> __vfs_removexattr                             70       -     -70
> __vfs_getxattr                                71       -     -71
> sys_fremovexattr                              75       -     -75
> simple_xattr_get                              75       -     -75
> vfs_removexattr                               79       -     -79
> simple_xattr_list                             79       -     -79
> sys_fsetxattr                                 89       -     -89
> __vfs_setxattr                                91       -     -91
> path_listxattr                                98       -     -98
> path_getxattr                                103       -    -103
> __vfs_setxattr_noperm                        105       -    -105
> vfs_setxattr                                 113       -    -113
> path_removexattr                             114       -    -114
> path_setxattr                                132       -    -132
> listxattr                                    149       -    -149
> xattr_resolve_name                           155       -    -155
> get_vfs_caps_from_disk                       184      19    -165
> generic_listxattr                            194       -    -194
> xattr_permission                             208       -    -208
> vfs_getxattr_alloc                           216       -    -216
> simple_xattr_set                             231       -    -231
> setxattr                                     239       -    -239
> getxattr                                     240       -    -240
> cap_bprm_set_creds                           613     366    -247
> Total: Before=1900297, After=1896277, chg -0.21%
>
> Signed-off-by: Brian Ashworth <bosrsf04@xxxxxxxxx>
> ---
>  fs/Kconfig                     |   1 +
>  fs/Makefile                    |   3 +-
>  fs/cifs/Kconfig                |   1 +
>  fs/ext2/Kconfig                |   1 +
>  fs/f2fs/Kconfig                |   1 +
>  fs/jffs2/Kconfig               |   1 +
>  fs/reiserfs/Kconfig            |   1 +
>  fs/squashfs/Kconfig            |   1 +
>  fs/xattr.c                     |  24 --------
>  include/linux/xattr.h          | 126 ++++++++++++++++++++++++++++++++++++++++-
>  init/Kconfig                   |  11 ++++
>  kernel/sys_ni.c                |  12 ++++
>  security/integrity/evm/Kconfig |   1 +
>  13 files changed, 157 insertions(+), 27 deletions(-)
>
> diff --git a/fs/Kconfig b/fs/Kconfig
> index 83eab52fb3f6..18ce4032e177 100644
> --- a/fs/Kconfig
> +++ b/fs/Kconfig
> @@ -173,6 +173,7 @@ config TMPFS_POSIX_ACL
>  config TMPFS_XATTR
>         bool "Tmpfs extended attributes"
>         depends on TMPFS
> +       depends on XATTR_SYSCALLS
>         default n
>         help
>           Extended attributes are name:value pairs associated with inodes by
> diff --git a/fs/Makefile b/fs/Makefile
> index 7bbaca9c67b1..1645965883bc 100644
> --- a/fs/Makefile
> +++ b/fs/Makefile
> @@ -9,7 +9,7 @@ obj-y :=        open.o read_write.o file_table.o super.o \
>                 char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \
>                 ioctl.o readdir.o select.o dcache.o inode.o \
>                 attr.o bad_inode.o file.o filesystems.o namespace.o \
> -               seq_file.o xattr.o libfs.o fs-writeback.o \
> +               seq_file.o libfs.o fs-writeback.o \
>                 pnode.o splice.o sync.o utimes.o \
>                 stack.o fs_struct.o statfs.o fs_pin.o nsfs.o
>
> @@ -32,6 +32,7 @@ obj-$(CONFIG_AIO)               += aio.o
>  obj-$(CONFIG_FS_DAX)           += dax.o
>  obj-$(CONFIG_FS_ENCRYPTION)    += crypto/
>  obj-$(CONFIG_FILE_LOCKING)      += locks.o
> +obj-$(CONFIG_XATTR_SYSCALLS)   += xattr.o
>  obj-$(CONFIG_COMPAT)           += compat.o compat_ioctl.o
>  obj-$(CONFIG_BINFMT_AOUT)      += binfmt_aout.o
>  obj-$(CONFIG_BINFMT_EM86)      += binfmt_em86.o
> diff --git a/fs/cifs/Kconfig b/fs/cifs/Kconfig
> index 034f00f21390..3352f6b3efed 100644
> --- a/fs/cifs/Kconfig
> +++ b/fs/cifs/Kconfig
> @@ -94,6 +94,7 @@ config CIFS_UPCALL
>  config CIFS_XATTR
>          bool "CIFS extended attributes"
>          depends on CIFS
> +       depends on XATTR_SYSCALLS
>          help
>            Extended attributes are name:value pairs associated with inodes by
>            the kernel or by users (see the attr(5) manual page, or visit
> diff --git a/fs/ext2/Kconfig b/fs/ext2/Kconfig
> index c634874e12d9..9b16a31785a1 100644
> --- a/fs/ext2/Kconfig
> +++ b/fs/ext2/Kconfig
> @@ -11,6 +11,7 @@ config EXT2_FS
>  config EXT2_FS_XATTR
>         bool "Ext2 extended attributes"
>         depends on EXT2_FS
> +       depends on XATTR_SYSCALLS
>         help
>           Extended attributes are name:value pairs associated with inodes by
>           the kernel or by users (see the attr(5) manual page, or visit
> diff --git a/fs/f2fs/Kconfig b/fs/f2fs/Kconfig
> index 378c221d68a9..3594db075cce 100644
> --- a/fs/f2fs/Kconfig
> +++ b/fs/f2fs/Kconfig
> @@ -32,6 +32,7 @@ config F2FS_STAT_FS
>  config F2FS_FS_XATTR
>         bool "F2FS extended attributes"
>         depends on F2FS_FS
> +       depends on XATTR_SYSCALLS
>         default y
>         help
>           Extended attributes are name:value pairs associated with inodes by
> diff --git a/fs/jffs2/Kconfig b/fs/jffs2/Kconfig
> index d8bb6c411e96..c1646416c94f 100644
> --- a/fs/jffs2/Kconfig
> +++ b/fs/jffs2/Kconfig
> @@ -65,6 +65,7 @@ config JFFS2_SUMMARY
>  config JFFS2_FS_XATTR
>         bool "JFFS2 XATTR support"
>         depends on JFFS2_FS
> +       depends on XATTR_SYSCALLS
>         default n
>         help
>           Extended attributes are name:value pairs associated with inodes by
> diff --git a/fs/reiserfs/Kconfig b/fs/reiserfs/Kconfig
> index 7cd46666ba2c..98adeaa2b312 100644
> --- a/fs/reiserfs/Kconfig
> +++ b/fs/reiserfs/Kconfig
> @@ -55,6 +55,7 @@ config REISERFS_PROC_INFO
>  config REISERFS_FS_XATTR
>         bool "ReiserFS extended attributes"
>         depends on REISERFS_FS
> +       depends on XATTR_SYSCALLS
>         help
>           Extended attributes are name:value pairs associated with inodes by
>           the kernel or by users (see the attr(5) manual page, or visit
> diff --git a/fs/squashfs/Kconfig b/fs/squashfs/Kconfig
> index ffb093e72b6c..083de02a2ab5 100644
> --- a/fs/squashfs/Kconfig
> +++ b/fs/squashfs/Kconfig
> @@ -100,6 +100,7 @@ endchoice
>  config SQUASHFS_XATTR
>         bool "Squashfs XATTR support"
>         depends on SQUASHFS
> +       depends on XATTR_SYSCALLS
>         help
>           Saying Y here includes support for extended attributes (xattrs).
>           Xattrs are name:value pairs associated with inodes by
> diff --git a/fs/xattr.c b/fs/xattr.c
> index 7e3317cf4045..c97ae8365775 100644
> --- a/fs/xattr.c
> +++ b/fs/xattr.c
> @@ -784,30 +784,6 @@ generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
>  }
>  EXPORT_SYMBOL(generic_listxattr);
>
> -/**
> - * xattr_full_name  -  Compute full attribute name from suffix
> - *
> - * @handler:   handler of the xattr_handler operation
> - * @name:      name passed to the xattr_handler operation
> - *
> - * The get and set xattr handler operations are called with the remainder of
> - * the attribute name after skipping the handler's prefix: for example, "foo"
> - * is passed to the get operation of a handler with prefix "user." to get
> - * attribute "user.foo".  The full name is still "there" in the name though.
> - *
> - * Note: the list xattr handler operation when called from the vfs is passed a
> - * NULL name; some file systems use this operation internally, with varying
> - * semantics.
> - */
> -const char *xattr_full_name(const struct xattr_handler *handler,
> -                           const char *name)
> -{
> -       size_t prefix_len = strlen(xattr_prefix(handler));
> -
> -       return name - prefix_len;
> -}
> -EXPORT_SYMBOL(xattr_full_name);
> -
>  /*
>   * Allocate new xattr and copy in the value; but leave the name to callers.
>   */
> diff --git a/include/linux/xattr.h b/include/linux/xattr.h
> index e77605a0c8da..b1d8ec5b2003 100644
> --- a/include/linux/xattr.h
> +++ b/include/linux/xattr.h
> @@ -37,8 +37,6 @@ struct xattr_handler {
>                    size_t size, int flags);
>  };
>
> -const char *xattr_full_name(const struct xattr_handler *, const char *);
> -
>  struct xattr {
>         const char *name;
>         void *value;
> @@ -46,6 +44,9 @@ struct xattr {
>  };
>
>  ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t);
> +
> +#ifdef CONFIG_XATTR_SYSCALLS
> +
>  ssize_t __vfs_getxattr(struct dentry *, struct inode *, const char *, void *, size_t);
>  ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t);
>  ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size);
> @@ -59,11 +60,97 @@ ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_siz
>  ssize_t vfs_getxattr_alloc(struct dentry *dentry, const char *name,
>                            char **xattr_value, size_t size, gfp_t flags);
>
> +#else
> +
> +static inline ssize_t __vfs_getxattr(struct dentry *dentry, struct inode *inode,
> +               const char *name, void *value, size_t size)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline ssize_t vfs_getxattr(struct dentry *dentry, const char *name,
> +               void *value, size_t size)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline ssize_t vfs_listxattr(struct dentry *dentry, char *list, size_t size)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline int __vfs_setxattr(struct dentry *dentry, struct inode *inode,
> +               const char *name, const void *value, size_t size, int flags)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline int __vfs_setxattr_noperm(struct dentry *dentry, const char *name,
> +               const void *value, size_t size, int flags)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline ssize_t vfs_setxattr(struct dentry *dentry, const char *name,
> +               const void *value, size_t size, int flags)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline int __vfs_removexattr(struct dentry *dentry, const char *name)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline int vfs_removexattr(struct dentry *dentry, const char *name)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline ssize_t generic_listxattr(struct dentry *dentry, char *buffer,
> +               size_t buffer_size)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +static inline ssize_t vfs_getxattr_alloc(struct dentry *dentry,
> +               const char *name, char **xattr_value, size_t xattr_size,
> +               gfp_t flags)
> +{
> +       return -EOPNOTSUPP;
> +}
> +
> +#endif  /* CONFIG_XATTR_SYSCALLS */
> +
> +
>  static inline const char *xattr_prefix(const struct xattr_handler *handler)
>  {
>         return handler->prefix ?: handler->name;
>  }
>
> +/**
> + * xattr_full_name  -  Compute full attribute name from suffix
> + *
> + * @handler:   handler of the xattr_handler operation
> + * @name:      name passed to the xattr_handler operation
> + *
> + * The get and set xattr handler operations are called with the remainder of
> + * the attribute name after skipping the handler's prefix: for example, "foo"
> + * is passed to the get operation of a handler with prefix "user." to get
> + * attribute "user.foo".  The full name is still "there" in the name though.
> + *
> + * Note: the list xattr handler operation when called from the vfs is passed a
> + * NULL name; some file systems use this operation internally, with varying
> + * semantics.
> + */
> +static inline const char *xattr_full_name(const struct xattr_handler *handler,
> +               const char *name)
> +{
> +       size_t prefix_len = strlen(xattr_prefix(handler));
> +
> +       return name - prefix_len;
> +}
> +
>  struct simple_xattrs {
>         struct list_head head;
>         spinlock_t lock;
> @@ -98,6 +185,8 @@ static inline void simple_xattrs_free(struct simple_xattrs *xattrs)
>         }
>  }
>
> +#ifdef CONFIG_XATTR_SYSCALLS
> +
>  struct simple_xattr *simple_xattr_alloc(const void *value, size_t size);
>  int simple_xattr_get(struct simple_xattrs *xattrs, const char *name,
>                      void *buffer, size_t size);
> @@ -108,4 +197,37 @@ ssize_t simple_xattr_list(struct inode *inode, struct simple_xattrs *xattrs, cha
>  void simple_xattr_list_add(struct simple_xattrs *xattrs,
>                            struct simple_xattr *new_xattr);
>
> +#else
> +
> +static inline struct simple_xattr *simple_xattr_alloc(const void *value,
> +               size_t size)
> +{
> +       return NULL;
> +}
> +
> +static inline int simple_xattr_get(struct simple_xattrs *xattrs,
> +               const char *name, void *buffer, size_t size)
> +{
> +       return -ENODATA;should be compiled out instead.
> +}
>
> +static inline int simple_xattr_set(struct simple_xattrs *xattrs,
> +               const char *name, const void *value, size_t size, int flags)
> +{
> +       return -ENODATA;
> +}
> +
> +static inline ssize_t simple_xattr_list(struct inode *inode,
> +               struct simple_xattrs *xattrs, char *buffer, size_t size)
> +{
> +       return -ERANGE;
> +}
> +
> +static inline void simple_xattr_list_add(struct simple_xattrs *xattrs,
> +               struct simple_xattr *new_xattr)
> +{
> +}

As with xattr_full_name, please configure out the code calling those
shims instead.

> +#endif  /* CONFIG_XATTR_SYSCALLS */
> +
>  #endif /* _LINUX_XATTR_H */
> diff --git a/init/Kconfig b/init/Kconfig
> index a92f27da4a27..bfb954adc1e6 100644
> --- a/init/Kconfig
> +++ b/init/Kconfig
> @@ -1460,6 +1460,17 @@ config SYSCTL_SYSCALL
>
>           If unsure say N here.
>
> +config XATTR_SYSCALLS
> +       bool "Support for the xattr family of syscalls" if EXPERT
> +       default y
> +       help
> +         The xattr family of syscalls are used to access extended file
> +         attributes from userspace. If you are using a filesystem or
> +         userspace that does not use or require the system calls, they
> +         can be compiled out.
> +
> +         If unsure say Y here.
> +

Shouldn't this be an implied config that the various filesystems
select when needed?

(The xattr code in kernfs is unconditional right now, but that's not
so hard to change.)

>  config POSIX_TIMERS
>         bool "Posix Clocks & timers" if EXPERT
>         default y
> diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
> index 8acef8576ce9..6f6b8105545d 100644
> --- a/kernel/sys_ni.c
> +++ b/kernel/sys_ni.c
> @@ -178,6 +178,18 @@ cond_syscall(sys_setfsgid);
>  cond_syscall(sys_capget);
>  cond_syscall(sys_capset);
>  cond_syscall(sys_copy_file_range);
> +cond_syscall(sys_setxattr);
> +cond_syscall(sys_lsetxattr);
> +cond_syscall(sys_fsetxattr);
> +cond_syscall(sys_getxattr);
> +cond_syscall(sys_lgetxattr);
> +cond_syscall(sys_fgetxattr);
> +cond_syscall(sys_listxattr);
> +cond_syscall(sys_llistxattr);
> +cond_syscall(sys_flistxattr);
> +cond_syscall(sys_removexattr);
> +cond_syscall(sys_lremovexattr);
> +cond_syscall(sys_fremovexattr);
>
>  /* arch-specific weak syscall entries */
>  cond_syscall(sys_pciconfig_read);
> diff --git a/security/integrity/evm/Kconfig b/security/integrity/evm/Kconfig
> index e825e0ae78e7..56f76bfd5cfb 100644
> --- a/security/integrity/evm/Kconfig
> +++ b/security/integrity/evm/Kconfig
> @@ -28,6 +28,7 @@ config EVM_ATTR_FSUUID
>  config EVM_EXTRA_SMACK_XATTRS
>         bool "Additional SMACK xattrs"
>         depends on EVM && SECURITY_SMACK
> +       depends on XATTR_SYSCALLS
>         default n
>         help
>           Include additional SMACK xattrs for HMAC calculation.
> --config
> 2.12.2

Thanks,
Andreas



[Index of Archives]     [Linux Ext4 Filesystem]     [Union Filesystem]     [Filesystem Testing]     [Ceph Users]     [Ecryptfs]     [AutoFS]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux Cachefs]     [Reiser Filesystem]     [Linux RAID]     [Samba]     [Device Mapper]     [CEPH Development]
  Powered by Linux