xfs_attr.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2000,2002-2003,2005 Silicon Graphics, Inc.
  4. * All Rights Reserved.
  5. */
  6. #ifndef __XFS_ATTR_H__
  7. #define __XFS_ATTR_H__
  8. struct xfs_inode;
  9. struct xfs_da_args;
  10. struct xfs_attr_list_context;
  11. /*
  12. * Large attribute lists are structured around Btrees where all the data
  13. * elements are in the leaf nodes. Attribute names are hashed into an int,
  14. * then that int is used as the index into the Btree. Since the hashval
  15. * of an attribute name may not be unique, we may have duplicate keys.
  16. * The internal links in the Btree are logical block offsets into the file.
  17. *
  18. * Small attribute lists use a different format and are packed as tightly
  19. * as possible so as to fit into the literal area of the inode.
  20. */
  21. /*========================================================================
  22. * External interfaces
  23. *========================================================================*/
  24. #define ATTR_DONTFOLLOW 0x0001 /* -- unused, from IRIX -- */
  25. #define ATTR_ROOT 0x0002 /* use attrs in root (trusted) namespace */
  26. #define ATTR_TRUST 0x0004 /* -- unused, from IRIX -- */
  27. #define ATTR_SECURE 0x0008 /* use attrs in security namespace */
  28. #define ATTR_CREATE 0x0010 /* pure create: fail if attr already exists */
  29. #define ATTR_REPLACE 0x0020 /* pure set: fail if attr does not exist */
  30. #define ATTR_KERNOTIME 0x1000 /* [kernel] don't update inode timestamps */
  31. #define ATTR_KERNOVAL 0x2000 /* [kernel] get attr size only, not value */
  32. #define ATTR_INCOMPLETE 0x4000 /* [kernel] return INCOMPLETE attr keys */
  33. #define XFS_ATTR_FLAGS \
  34. { ATTR_DONTFOLLOW, "DONTFOLLOW" }, \
  35. { ATTR_ROOT, "ROOT" }, \
  36. { ATTR_TRUST, "TRUST" }, \
  37. { ATTR_SECURE, "SECURE" }, \
  38. { ATTR_CREATE, "CREATE" }, \
  39. { ATTR_REPLACE, "REPLACE" }, \
  40. { ATTR_KERNOTIME, "KERNOTIME" }, \
  41. { ATTR_KERNOVAL, "KERNOVAL" }, \
  42. { ATTR_INCOMPLETE, "INCOMPLETE" }
  43. /*
  44. * The maximum size (into the kernel or returned from the kernel) of an
  45. * attribute value or the buffer used for an attr_list() call. Larger
  46. * sizes will result in an ERANGE return code.
  47. */
  48. #define ATTR_MAX_VALUELEN (64*1024) /* max length of a value */
  49. /*
  50. * Define how lists of attribute names are returned to the user from
  51. * the attr_list() call. A large, 32bit aligned, buffer is passed in
  52. * along with its size. We put an array of offsets at the top that each
  53. * reference an attrlist_ent_t and pack the attrlist_ent_t's at the bottom.
  54. */
  55. typedef struct attrlist {
  56. __s32 al_count; /* number of entries in attrlist */
  57. __s32 al_more; /* T/F: more attrs (do call again) */
  58. __s32 al_offset[1]; /* byte offsets of attrs [var-sized] */
  59. } attrlist_t;
  60. /*
  61. * Show the interesting info about one attribute. This is what the
  62. * al_offset[i] entry points to.
  63. */
  64. typedef struct attrlist_ent { /* data from attr_list() */
  65. __u32 a_valuelen; /* number bytes in value of attr */
  66. char a_name[1]; /* attr name (NULL terminated) */
  67. } attrlist_ent_t;
  68. /*
  69. * Given a pointer to the (char*) buffer containing the attr_list() result,
  70. * and an index, return a pointer to the indicated attribute in the buffer.
  71. */
  72. #define ATTR_ENTRY(buffer, index) \
  73. ((attrlist_ent_t *) \
  74. &((char *)buffer)[ ((attrlist_t *)(buffer))->al_offset[index] ])
  75. /*
  76. * Kernel-internal version of the attrlist cursor.
  77. */
  78. typedef struct attrlist_cursor_kern {
  79. __u32 hashval; /* hash value of next entry to add */
  80. __u32 blkno; /* block containing entry (suggestion) */
  81. __u32 offset; /* offset in list of equal-hashvals */
  82. __u16 pad1; /* padding to match user-level */
  83. __u8 pad2; /* padding to match user-level */
  84. __u8 initted; /* T/F: cursor has been initialized */
  85. } attrlist_cursor_kern_t;
  86. /*========================================================================
  87. * Structure used to pass context around among the routines.
  88. *========================================================================*/
  89. /* void; state communicated via *context */
  90. typedef void (*put_listent_func_t)(struct xfs_attr_list_context *, int,
  91. unsigned char *, int, int);
  92. typedef struct xfs_attr_list_context {
  93. struct xfs_trans *tp;
  94. struct xfs_inode *dp; /* inode */
  95. struct attrlist_cursor_kern *cursor; /* position in list */
  96. char *alist; /* output buffer */
  97. int seen_enough; /* T/F: seen enough of list? */
  98. ssize_t count; /* num used entries */
  99. int dupcnt; /* count dup hashvals seen */
  100. int bufsize; /* total buffer size */
  101. int firstu; /* first used byte in buffer */
  102. int flags; /* from VOP call */
  103. int resynch; /* T/F: resynch with cursor */
  104. put_listent_func_t put_listent; /* list output fmt function */
  105. int index; /* index into output buffer */
  106. } xfs_attr_list_context_t;
  107. /*========================================================================
  108. * Function prototypes for the kernel.
  109. *========================================================================*/
  110. /*
  111. * Overall external interface routines.
  112. */
  113. int xfs_attr_inactive(struct xfs_inode *dp);
  114. int xfs_attr_list_int_ilocked(struct xfs_attr_list_context *);
  115. int xfs_attr_list_int(struct xfs_attr_list_context *);
  116. int xfs_inode_hasattr(struct xfs_inode *ip);
  117. int xfs_attr_get_ilocked(struct xfs_inode *ip, struct xfs_da_args *args);
  118. int xfs_attr_get(struct xfs_inode *ip, const unsigned char *name,
  119. unsigned char *value, int *valuelenp, int flags);
  120. int xfs_attr_set(struct xfs_inode *dp, const unsigned char *name,
  121. unsigned char *value, int valuelen, int flags);
  122. int xfs_attr_set_args(struct xfs_da_args *args);
  123. int xfs_attr_remove(struct xfs_inode *dp, const unsigned char *name, int flags);
  124. int xfs_attr_remove_args(struct xfs_da_args *args);
  125. int xfs_attr_list(struct xfs_inode *dp, char *buffer, int bufsize,
  126. int flags, struct attrlist_cursor_kern *cursor);
  127. #endif /* __XFS_ATTR_H__ */