xattr_user.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include <linux/reiserfs_fs.h>
  2. #include <linux/errno.h>
  3. #include <linux/fs.h>
  4. #include <linux/pagemap.h>
  5. #include <linux/xattr.h>
  6. #include <linux/reiserfs_xattr.h>
  7. #include <asm/uaccess.h>
  8. #ifdef CONFIG_REISERFS_FS_POSIX_ACL
  9. # include <linux/reiserfs_acl.h>
  10. #endif
  11. #define XATTR_USER_PREFIX "user."
  12. static int
  13. user_get(struct inode *inode, const char *name, void *buffer, size_t size)
  14. {
  15. int error;
  16. if (strlen(name) < sizeof(XATTR_USER_PREFIX))
  17. return -EINVAL;
  18. if (!reiserfs_xattrs_user(inode->i_sb))
  19. return -EOPNOTSUPP;
  20. error = reiserfs_permission_locked(inode, MAY_READ, NULL);
  21. if (error)
  22. return error;
  23. return reiserfs_xattr_get(inode, name, buffer, size);
  24. }
  25. static int
  26. user_set(struct inode *inode, const char *name, const void *buffer,
  27. size_t size, int flags)
  28. {
  29. int error;
  30. if (strlen(name) < sizeof(XATTR_USER_PREFIX))
  31. return -EINVAL;
  32. if (!reiserfs_xattrs_user(inode->i_sb))
  33. return -EOPNOTSUPP;
  34. if (!S_ISREG(inode->i_mode) &&
  35. (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX))
  36. return -EPERM;
  37. error = reiserfs_permission_locked(inode, MAY_WRITE, NULL);
  38. if (error)
  39. return error;
  40. return reiserfs_xattr_set(inode, name, buffer, size, flags);
  41. }
  42. static int user_del(struct inode *inode, const char *name)
  43. {
  44. int error;
  45. if (strlen(name) < sizeof(XATTR_USER_PREFIX))
  46. return -EINVAL;
  47. if (!reiserfs_xattrs_user(inode->i_sb))
  48. return -EOPNOTSUPP;
  49. if (!S_ISREG(inode->i_mode) &&
  50. (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX))
  51. return -EPERM;
  52. error = reiserfs_permission_locked(inode, MAY_WRITE, NULL);
  53. if (error)
  54. return error;
  55. return 0;
  56. }
  57. static int
  58. user_list(struct inode *inode, const char *name, int namelen, char *out)
  59. {
  60. int len = namelen;
  61. if (!reiserfs_xattrs_user(inode->i_sb))
  62. return 0;
  63. if (out)
  64. memcpy(out, name, len);
  65. return len;
  66. }
  67. struct reiserfs_xattr_handler user_handler = {
  68. .prefix = XATTR_USER_PREFIX,
  69. .get = user_get,
  70. .set = user_set,
  71. .del = user_del,
  72. .list = user_list,
  73. };