xattr_user.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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
  43. user_del (struct inode *inode, const char *name)
  44. {
  45. int error;
  46. if (strlen(name) < sizeof(XATTR_USER_PREFIX))
  47. return -EINVAL;
  48. if (!reiserfs_xattrs_user (inode->i_sb))
  49. return -EOPNOTSUPP;
  50. if (!S_ISREG (inode->i_mode) &&
  51. (!S_ISDIR (inode->i_mode) || inode->i_mode & S_ISVTX))
  52. return -EPERM;
  53. error = reiserfs_permission_locked (inode, MAY_WRITE, NULL);
  54. if (error)
  55. return error;
  56. return 0;
  57. }
  58. static int
  59. user_list (struct inode *inode, const char *name, int namelen, char *out)
  60. {
  61. int len = namelen;
  62. if (!reiserfs_xattrs_user (inode->i_sb))
  63. return 0;
  64. if (out)
  65. memcpy (out, name, len);
  66. return len;
  67. }
  68. struct reiserfs_xattr_handler user_handler = {
  69. .prefix = XATTR_USER_PREFIX,
  70. .get = user_get,
  71. .set = user_set,
  72. .del = user_del,
  73. .list = user_list,
  74. };