xref: /haiku/docs/user/drivers/fs_interface.dox (revision f09ba8ea46ba2f4e482d7cd03e8eb77f37a60663)
1/*
2 * Copyright 2007 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *   Ingo Weinhold
7 *   Niels Sascha Reedijk <niels.reedijk@gmail.com>
8 * Corresponds to:
9 *   /trunk/headers/os/drivers/fs_interface.h rev 20724
10 */
11
12/*!
13  \file fs_interface.h
14  \ingroup drivers
15*/
16
17///// Typedefs /////
18
19/*!
20  \typedef typedef dev_t mount_id
21  \brief A \c mount_id refers to a specific mounted (virtual) volume.
22*/
23
24/*!
25  \typedef typedef ino_t vnode_id
26  \brief A \c vnode_id refers to one of the available virtual nodes.
27*/
28
29/*!
30  \typedef typedef void *fs_volume
31  \brief Private data structure for the filesystem to store data associated
32    with volumes.
33*/
34
35/*!
36  \typedef typedef void *fs_cookie
37  \brief Private data structure that is passed to the filesystem when it is
38    called.
39*/
40
41/*!
42  \typedef typedef void *fs_vnode
43  \brief Private data structure that is passed to the filesystem when it is
44    operating on vnodes.
45*/
46
47///// write_stat_mask //////
48
49/*!
50  \enum write_stat_mask
51  \brief This mask is used in file_system_module_info::write_stat() to
52    determine which values need to be written.
53*/
54
55/*!
56  \var write_stat_mask::FS_WRITE_STAT_MODE
57  \brief The mode parameter should be updated.
58*/
59
60/*!
61  \var write_stat_mask::FS_WRITE_STAT_UID
62  \brief The UID field should be updated.
63*/
64
65/*!
66  \var write_stat_mask::FS_WRITE_STAT_GID
67  \brief The GID field should be updated.
68*/
69
70/*!
71  \var write_stat_mask::FS_WRITE_STAT_SIZE
72  \brief The size field should be updated.
73*/
74
75/*!
76  \var write_stat_mask::FS_WRITE_STAT_ATIME
77  \brief The access time should be updated.
78*/
79
80/*!
81  \var write_stat_mask::FS_WRITE_STAT_MTIME
82  \brief The 'last modified' field should be updated.
83*/
84
85/*!
86  \var write_stat_mask::FS_WRITE_STAT_CRTIME
87  \brief The 'creation time' should be updated.
88*/
89
90///// FS_WRITE_FSINFO_NAME /////
91
92/*!
93  \def FS_WRITE_FSINFO_NAME
94  \brief Passed to file_system_module_info::write_fs_info().
95*/
96
97///// file_io_vec /////
98
99/*!
100  \struct file_io_vec
101  \brief Structure that describes the io vector of a file.
102*/
103
104/*!
105  \var off_t file_io_vec::offset
106  \brief The offset within the file.
107*/
108
109/*!
110  \var off_t file_io_vec::length
111  \brief The length of the vector.
112*/
113
114///// B_CURRENT_FS_API_VERSION /////
115
116/*!
117  \def B_CURRENT_FS_API_VERSION
118  \brief Constant that defines the version of the filesystem API that your
119    filesystem conforms to.
120*/
121
122///// file_system_module_info /////
123
124
125/*!
126  \struct file_system_module_info
127  \brief Kernel module interface for file systems.
128*/
129
130/*!
131  \name Data members
132*/
133
134//! @{
135
136/*!
137  \var module_info file_system_module_info::info
138  \brief Your module_info object which is required for all modules.
139*/
140
141/*!
142  \var const char *file_system_module_info::pretty_name
143  \brief A NULL-terminated string with a 'pretty' name for you file system.
144*/
145
146//! @}
147
148/*!
149  \name Scanning
150*/
151
152//! @{
153
154/*!
155  \fn float (*file_system_module_info::identify_partition)(int fd, partition_data *partition, void **cookie)
156  \brief Undocumented.
157*/
158
159/*!
160  \fn status_t (*file_system_module_info::scan_partition)(int fd, partition_data *partition, void *cookie)
161  \brief Undocumented.
162*/
163
164/*!
165  \fn void (*file_system_module_info::free_identify_partition_cookie)(partition_data *partition, void *cookie)
166  \brief Undocumented.
167*/
168
169/*!
170  \fn void (*file_system_module_info::free_partition_content_cookie)(partition_data *partition)
171  \brief Undocumented.
172*/
173
174//! @}
175
176/*!
177  \name General Operations
178*/
179
180//! @{
181
182/*!
183  \fn status_t (*file_system_module_info::mount)(mount_id id, const char *device,
184    uint32 flags, const char *args, fs_volume *_fs, vnode_id *_rootVnodeID)
185  \brief Mount a volume according to the specified parameters.
186
187  Invoked by the VFS when it has been requested to mount the volume. The FS is
188  supposed to perform whatever one-time initialization is necessary for the
189  volume. It is required to create a volume handle for the volume and pass it
190  back in \a _fs. Moreover it must invoke publish_vnode() for the root node
191  of the volume and pass the ID of the volume back in \a _rootVnodeID.
192
193  A disk-based FS will need to check whether \a device is not \c NULL, open
194  it, and analyze whether the device or image file actually represents a volume
195  of that FS type.
196
197  If mounting the volume fails for whatever reason, the hook must return an
198  error code other than \c B_OK. In this case all resources allocated by the
199  hook must be freed before returning. If and only if \c B_OK is returned, the
200  unmount() hook will be invoked at a later point when unmounting the volume.
201
202  \param id The ID of the volume to be mounted. It should be saved in the FS's
203    volume private data (volume handle).
204  \param device The path to the device (or image file) representing the volume
205    to be mounted. Can be \c NULL.
206  \param flags Flags:
207    - \c B_MOUNT_READ_ONLY: Mount the volume read-only.
208  \param args Null-terminated string in driver settings format, containing FS
209    specific parameters.
210  \param _fs Pointer to a pre-allocated variable the volume handle shall be
211    written to.
212  \param _rootVnodeID Pointer to a pre-allocated variable the ID of the
213    volume's root directory shall be written to.
214  \return \c B_OK if everything went fine, another error code otherwise.
215*/
216
217/*!
218  \fn status_t (*file_system_module_info::unmount)(fs_volume fs)
219  \brief Unmounts the given volume.
220
221  Invoked by the VFS when it is asked to unmount the volume. The function must
222  free all resources associated with the mounted volume, including the volume
223  handle. Although the mount() hook called publish_vnode() for the root node
224  of the volume, unmount() must not invoke put_vnode().
225
226  \param fs The volume handle.
227  \return \c B_OK if everything went fine, another error code otherwise. The
228    error code will be ignored, though.
229*/
230
231/*!
232  \fn status_t (*file_system_module_info::read_fs_info)(fs_volume fs,
233    struct fs_info *info)
234  \brief Retrieves general information about the volume.
235
236  The following fields of the \c fs_info structure need to be filled in:
237  - \c flags: Flags applying to the volume, e.g. \c B_FS_IS_READONLY,
238    \c B_FS_HAS_ATTR, etc.
239  - \c block_size: The size of blocks the volume data are organized in.
240    Meaningful mainly for disk-based FSs, other FSs should use some reasonable
241    value for computing \c total_blocks and \c free_blocks.
242  - \c io_size: Preferred size of the buffers passed to read() and write().
243  - \c total_blocks: Total number of blocks the volume contains.
244  - \c free_blocks: Number of free blocks on the volume.
245  - \c total_nodes: Maximal number of nodes the volume can contain. If there is
246    no such limitation use \c LONGLONG_MAX.
247  - \c free_nodes: Number of additional nodes the volume could contain. If
248    there is no such limitation use \c LONGLONG_MAX.
249  - \c device_name: The name of the device or image file containing the volume.
250    Non-disk-based FSs shall fill in an empty string.
251  - \c volume_name: The name of the volume.
252
253  The other values are filled in by the VFS.
254
255  \param fs The volume handle.
256  \param info Pointer to a pre-allocated variable the FS info shall be written
257    to.
258  \return \c B_OK if everything went fine, another error code otherwise. The
259    error code will be ignored, though.
260*/
261
262/*!
263  \fn status_t (*file_system_module_info::write_fs_info)(fs_volume fs, const
264    struct fs_info *info, uint32 mask)
265  \brief Update filesystem information on the volume.
266
267  You are requested to update certain information on the volume \a fs. The
268  supplied \a info contains the new values filled in for the \a mask.
269  Currently, the only possible mask is solely the \c FS_WRITE_FSINFO_NAME,
270  which asks you to update the volume name represented by the value
271  \c volume_name in the \c fs_info struct.
272
273  TODO: ANY OTHERS?
274
275  \param fs The cookie your filesystem supplied to the volume that should be
276    updated.
277  \param info The structure that contains the new data.
278  \param mask The values of the \a info that need to be updated.
279  \return \c B_OK if everything went fine, if not, one of the error codes.
280*/
281
282/*!
283  \fn status_t (*file_system_module_info::sync)(fs_volume fs)
284  \brief Synchronize the cached data with the contents of the disk.
285
286  The VFS layer sometimes wants you to synchronize any cached values with the
287  data on the device.
288
289  TODO: WHEN IS THIS CALLED AND FOR WHAT PURPOSE?
290
291  \param fs The cookie your filesystem supplied to the volume that should be
292    updated.
293*/
294
295//! @}
296
297/*!
298  \name VNode Operations
299*/
300
301//! @{
302
303/*!
304  \fn status_t (*file_system_module_info::lookup)(fs_volume fs, fs_vnode dir,
305    const char *name, vnode_id *_id, int *_type)
306  \brief Looks up the node a directory entry refers to.
307
308  The VFS uses this hook to resolve path names to vnodes. It is used quite
309  often and should be implemented efficiently.
310
311  If the parameter \a dir does not specify a directory, the function shall
312  fail. It shall also fail, if it is a directory, but does not contain an entry
313  with the given name \a name. Otherwise the function shall invoke get_vnode()
314  for the node the entry refers to and pass back the ID and the type of the
315  node in \a _id and \a _type respectively.
316
317  Note that a directory must contain the special entries \c "." and \c "..",
318  referring to the same directory and the parent directory respectively.
319  lookup() must resolve the nodes accordingly. \c ".." for the root directory
320  of the volume shall be resolved to the root directory itself.
321
322  \param fs The volume handle.
323  \param dir The node handle of the directory.
324  \param name The name of the directory entry.
325  \param _id Pointer to a pre-allocated variable the ID of the found node
326    shall be written to.
327  \param _type Pointer to a pre-allocated variable the type of the found node
328    shall be written to. The type is encoded as in the \c st_mode field of a
329    <tt>struct stat</tt> (bitwise anded with \c S_IFMT).
330  \retval B_OK Everything went fine.
331  \retval B_ENTRY_NOT_FOUND The given directory does not contain an entry with
332    the given name.
333*/
334
335/*!
336  \fn status_t (*file_system_module_info::get_vnode_name)(fs_volume fs, fs_vnode vnode, char *buffer,
337				size_t bufferSize)
338  \brief Undocumented.
339*/
340
341/*!
342  \fn status_t (*file_system_module_info::get_vnode)(fs_volume fs, vnode_id id,
343    fs_vnode *_vnode, bool reenter)
344  \brief Creates the private data handle to be associated with the node
345    referred to by \a id.
346
347  Invoked by the VFS when it creates the vnode for the respective node.
348
349  \param fs The volume handle.
350  \param id The ID of the node.
351  \param _vnode Pointer to a pre-allocated variable the node handle shall be
352    written to.
353  \param reenter \c true if the hook invocation has been caused by the FS
354    itself, e.g. by invoking ::get_vnode().
355  \return \c B_OK if everything went fine, another error code otherwise.
356*/
357
358/*!
359  \fn \fn status_t (*file_system_module_info::put_vnode)(fs_volume fs,
360    fs_vnode vnode, bool reenter)
361  \brief Deletes the private data handle associated with the specified node.
362
363  Invoked by the VFS when it deletes the vnode for the respective node and the
364  node is not marked removed.
365
366  \param fs The volume handle.
367  \param vnode The node handle.
368  \param reenter \c true if the hook invocation has been caused by the FS
369    itself, e.g. by invoking ::put_vnode().
370  \return \c B_OK if everything went fine, another error code otherwise.
371*/
372
373/*!
374  \fn status_t (*file_system_module_info::remove_vnode)(fs_volume fs,
375    fs_vnode vnode, bool reenter)
376  \brief Deletes the private data handle associated with the specified node.
377
378  Invoked by the VFS when it deletes the vnode for the respective node and the
379  node is marked removed.
380
381  \param fs The volume handle.
382  \param vnode The node handle.
383  \param reenter \c true if the hook invocation has been caused by the FS
384  itself, e.g. by invoking ::put_vnode().
385  \return \c B_OK if everything went fine, another error code otherwise.
386*/
387
388//! @}
389
390/*!
391  \name VM file access
392*/
393
394//! @{
395
396/*!
397  \fn bool (*file_system_module_info::can_page)(fs_volume fs, fs_vnode vnode, fs_cookie cookie)
398  \brief Undocumented.
399
400  TODO: In both the dos and the bfs implementations this thing simply returns
401  false... Is there anything more to it?
402*/
403
404/*!
405  \fn status_t (*file_system_module_info::read_pages)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
406				off_t pos, const iovec *vecs, size_t count, size_t *_numBytes,
407				bool reenter)
408  \brief Undocumented.
409*/
410
411/*!
412  \fn status_t (*file_system_module_info::write_pages)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
413				off_t pos, const iovec *vecs, size_t count, size_t *_numBytes,
414				bool reenter)
415  \brief Undocumented.
416*/
417
418//! @}
419
420/*!
421  \name Cache File Access
422*/
423
424//! @{
425
426/*!
427  \fn status_t (*file_system_module_info::get_file_map)(fs_volume fs, fs_vnode vnode, off_t offset,
428				size_t size, struct file_io_vec *vecs, size_t *_count)
429  \brief Undocumented.
430*/
431
432//! @}
433
434/*!
435  \name Standard Operations
436*/
437
438//! @{
439
440/*!
441  \fn status_t (*file_system_module_info::ioctl)(fs_volume fs, fs_vnode vnode,
442    fs_cookie cookie, ulong op, void *buffer, size_t length)
443  \brief Perform file system specific operations.
444
445  You can implement a customized API using this call. This can be extremely
446  handy for debugging purposes. There are no obligatory operations for you to
447  implement.
448
449  If you don't want to use this feature, you don't have to implement it.
450
451  \param fs The file system provided cookie associated with this volume.
452  \param vnode The file system provided cookie associated with the vnode (if
453    applicable).
454  \param cookie The file system provided cookie associated with, for example,
455    an open file (if applicable).
456  \param op The operation code. You will have to define them yourself.
457  \param buffer A buffer (if applicable).
458  \param length The size of the buffer.
459  \return You should return any of your status codes.
460*/
461
462/*!
463  \fn status_t (*file_system_module_info::set_flags)(fs_volume fs, fs_vnode
464    vnode, fs_cookie cookie, int flags)
465  \brief Set the open mode flags for an opened file.
466
467  This function should change the open flags for an opened file.
468
469  \param fs The file system provided cookie associated with this volume.
470  \param vnode The file system provided cookie associated with the vnode.
471  \param cookie The file system provided cookie associated with the opened
472    file.
473  \param flags The new flags.
474  \return \c B_OK if the operation succeeded, or else an error code.
475*/
476
477/*!
478  \fn status_t (*file_system_module_info::select)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
479				uint8 event, uint32 ref, selectsync *sync)
480  \brief Undocumented.
481*/
482
483/*!
484  \fn status_t (*file_system_module_info::deselect)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
485				uint8 event, selectsync *sync)
486  \brief Undocumented.
487*/
488
489/*!
490  \fn status_t (*file_system_module_info::fsync)(fs_volume fs, fs_vnode vnode)
491  \brief Synchronize the buffers with the on disk data.
492
493  \param fs The file system provided cookie associated with this volume.
494  \param vnode The file system provided cookie associated with the vnode.
495  \return \c B_OK if the operation succeeded, or else an error code.
496*/
497
498/*!
499  \fn status_t (*file_system_module_info::read_symlink)(fs_volume fs,
500    fs_vnode link, char *buffer, size_t *_bufferSize)
501  \brief Read the value of a symbolic link.
502
503  If the function is successful, the string written to the buffer shall be
504  null-terminated and the variable \a _bufferSize points to shall be set to
505  the length of that string, including the terminating null character.
506
507  \param fs The volume handle.
508  \param link The node handle.
509  \param buffer Pointer to a pre-allocated buffer the link value shall be
510    written to.
511  \param buffer Pointer to a pre-allocated variable containing the size of the
512    buffer supplied to the function. Upon successful completion the hook shall
513    store the number of bytes actually written into the buffer in the variable.
514  \retval B_OK Everything went fine.
515  \retval B_BAD_VALUE \a link does not identify a symbolic link.
516  \retval B_BUFFER_OVERFLOW The supplied buffer is not big enough to contain
517    the complete link value.
518*/
519
520/*!
521  \fn status_t (*file_system_module_info::create_symlink)(fs_volume fs,
522    fs_vnode dir, const char *name, const char *path, int mode)
523  \brief Create a new symbolic link.
524
525  Your implementation should check if the user has permission to perform this
526  operation.
527
528  \param fs The file system provided cookie associated with this volume.
529  \param dir The file system provided cookie associated with the directory
530    the symbolic link should be created in.
531  \param name The name of the new symbolic link.
532  \param path The path of the original inode the symbolic link should refer to.
533  \param mode The mode that this symbolic link should be created in. (TODO
534    what exactly?)
535  \return \c B_OK if you succeeded, or an error code if you failed.
536*/
537
538/*!
539  \fn status_t (*file_system_module_info::link)(fs_volume fs, fs_vnode dir, const char *name,
540				fs_vnode vnode)
541  \brief Undocumented.
542*/
543
544/*!
545  \fn status_t (*file_system_module_info::unlink)(fs_volume fs, fs_vnode dir, const char *name)
546  \brief Undocumented.
547*/
548
549/*!
550  \fn status_t (*file_system_module_info::rename)(fs_volume fs, fs_vnode fromDir, const char *fromName,
551				fs_vnode toDir, const char *toName)
552  \brief Undocumented.
553*/
554
555/*!
556  \fn status_t (*file_system_module_info::access)(fs_volume fs, fs_vnode vnode,
557    int mode)
558  \brief Checks whether the current user is allowed to access the node in the
559    specified way.
560
561  \a mode is a bitwise combination of:
562  - \c R_OK: Read access.
563  - \c W_OK: Write access.
564  - \c X_OK: Execution.
565
566  If the current user does not have any of the access permissions represented
567  by the set bits, the function shall return \c B_NOT_ALLOWED. As a special
568  case, if the volume is read-only and write access is requested,
569  \c B_READ_ONLY_DEVICE shall be returned. If the requested access mode
570  complies with the user's access permissions, the function shall return
571  \c B_OK.
572
573  For most FSs the permissions a user has are defined by the \c st_mode,
574  \c st_uid, and \c st_gid fields of the node's stat data. As a special
575  exception, the root user (<tt>geteuid() == 0</tt>) does always have
576  read and write permissions, execution permission only when at least one of
577  the execution permission bits are set.
578
579  \param fs The volume handle.
580  \param vnode The node handle.
581  \param mode The access mode mask.
582  \retval B_OK The user has the permissions to access the node in the requested
583    way.
584  \retval B_READ_ONLY_DEVICE The volume is read-only, but the write access has
585    been requested.
586  \retval B_NOT_ALLOWED The user does not have all permissions to access the
587    node in the requested way.
588*/
589
590/*!
591  \fn status_t (*file_system_module_info::read_stat)(fs_volume fs,
592    fs_vnode vnode, struct stat *stat)
593  \brief Retrieves the stat data for a given node.
594
595  All values of the <tt>struct stat</tt> save \c st_dev, \c st_ino, \c st_rdev,
596  and \c st_type need to be filled in.
597
598  \param fs The volume handle.
599  \param vnode The node handle.
600  \param stat Pointer to a pre-allocated variable the stat data shall be
601    written to.
602  \return \c B_OK if everything went fine, another error code otherwise.
603*/
604
605/*!
606  \fn status_t (*file_system_module_info::write_stat)(fs_volume fs, fs_vnode vnode,
607				const struct stat *stat, uint32 statMask)
608  \brief Undocumented.
609*/
610
611//! @}
612
613/*!
614 \name File Operations
615*/
616
617//! @{
618
619/*!
620  \fn status_t (*file_system_module_info::create)(fs_volume fs, fs_vnode dir,
621    const char *name, int openMode, int perms, fs_cookie *_cookie,
622    vnode_id *_newVnodeID)
623  \brief Create a new file.
624
625  Your implementation shall check whether it is possible to create the node.
626  You will need to take the user's permissions into account. When you create
627  a new file, you will also have to open it. This means also checking the
628  permissions the user requires to open the file according to the \a mode.
629  See \link file_system_module_info::open() open() \endlink for the possible
630  values of \a mode.
631
632  \param fs The file system provided cookie associated with this volume.
633  \param dir The file system provided cookie associated with the directory
634    where the file should appear.
635  \param name The name of the new file.
636  \param openMode The mode associated to the file.
637  \param perms The permissions the new file should have.
638  \param[out] _cookie In case of success, the you can store your file system
639    data for this node in this variable.
640  \param[out] _newVnodeID In case of success, you can store the new vnode id
641    in this variable.
642  \return You should return \c B_OK if creating the new node succeeded, and if
643    you put data in both \a _cookie and \a _newVnodeID. Else you should return
644    an error code.
645*/
646
647/*!
648  \fn status_t (*file_system_module_info::open)(fs_volume fs, fs_vnode vnode,
649    int openMode, fs_cookie *_cookie)
650  \brief Opens the given node.
651
652  The function shall check whether it is possible to open the node according to
653  the mode specified by \c openMode (also considering the user's access
654  permissions), create a node cookie, and store it in the variable
655  \a _cookie points to.
656
657  The open mode \a openMode is encoded in the same way as the parameter of the
658  POSIX function \c open(), i.e. it is either \c O_RDONLY, \c O_WRONLY, or
659  \c O_RDWR, bitwise or'ed with flags. The only relevant flags for this hook
660  are \c O_TRUNC and \c O_NONBLOCK.
661
662  \param fs The volume handle.
663  \param vnode The node handle.
664  \param openMode The open mode.
665  \param _cookie Pointer to a pre-allocated variable the node cookie shall be
666    written to.
667  \return \c B_OK if everything went fine, another error code otherwise.
668*/
669
670/*!
671  \fn status_t (*file_system_module_info::close)(fs_volume fs, fs_vnode vnode,
672    fs_cookie cookie)
673  \brief Closes the given node cookie.
674
675  The hook is invoked, when closing the node has been requested. At this point
676  other threads might still use the cookie, i.e. still execute hooks to which
677  the cookie has been passed. If the FS supports blocking I/O operations, this
678  hook should make sure to unblock all currently blocking threads performing
679  an operation using the cookie, and mark the cookie such that no further
680  threads will block using it.
681
682  For many FSs this hook is a no-op.
683
684  \param fs The volume handle.
685  \param vnode The node handle.
686  \param cookie The node cookie as returned by open().
687  \return \c B_OK if everything went fine, another error code otherwise.
688*/
689
690/*!
691  \fn status_t (*file_system_module_info::free_cookie)(fs_volume fs,
692    fs_vnode vnode, fs_cookie cookie)
693  \brief Frees the given node cookie.
694
695  The hook is invoked after close(), when no other thread uses or is going to
696  use the cookie. All resources associated with the cookie must be freed.
697
698  \param fs The volume handle.
699  \param vnode The node handle.
700  \param cookie The node cookie as returned by open().
701  \return \c B_OK if everything went fine, another error code otherwise.
702*/
703
704/*!
705  \fn status_t (*file_system_module_info::read)(fs_volume fs, fs_vnode vnode,
706    fs_cookie cookie, off_t pos, void *buffer, size_t *length)
707  \brief Reads data from a file.
708
709  This function should fail if
710  - the node is not a file,
711  - the cookie has not been opened for reading,
712  - \a pos is negative, or
713  - some other error occurs while trying to read the data, and no data have
714    been read at all.
715
716  The number of bytes to be read is stored in the variable pointed to by
717  \a length. If less data is  available at file position \a pos, or if \a pos
718  if greater than the size of the file, only as many data as available shall
719  be read, the function shall store the number of bytes actually read into the
720  variable pointed to by \a length, and return \c B_OK.
721
722  \param fs The volume handle.
723  \param vnode The node handle.
724  \param cookie The node cookie as returned by open().
725  \param pos The file position where to start reading data.
726  \param buffer Pointer to a pre-allocated buffer the read data shall be
727    written to.
728  \param length Pointer to a pre-allocated variable containing the size of the
729    buffer when invoked, and into which the size of the data actually read
730    shall be written.
731  \return \c B_OK if everything went fine, another error code otherwise.
732*/
733
734/*!
735  \fn status_t (*file_system_module_info::write)(fs_volume fs, fs_vnode vnode,
736    fs_cookie cookie, off_t pos, const void *buffer, size_t *length)
737  \brief Write data to a file.
738
739  This function should fail if
740  - the node is not a file,
741  - the cookie has not been opened for writing,
742  - \a pos is negative, or
743  - some other error occurs while trying to read the data, and no data have
744    been read at all.
745
746  The number of bytes to be written is stored in the variable pointed to by
747  \a length.
748
749  TODO: What to do if we were to write less than the \a length? Should this
750  function fail?
751
752  \param fs The file system provided cookie associated with this volume.
753  \param vnode The file system provided cookie associated with the vnode.
754  \param cookie The file system provided cookie associated with the file.
755  \param pos The position to start writing.
756  \param buffer The buffer that contains the data that will need to be written.
757  \param length The length of the data that needs to be written.
758  \return \c B_OK if everything went fine, another error code otherwise.
759*/
760
761//! @}
762
763/*!
764  \name Directory Operations
765*/
766
767/*!
768  \fn status_t (*file_system_module_info::create_dir)(fs_volume fs, fs_vnode
769    parent, const char *name, int perms, vnode_id *_newVnodeID)
770  \brief Create a new directory.
771
772  Your implementation should make sure that the directory actually can be
773  created in the \a parent directory. You will have to check if the user has
774  permissions to actually write to the \a parent. If not, this function should
775  fail (probably with \c B_NOT_ALLOWED, or in case of a read-only filesystem,
776  with \c B_READ_ONLY_DEVICE). If the operation succeeds, you should put the
777  new vnode id in \a _newVnodeID.
778
779  \param fs The file system provided cookie associated with this volume.
780  \param parent The file system provided cookie associated with the parent
781    node.
782  \param name The name the new directory should have.
783  \param perms The permissions the new directory should have.
784  \param[out] _newVnodeID If creating the directory succeeds, than you should
785    put the new vnode id in this variable.
786  \return If the operation succeeds and the \a _newVnodeID is populated with
787    the new vnode, then you should return \c B_OK. Else you should return with
788    an error code.
789*/
790
791/*!
792  \fn status_t (*file_system_module_info::remove_dir)(fs_volume fs, fs_vnode
793    parent, const char *name)
794  \brief Remove a directory.
795
796  You should make sure the user has the proper permissions. You should also
797  check that the directory is empty.
798
799  \param fs The file system provided cookie associated with this volume.
800  \param parent The file system provided cookie associated with the parent
801    node.
802  \param name The \a name of the directory that needs to be removed.
803  \retval B_OK Operation succeeded.
804  \retval B_DIRECTORY_NOT_EMPTY The directory is not empty.
805  \retval B_ENTRY_NOT_FOUND There is no directory with this \a name.
806  \retval B_NOT_A_DIRECTORY The entry is not a directory.
807  \retval "other errors" Other errors occured.
808*/
809
810/*!
811  \fn status_t (*file_system_module_info::open_dir)(fs_volume fs, fs_vnode vnode,
812    fs_cookie *_cookie)
813  \brief Opens the given directory node.
814
815  If the specified node is not a directory, or if the current user does not
816  have the permissions to read the directory, the function shall fail.
817  Otherwise it shall allocate a directory cookie and store it in the variable
818  \a _cookie points to. A subsequent read_dir() using the cookie shall start
819  reading the first entry of the directory.
820
821  \param fs The volume handle.
822  \param vnode The node handle.
823  \param _cookie Pointer to a pre-allocated variable the directory cookie shall
824    be written to.
825  \return \c B_OK if everything went fine, another error code otherwise.
826*/
827
828/*!
829  \fn status_t (*file_system_module_info::close_dir)(fs_volume fs,
830    fs_vnode vnode, fs_cookie cookie)
831  \brief Closes the given directory cookie.
832
833  Generally the situation is similar to the one described for close(). In
834  practice it is a bit, though, since directory cookies are exclusively used
835  for directory iteration, and it normally doesn't make sense to have multiple
836  threads read the same directory concurrently. Furthermore reading a directory
837  should not block. Therefore for most FSs this hook is a no-op.
838
839  \param fs The volume handle.
840  \param vnode The node handle.
841  \param cookie The directory cookie as returned by open_dir().
842  \return \c B_OK if everything went fine, another error code otherwise.
843*/
844
845/*!
846  \fn status_t (*file_system_module_info::free_dir_cookie)(fs_volume fs,
847    fs_vnode vnode, fs_cookie cookie)
848  \brief Frees the given directory cookie.
849
850  The hook is invoked after close_dir(), when no other thread uses or is going
851  to use the cookie. All resources associated with the cookie must be freed.
852
853  \param fs The volume handle.
854  \param vnode The node handle.
855  \param cookie The directory cookie as returned by open_dir().
856  \return \c B_OK if everything went fine, another error code otherwise.
857*/
858
859/*!
860  \fn status_t (*file_system_module_info::read_dir)(fs_volume fs, fs_vnode vnode,
861    fs_cookie cookie, struct dirent *buffer, size_t bufferSize, uint32 *_num)
862  \brief Reads the next one or more directory entries.
863
864  The number of entries to be read at maximum is stored in the variable \a _num
865  points to.
866
867  Per read \c dirent the following fields have to be filled in:
868  - \c d_dev: The volume ID.
869  - \c d_ino: The ID of the node the entry refers to.
870  - \c d_name: The null-terminated name of the entry.
871  - \c d_reclen: The size of the \c dirent structure in bytes, starting from
872    the beginning of the structure, counting all bytes up to and including
873    the null-termination char of the name stored in \c d_name.
874
875  If more than one entry is read, the corresponding \c dirent structures are
876  tightly packed, i.e. the second entry begins directly after the end of the
877  first one (i.e. \c d_reclen bytes after the beginning of the first one).
878  Most FSs read only one entry at a time though, even if more are requested.
879
880  When the function is invoked after the end of the directory has been reached,
881  it shall set the variable \a _num points to to \c 0 and return \c B_OK. If
882  the provided buffer is too small to contain even the single next entry,
883  \c B_BUFFER_OVERFLOW shall be returned. It shall not fail, if at least one
884  entry has been read, and the buffer is just too small to hold as many entries
885  as requested.
886
887  Note that a directory is expected to contain the special entries \c "." and
888  \c "..", referring to the same directory and the parent directory
889  respectively. The \c dirent structure returned for the \c ".." entry of the
890  volume's root directory shall refer to the root node itself.
891
892  \param fs The volume handle.
893  \param vnode The node handle.
894  \param cookie The directory cookie as returned by open_dir().
895  \param buffer Pointer to a pre-allocated buffer the directory entries shall
896    be written to.
897  \param bufferSize The size of \a buffer in bytes.
898  \param _num Pointer to a pre-allocated variable, when invoked, containing the
899    number of directory entries to be read, and into which the number of
900    entries actually read shall be written.
901  \return \c B_OK if everything went fine, another error code otherwise.
902*/
903
904/*!
905  \fn status_t (*file_system_module_info::rewind_dir)(fs_volume fs,
906    fs_vnode vnode, fs_cookie cookie)
907  \brief Resets the directory cookie to the first entry of the directory.
908  \param fs The volume handle.
909  \param vnode The node handle.
910  \param cookie The directory cookie as returned by open_dir().
911  \return \c B_OK if everything went fine, another error code otherwise.
912*/
913
914//! @}
915
916/*!
917  \name Attribute Directory Operations
918*/
919
920//! @{
921
922/*!
923  \fn status_t (*file_system_module_info::open_attr_dir)(fs_volume fs, fs_vnode vnode, fs_cookie *_cookie)
924  \brief Undocumented.
925*/
926
927/*!
928  \fn status_t (*file_system_module_info::close_attr_dir)(fs_volume fs, fs_vnode vnode, fs_cookie cookie)
929  \brief Undocumented.
930*/
931
932/*!
933  \fn status_t (*file_system_module_info::free_attr_dir_cookie)(fs_volume fs, fs_vnode vnode,
934				fs_cookie cookie)
935  \brief Undocumented.
936*/
937
938/*!
939  \fn status_t (*file_system_module_info::read_attr_dir)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
940				struct dirent *buffer, size_t bufferSize, uint32 *_num)
941  \brief Undocumented.
942*/
943
944/*!
945  \fn status_t (*file_system_module_info::rewind_attr_dir)(fs_volume fs, fs_vnode vnode, fs_cookie cookie)
946  \brief Undocumented.
947*/
948
949//! @}
950
951/*!
952  \name Attribute Operations
953*/
954
955//! @{
956
957/*!
958  \fn status_t (*file_system_module_info::create_attr)(fs_volume fs, fs_vnode vnode, const char *name,
959				uint32 type, int openMode, fs_cookie *_cookie)
960  \brief Undocumented.
961*/
962
963/*!
964  \fn status_t (*file_system_module_info::open_attr)(fs_volume fs, fs_vnode vnode, const char *name,
965				int openMode, fs_cookie *_cookie)
966  \brief Undocumented.
967*/
968
969/*!
970  \fn status_t (*file_system_module_info::close_attr)(fs_volume fs, fs_vnode vnode, fs_cookie cookie)
971  \brief Undocumented.
972*/
973
974/*!
975  \fn status_t (*file_system_module_info::free_attr_cookie)(fs_volume fs, fs_vnode vnode,
976				fs_cookie cookie)
977  \brief Undocumented.
978*/
979
980/*!
981  \fn status_t (*file_system_module_info::read_attr)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
982				off_t pos, void *buffer, size_t *length)
983  \brief Undocumented.
984*/
985
986/*!
987  \fn status_t (*file_system_module_info::write_attr)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
988				off_t pos, const void *buffer, size_t *length)
989  \brief Undocumented.
990*/
991
992/*!
993  \fn status_t (*file_system_module_info::read_attr_stat)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
994				struct stat *stat)
995  \brief Undocumented.
996*/
997
998/*!
999  \fn status_t (*file_system_module_info::write_attr_stat)(fs_volume fs, fs_vnode vnode, fs_cookie cookie,
1000				const struct stat *stat, int statMask)
1001  \brief Undocumented.
1002*/
1003
1004/*!
1005  \fn status_t (*file_system_module_info::rename_attr)(fs_volume fs, fs_vnode fromVnode,
1006				const char *fromName, fs_vnode toVnode, const char *toName)
1007  \brief Undocumented.
1008*/
1009
1010/*!
1011  \fn status_t (*file_system_module_info::remove_attr)(fs_volume fs, fs_vnode vnode, const char *name)
1012  \brief Undocumented.
1013*/
1014
1015//! @}
1016
1017/*!
1018  \name Index Directory and Operation
1019*/
1020
1021//! @{
1022
1023/*!
1024  \fn status_t (*file_system_module_info::open_index_dir)(fs_volume fs, fs_cookie *cookie)
1025  \brief Undocumented.
1026*/
1027
1028/*!
1029  \fn status_t (*file_system_module_info::close_index_dir)(fs_volume fs, fs_cookie cookie)
1030  \brief Undocumented.
1031*/
1032
1033/*!
1034  \fn status_t (*file_system_module_info::free_index_dir_cookie)(fs_volume fs, fs_cookie cookie)
1035  \brief Undocumented.
1036*/
1037
1038/*!
1039  \fn status_t (*file_system_module_info::read_index_dir)(fs_volume fs, fs_cookie cookie,
1040				struct dirent *buffer, size_t bufferSize, uint32 *_num)
1041  \brief Undocumented.
1042*/
1043
1044/*!
1045  \fn status_t (*file_system_module_info::rewind_index_dir)(fs_volume fs, fs_cookie cookie)
1046  \brief Undocumented.
1047*/
1048
1049/*!
1050  \fn status_t (*file_system_module_info::create_index)(fs_volume fs, const char *name, uint32 type,
1051				uint32 flags)
1052  \brief Undocumented.
1053*/
1054
1055/*!
1056  \fn status_t (*file_system_module_info::remove_index)(fs_volume fs, const char *name)
1057  \brief Undocumented.
1058*/
1059
1060/*!
1061  \fn status_t (*file_system_module_info::read_index_stat)(fs_volume fs, const char *name,
1062				struct stat *stat)
1063  \brief Undocumented.
1064*/
1065
1066//! @}
1067
1068/*!
1069  \name Query Operations
1070*/
1071
1072//! @{
1073
1074/*!
1075  \fn status_t (*file_system_module_info::open_query)(fs_volume fs, const char *query, uint32 flags,
1076				port_id port, uint32 token, fs_cookie *_cookie)
1077  \brief Undocumented.
1078*/
1079
1080/*!
1081  \fn status_t (*file_system_module_info::close_query)(fs_volume fs, fs_cookie cookie)
1082  \brief Undocumented.
1083*/
1084
1085/*!
1086  \fn status_t (*file_system_module_info::free_query_cookie)(fs_volume fs, fs_cookie cookie)
1087  \brief Undocumented.
1088*/
1089
1090/*!
1091  \fn status_t (*file_system_module_info::read_query)(fs_volume fs,
1092    fs_cookie cookie, struct dirent *buffer, size_t bufferSize, uint32 *_num)
1093  \brief Reads the next one or more entries matching the query.
1094
1095  This hook function works pretty much the same way as read_dir(), with the
1096  difference that it doesn't read the entries of a directory, but the entries
1097  matching the given query.
1098
1099  \param fs The volume handle.
1100  \param cookie The query cookie as returned by open_query().
1101  \param buffer Pointer to a pre-allocated buffer the directory entries shall
1102    be written to.
1103  \param bufferSize The size of \a buffer in bytes.
1104  \param _num Pointer to a pre-allocated variable, when invoked, containing the
1105    number of entries to be read, and into which the number of entries
1106    actually read shall be written.
1107  \return \c B_OK if everything went fine, another error code otherwise.
1108*/
1109
1110/*!
1111  \fn status_t (*file_system_module_info::rewind_query)(fs_volume fs, fs_cookie cookie)
1112  \brief Undocumented.
1113*/
1114
1115//! @}
1116
1117/*!
1118  \name Capability Querying
1119*/
1120
1121//! @{
1122
1123/*!
1124  \fn bool (*file_system_module_info::supports_defragmenting)(partition_data *partition,
1125				bool *whileMounted)
1126  \brief Undocumented.
1127*/
1128
1129/*!
1130  \fn bool (*file_system_module_info::supports_repairing)(partition_data *partition,
1131				bool checkOnly, bool *whileMounted)
1132  \brief Undocumented.
1133*/
1134
1135/*!
1136  \fn bool (*file_system_module_info::supports_resizing)(partition_data *partition,
1137				bool *whileMounted)
1138  \brief Undocumented.
1139*/
1140
1141/*!
1142  \fn bool (*file_system_module_info::supports_moving)(partition_data *partition, bool *isNoOp)
1143  \brief Undocumented.
1144*/
1145
1146/*!
1147  \fn bool (*file_system_module_info::supports_setting_content_name)(partition_data *partition,
1148				bool *whileMounted)
1149  \brief Undocumented.
1150*/
1151
1152/*!
1153  \fn bool (*file_system_module_info::supports_setting_content_parameters)(partition_data *partition,
1154				bool *whileMounted)
1155  \brief Undocumented.
1156*/
1157
1158/*!
1159  \fn bool (*file_system_module_info::supports_initializing)(partition_data *partition)
1160  \brief Undocumented.
1161*/
1162
1163/*!
1164  \fn bool (*file_system_module_info::validate_resize)(partition_data *partition, off_t *size)
1165  \brief Undocumented.
1166*/
1167
1168/*!
1169  \fn bool (*file_system_module_info::validate_move)(partition_data *partition, off_t *start)
1170  \brief Undocumented.
1171*/
1172
1173/*!
1174  \fn bool (*file_system_module_info::validate_set_content_name)(partition_data *partition,
1175				char *name)
1176  \brief Undocumented.
1177*/
1178
1179/*!
1180  \fn bool (*file_system_module_info::validate_set_content_parameters)(partition_data *partition,
1181				const char *parameters)
1182  \brief Undocumented.
1183*/
1184
1185/*!
1186  \fn bool (*file_system_module_info::validate_initialize)(partition_data *partition, char *name,
1187				const char *parameters)
1188  \brief Undocumented.
1189*/
1190
1191//! @}
1192
1193/*!
1194  \name Shadow Partition Modification
1195*/
1196
1197//! @{
1198
1199/*!
1200  \fn status_t (*file_system_module_info::shadow_changed)(partition_data *partition,
1201				uint32 operation)
1202  \brief Undocumented.
1203*/
1204
1205//! @}
1206
1207/*!
1208  \name Special Operations
1209*/
1210
1211//! @{
1212
1213/*!
1214  \fn status_t (*file_system_module_info::defragment)(int fd, partition_id partition,
1215				disk_job_id job)
1216  \brief Undocumented.
1217*/
1218
1219/*!
1220  \fn status_t (*file_system_module_info::repair)(int fd, partition_id partition, bool checkOnly,
1221				disk_job_id job)
1222  \brief Undocumented.
1223*/
1224
1225/*!
1226  \fn status_t (*file_system_module_info::resize)(int fd, partition_id partition, off_t size,
1227				disk_job_id job)
1228  \brief Undocumented.
1229*/
1230
1231/*!
1232  \fn status_t (*file_system_module_info::move)(int fd, partition_id partition, off_t offset,
1233				disk_job_id job)
1234  \brief Undocumented.
1235*/
1236
1237/*!
1238  \fn status_t (*file_system_module_info::set_content_name)(int fd, partition_id partition,
1239				const char *name, disk_job_id job)
1240  \brief Undocumented.
1241*/
1242
1243/*!
1244  \fn status_t (*file_system_module_info::set_content_parameters)(int fd, partition_id partition,
1245				const char *parameters, disk_job_id job)
1246  \brief Undocumented.
1247*/
1248
1249/*!
1250  \fn status_t (*file_system_module_info::initialize)(const char *partition, const char *name,
1251				const char *parameters, disk_job_id job)
1252  \brief Undocumented.
1253*/
1254
1255//! @}
1256
1257///// Global Functions /////
1258
1259/*!
1260  \fn status_t new_vnode(mount_id mountID, vnode_id vnodeID,
1261    fs_vnode privateNode)
1262  \brief Creates the vnode with ID \a vnodeID and associates it with the
1263    private data handle \a privateNode, but leaves is in an unpublished state.
1264
1265  The effect of the function is similar to publish_vnode(), but the vnode
1266  remains in an unpublished state, with the effect that a subsequent
1267  remove_vnode() will just delete the vnode and not invoke the file system's
1268  \link file_system_module_info::remove_vnode remove_vnode() \endlink is not
1269  invoked.
1270
1271  If the vnode shall be kept, publish_vnode() has to be invoked afterwards to
1272  mark the vnode published. The combined effect is the same as only invoking
1273  publish_vnode().
1274
1275  The function fails, if the vnode does already exist.
1276
1277  \param mountID The ID of the volume.
1278  \param vnodeID The ID of the node.
1279  \param privateNode The private data handle to be associated with the node.
1280  \return \c B_OK if everything went fine, another error code otherwise.
1281*/
1282
1283/*!
1284  \fn status_t publish_vnode(mount_id mountID, vnode_id vnodeID,
1285    fs_vnode privateNode)
1286  \brief Creates the vnode with ID \a vnodeID and associates it with the
1287    private data handle \a privateNode or just marks it published.
1288
1289  If the vnode does already exist and has been published, the function fails.
1290  If it has not been published yet (i.e. after a successful new_vnode()), the
1291  function just marks the vnode published. If the vnode did not exist at all
1292  before, it is created and published.
1293
1294  If the function is successful, the caller owns a reference to the vnode. A
1295  sequence of new_vnode() and publish_vnode() results in just one reference as
1296  well. The reference can be surrendered by calling put_vnode().
1297
1298  \param mountID The ID of the volume.
1299  \param vnodeID The ID of the node.
1300  \param privateNode The private data handle to be associated with the node.
1301  \return \c B_OK if everything went fine, another error code otherwise.
1302*/
1303
1304/*!
1305  \fn status_t get_vnode(mount_id mountID, vnode_id vnodeID,
1306    fs_vnode *_privateNode)
1307  \brief Retrieves the private data handle for the node with the given ID.
1308
1309  If the function is successful, the caller owns a reference to the vnode. The
1310  reference can be surrendered by calling put_vnode().
1311
1312  \param mountID The ID of the volume.
1313  \param vnodeID The ID of the node.
1314  \param _privateNode Pointer to a pre-allocated variable the private data
1315    handle shall be written to.
1316  \return \c B_OK if everything went fine, another error code otherwise.
1317*/
1318
1319/*!
1320  \fn status_t put_vnode(mount_id mountID, vnode_id vnodeID)
1321  \brief Surrenders a reference to the specified vnode.
1322  \param mountID The ID of the volume.
1323  \param vnodeID The ID of the node.
1324  \return \c B_OK if everything went fine, another error code otherwise.
1325*/
1326
1327/*!
1328  \fn status_t remove_vnode(mount_id mountID, vnode_id vnodeID)
1329  \brief Marks the specified vnode removed.
1330
1331  The caller must own a reference to the vnode or at least ensure that a
1332  reference to the vnode exists. The function does not surrender a reference,
1333  though.
1334
1335  As soon as the last reference to the vnode has been surrendered, the VFS
1336  invokes the file system's
1337  \link file_system_module_info::remove_vnode remove_vnode() \endlink
1338  hook.
1339
1340  \param mountID The ID of the volume.
1341  \param vnodeID The ID of the node.
1342  \return \c B_OK if everything went fine, another error code otherwise.
1343*/
1344
1345/*!
1346  \fn status_t unremove_vnode(mount_id mountID, vnode_id vnodeID);
1347  \brief Clears the "removed" mark of the specified vnode.
1348
1349  The caller must own a reference to the vnode or at least ensure that a
1350  reference to the vnode exists.
1351
1352  The function is usually called when the caller, who has invoked
1353  remove_vnode() before realizes that it is not possible to remove the node
1354  (e.g. due to an error).
1355
1356  \param mountID The ID of the volume.
1357  \param vnodeID The ID of the node.
1358  \return \c B_OK if everything went fine, another error code otherwise.
1359*/
1360
1361/*!
1362  \fn status_t get_vnode_removed(mount_id mountID, vnode_id vnodeID,
1363    bool* removed);
1364  \brief Returns whether the specified vnode is marked removed.
1365
1366  The caller must own a reference to the vnode or at least ensure that a
1367  reference to the vnode exists.
1368
1369  \param mountID The ID of the volume.
1370  \param vnodeID The ID of the node.
1371  \param removed Pointer to a pre-allocated variable set to \c true, if the
1372    node is marked removed, to \c false otherwise.
1373  \return \c B_OK if everything went fine, another error code otherwise.
1374*/
1375
1376///// Deprecated Global Functions
1377
1378/*!
1379  \name Deprecated functions
1380
1381  The following list of functions should not be used, and could be removed even
1382  before the release of Haiku R1.
1383*/
1384
1385//! @{
1386
1387/*!
1388  \fn status_t notify_listener(int op, mount_id device, vnode_id parentNode,
1389					vnode_id toParentNode, vnode_id node, const char *name)
1390  \brief Deprecated. This feature will be removed in future versions.
1391*/
1392
1393/*!
1394  \fn status_t notify_entry_created(mount_id device, vnode_id directory,
1395					const char *name, vnode_id node)
1396  \brief Deprecated. This feature will be removed in future versions.
1397*/
1398
1399/*!
1400  \fn status_t notify_entry_removed(mount_id device, vnode_id directory,
1401					const char *name, vnode_id node)
1402  \brief Deprecated. This feature will be removed in future versions.
1403*/
1404
1405/*!
1406  \fn status_t notify_entry_moved(mount_id device, vnode_id fromDirectory,
1407					const char *fromName, vnode_id toDirectory,
1408					const char *toName, vnode_id node)
1409  \brief Deprecated. This feature will be removed in future versions.
1410*/
1411
1412/*!
1413  \fn status_t notify_stat_changed(mount_id device, vnode_id node,
1414					uint32 statFields)
1415  \brief Deprecated. This feature will be removed in future versions.
1416*/
1417
1418/*!
1419  \fn status_t notify_attribute_changed(mount_id device, vnode_id node,
1420					const char *attribute, int32 cause)
1421  \brief Deprecated. This feature will be removed in future versions.
1422*/
1423
1424/*!
1425  \fn status_t notify_query_entry_created(port_id port, int32 token,
1426					mount_id device, vnode_id directory, const char *name,
1427					vnode_id node)
1428  \brief Deprecated. This feature will be removed in future versions.
1429*/
1430
1431/*!
1432  \fn status_t notify_query_entry_removed(port_id port, int32 token,
1433					mount_id device, vnode_id directory, const char *name,
1434					vnode_id node)
1435  \brief Deprecated. This feature will be removed in future versions.
1436*/
1437
1438//! @}
1439