xattr_security.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * linux/fs/ext2/xattr_security.c
  4. * Handler for storing security labels as extended attributes.
  5. */
  6. #include "ext2.h"
  7. #include <linux/security.h>
  8. #include "xattr.h"
  9. static int
  10. ext2_xattr_security_get(const struct xattr_handler *handler,
  11. struct dentry *unused, struct inode *inode,
  12. const char *name, void *buffer, size_t size)
  13. {
  14. return ext2_xattr_get(inode, EXT2_XATTR_INDEX_SECURITY, name,
  15. buffer, size);
  16. }
  17. static int
  18. ext2_xattr_security_set(const struct xattr_handler *handler,
  19. struct user_namespace *mnt_userns,
  20. struct dentry *unused, struct inode *inode,
  21. const char *name, const void *value,
  22. size_t size, int flags)
  23. {
  24. return ext2_xattr_set(inode, EXT2_XATTR_INDEX_SECURITY, name,
  25. value, size, flags);
  26. }
  27. static int ext2_initxattrs(struct inode *inode, const struct xattr *xattr_array,
  28. void *fs_info)
  29. {
  30. const struct xattr *xattr;
  31. int err = 0;
  32. for (xattr = xattr_array; xattr->name != NULL; xattr++) {
  33. err = ext2_xattr_set(inode, EXT2_XATTR_INDEX_SECURITY,
  34. xattr->name, xattr->value,
  35. xattr->value_len, 0);
  36. if (err < 0)
  37. break;
  38. }
  39. return err;
  40. }
  41. int
  42. ext2_init_security(struct inode *inode, struct inode *dir,
  43. const struct qstr *qstr)
  44. {
  45. return security_inode_init_security(inode, dir, qstr,
  46. &ext2_initxattrs, NULL);
  47. }
  48. const struct xattr_handler ext2_xattr_security_handler = {
  49. .prefix = XATTR_SECURITY_PREFIX,
  50. .get = ext2_xattr_security_get,
  51. .set = ext2_xattr_security_set,
  52. };