inode.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. /****************************************************************************
  2. * fs/inode/inode.h
  3. *
  4. * Licensed to the Apache Software Foundation (ASF) under one or more
  5. * contributor license agreements. See the NOTICE file distributed with
  6. * this work for additional information regarding copyright ownership. The
  7. * ASF licenses this file to you under the Apache License, Version 2.0 (the
  8. * "License"); you may not use this file except in compliance with the
  9. * License. You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  15. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  16. * License for the specific language governing permissions and limitations
  17. * under the License.
  18. *
  19. ****************************************************************************/
  20. #ifndef __FS_INODE_H
  21. #define __FS_INODE_H
  22. /****************************************************************************
  23. * Included Files
  24. ****************************************************************************/
  25. #include <nuttx/config.h>
  26. #include <nuttx/compiler.h>
  27. #include <sys/types.h>
  28. #include <stdint.h>
  29. #include <stdbool.h>
  30. #include <dirent.h>
  31. #include <nuttx/kmalloc.h>
  32. #include <nuttx/fs/fs.h>
  33. /****************************************************************************
  34. * Pre-processor Definitions
  35. ****************************************************************************/
  36. #define SETUP_SEARCH(d,p,n) \
  37. do \
  38. { \
  39. (d)->path = (p); \
  40. (d)->node = NULL; \
  41. (d)->peer = NULL; \
  42. (d)->parent = NULL; \
  43. (d)->relpath = NULL; \
  44. (d)->buffer = NULL; \
  45. (d)->nofollow = (n); \
  46. } \
  47. while (0)
  48. #define RELEASE_SEARCH(d) \
  49. do \
  50. { \
  51. if ((d)->buffer != NULL) \
  52. { \
  53. kmm_free((d)->buffer); \
  54. (d)->buffer = NULL; \
  55. } \
  56. } \
  57. while (0)
  58. /****************************************************************************
  59. * Public Types
  60. ****************************************************************************/
  61. /* This is the type of the argument to inode_search().
  62. *
  63. * path - INPUT: Path of inode to find
  64. * OUTPUT: Residual part of path not traversed
  65. * node - INPUT: (not used)
  66. * OUTPUT: On success, holds the pointer to the inode found.
  67. * peer - INPUT: (not used)
  68. * OUTPUT: The inode to the "left" of the inode found.
  69. * parent - INPUT: (not used)
  70. * OUTPUT: The inode to the "above" of the inode found.
  71. * relpath - INPUT: (not used)
  72. * OUTPUT: If the returned inode is a mountpoint, this is the
  73. * relative path from the mountpoint.
  74. * OUTPUT: If a symobolic link into a mounted file system is
  75. * detected while traversing the path, then the link
  76. * will be converted to a mountpoint inode if the
  77. * mountpoint link is in an intermediate node of the
  78. * path or at the final node of the path with
  79. * nofollow=true.
  80. * nofollow - INPUT: true: terminal node is returned; false: if the
  81. * terminal is a soft link, then return the inode of
  82. * the link target.
  83. * - OUTPUT: (not used)
  84. * buffer - INPUT: Not used
  85. * - OUTPUT: May hold an allocated intermediate path which is
  86. * probably of no interest to the caller unless it holds
  87. * the relpath.
  88. */
  89. struct inode_search_s
  90. {
  91. FAR const char *path; /* Path of inode to find */
  92. FAR struct inode *node; /* Pointer to the inode found */
  93. FAR struct inode *peer; /* Node to the "left" for the found inode */
  94. FAR struct inode *parent; /* Node "above" the found inode */
  95. FAR const char *relpath; /* Relative path into the mountpoint */
  96. FAR char *buffer; /* Path expansion buffer */
  97. bool nofollow; /* true: Don't follow terminal soft link */
  98. };
  99. /* Callback used by foreach_inode to traverse all inodes in the pseudo-
  100. * file system.
  101. */
  102. typedef int (*foreach_inode_t)(FAR struct inode *node,
  103. FAR char dirpath[PATH_MAX],
  104. FAR void *arg);
  105. /****************************************************************************
  106. * Public Data
  107. ****************************************************************************/
  108. #undef EXTERN
  109. #if defined(__cplusplus)
  110. #define EXTERN extern "C"
  111. extern "C"
  112. {
  113. #else
  114. #define EXTERN extern
  115. #endif
  116. EXTERN FAR struct inode *g_root_inode;
  117. /****************************************************************************
  118. * Public Function Prototypes
  119. ****************************************************************************/
  120. /****************************************************************************
  121. * Name: inode_initialize
  122. *
  123. * Description:
  124. * This is called from the OS initialization logic to configure the file
  125. * system.
  126. *
  127. ****************************************************************************/
  128. void inode_initialize(void);
  129. /****************************************************************************
  130. * Name: inode_semtake
  131. *
  132. * Description:
  133. * Get exclusive access to the in-memory inode tree (tree_sem).
  134. *
  135. ****************************************************************************/
  136. int inode_semtake(void);
  137. /****************************************************************************
  138. * Name: inode_semgive
  139. *
  140. * Description:
  141. * Relinquish exclusive access to the in-memory inode tree (tree_sem).
  142. *
  143. ****************************************************************************/
  144. void inode_semgive(void);
  145. /****************************************************************************
  146. * Name: inode_checkflags
  147. *
  148. * Description:
  149. * Check if the access described by 'oflags' is supported on 'inode'
  150. *
  151. ****************************************************************************/
  152. int inode_checkflags(FAR struct inode *inode, int oflags);
  153. /****************************************************************************
  154. * Name: inode_search
  155. *
  156. * Description:
  157. * Find the inode associated with 'path' returning the inode references
  158. * and references to its companion nodes.
  159. *
  160. * If a mountpoint is encountered in the search prior to encountering the
  161. * terminal node, the search will terminate at the mountpoint inode. That
  162. * inode and the relative path from the mountpoint, 'relpath' will be
  163. * returned.
  164. *
  165. * inode_search will follow soft links in path leading up to the terminal
  166. * node. Whether or no inode_search() will deference that terminal node
  167. * depends on the 'nofollow' input.
  168. *
  169. * If a soft link is encountered that is not the terminal node in the path,
  170. * that link WILL be deferenced unconditionally.
  171. *
  172. * Assumptions:
  173. * The caller holds the g_inode_sem semaphore
  174. *
  175. ****************************************************************************/
  176. int inode_search(FAR struct inode_search_s *desc);
  177. /****************************************************************************
  178. * Name: inode_find
  179. *
  180. * Description:
  181. * This is called from the open() logic to get a reference to the inode
  182. * associated with a path. This is accomplished by calling inode_search().
  183. * inode_find() is a simple wrapper around inode_search(). The primary
  184. * difference between inode_find() and inode_search is that inode_find()
  185. * will lock the inode tree and increment the reference count on the inode.
  186. *
  187. ****************************************************************************/
  188. int inode_find(FAR struct inode_search_s *desc);
  189. /****************************************************************************
  190. * Name: inode_stat
  191. *
  192. * Description:
  193. * The inode_stat() function will obtain information about an 'inode' in
  194. * the pseudo file system and will write it to the area pointed to by
  195. * 'buf'.
  196. *
  197. * The 'buf' argument is a pointer to a stat structure, as defined in
  198. * <sys/stat.h>, into which information is placed concerning the file.
  199. *
  200. * Input Parameters:
  201. * inode - The inode of interest
  202. * buf - The caller provide location in which to return information
  203. * about the inode.
  204. * resolve - Whether to resolve the symbolic link
  205. *
  206. * Returned Value:
  207. * Zero (OK) returned on success. Otherwise, a negated errno value is
  208. * returned to indicate the nature of the failure.
  209. *
  210. ****************************************************************************/
  211. struct stat; /* Forward reference */
  212. int inode_stat(FAR struct inode *inode, FAR struct stat *buf, int resolve);
  213. /****************************************************************************
  214. * Name: inode_free
  215. *
  216. * Description:
  217. * Free resources used by an inode
  218. *
  219. ****************************************************************************/
  220. void inode_free(FAR struct inode *node);
  221. /****************************************************************************
  222. * Name: inode_nextname
  223. *
  224. * Description:
  225. * Given a path with node names separated by '/', return the next node
  226. * name.
  227. *
  228. ****************************************************************************/
  229. const char *inode_nextname(FAR const char *name);
  230. /****************************************************************************
  231. * Name: inode_root_reserve
  232. *
  233. * Description:
  234. * Reserve the root node for the pseudo file system.
  235. *
  236. ****************************************************************************/
  237. void inode_root_reserve(void);
  238. /****************************************************************************
  239. * Name: inode_reserve
  240. *
  241. * Description:
  242. * Reserve an (initialized) inode the pseudo file system.
  243. *
  244. * NOTE: Caller must hold the inode semaphore
  245. *
  246. * Input Parameters:
  247. * path - The path to the inode to create
  248. * inode - The location to return the inode pointer
  249. *
  250. * Returned Value:
  251. * Zero on success (with the inode point in 'inode'); A negated errno
  252. * value is returned on failure:
  253. *
  254. * EINVAL - 'path' is invalid for this operation
  255. * EEXIST - An inode already exists at 'path'
  256. * ENOMEM - Failed to allocate in-memory resources for the operation
  257. *
  258. ****************************************************************************/
  259. int inode_reserve(FAR const char *path, FAR struct inode **inode);
  260. /****************************************************************************
  261. * Name: inode_unlink
  262. *
  263. * Description:
  264. * Given a path, remove a the node from the in-memory, inode tree that the
  265. * path refers to. This is normally done in preparation to removing or
  266. * moving an inode.
  267. *
  268. * Assumptions/Limitations:
  269. * The caller must hold the inode semaphore
  270. *
  271. ****************************************************************************/
  272. FAR struct inode *inode_unlink(FAR const char *path);
  273. /****************************************************************************
  274. * Name: inode_remove
  275. *
  276. * Description:
  277. * Given a path, remove a the node from the in-memory, inode tree that the
  278. * path refers to and free all resources related to the inode. If the
  279. * inode is in-use, then it will be unlinked, but will not be freed until
  280. * the last reference to the inode is released.
  281. *
  282. * Assumptions/Limitations:
  283. * The caller must hold the inode semaphore
  284. *
  285. ****************************************************************************/
  286. int inode_remove(FAR const char *path);
  287. /****************************************************************************
  288. * Name: inode_addref
  289. *
  290. * Description:
  291. * Increment the reference count on an inode (as when a file descriptor
  292. * is dup'ed).
  293. *
  294. ****************************************************************************/
  295. int inode_addref(FAR struct inode *inode);
  296. /****************************************************************************
  297. * Name: inode_release
  298. *
  299. * Description:
  300. * This is called from close() logic when it no longer refers to the inode.
  301. *
  302. ****************************************************************************/
  303. void inode_release(FAR struct inode *inode);
  304. /****************************************************************************
  305. * Name: foreach_inode
  306. *
  307. * Description:
  308. * Visit each inode in the pseudo-file system. The traversal is terminated
  309. * when the callback 'handler' returns a non-zero value, or when all of
  310. * the inodes have been visited.
  311. *
  312. * NOTE 1: Use with caution... The pseudo-file system is locked throughout
  313. * the traversal.
  314. * NOTE 2: The search algorithm is recursive and could, in principle, use
  315. * an indeterminate amount of stack space. This will not usually be a
  316. * real work issue.
  317. *
  318. ****************************************************************************/
  319. int foreach_inode(foreach_inode_t handler, FAR void *arg);
  320. /****************************************************************************
  321. * Name: files_allocate
  322. *
  323. * Description:
  324. * Allocate a struct files instance and associate it with an inode
  325. * instance. Returns the file descriptor == index into the files array.
  326. *
  327. ****************************************************************************/
  328. int files_allocate(FAR struct inode *inode, int oflags, off_t pos,
  329. FAR void *priv, int minfd);
  330. #undef EXTERN
  331. #if defined(__cplusplus)
  332. }
  333. #endif
  334. #endif /* __FS_INODE_H */