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