root/headers/private/userlandfs/private/Requests.h
/*
 * Copyright 2001-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef USERLAND_FS_REQUESTS_H
#define USERLAND_FS_REQUESTS_H

#include <fs_attr.h>
#include <fs_index.h>
#include <fs_info.h>
#include <fs_interface.h>

#include "Compatibility.h"
#include "FSCapabilities.h"
#include "Request.h"


enum {
        MAX_REQUEST_ADDRESS_COUNT       = 4,
};

// request types
enum {
        // kernel -> userland requests

        // administrative
        UFS_DISCONNECT_REQUEST = 0,
        FS_CONNECT_REQUEST,
        FS_CONNECT_REPLY,

        // FS
        MOUNT_VOLUME_REQUEST,
        MOUNT_VOLUME_REPLY,
        UNMOUNT_VOLUME_REQUEST,
        UNMOUNT_VOLUME_REPLY,
//      INITIALIZE_VOLUME_REQUEST,
//      INITIALIZE_VOLUME_REPLY,
        SYNC_VOLUME_REQUEST,
        SYNC_VOLUME_REPLY,
        READ_FS_INFO_REQUEST,
        READ_FS_INFO_REPLY, // 10
        WRITE_FS_INFO_REQUEST,
        WRITE_FS_INFO_REPLY,

        // vnodes
        LOOKUP_REQUEST,
        LOOKUP_REPLY,
        GET_VNODE_NAME_REQUEST,
        GET_VNODE_NAME_REPLY,
        READ_VNODE_REQUEST,
        READ_VNODE_REPLY,
        WRITE_VNODE_REQUEST,
        WRITE_VNODE_REPLY, // 20
        FS_REMOVE_VNODE_REQUEST,
        FS_REMOVE_VNODE_REPLY,

        // asynchronous I/O
        DO_IO_REQUEST,
        DO_IO_REPLY,
        CANCEL_IO_REQUEST,
        CANCEL_IO_REPLY,
        ITERATIVE_IO_GET_VECS_REQUEST,
        ITERATIVE_IO_GET_VECS_REPLY,
        ITERATIVE_IO_FINISHED_REQUEST,
        ITERATIVE_IO_FINISHED_REPLY, // 30

        // nodes
        IOCTL_REQUEST,
        IOCTL_REPLY,
        SET_FLAGS_REQUEST,
        SET_FLAGS_REPLY,
        SELECT_REQUEST,
        SELECT_REPLY,
        DESELECT_REQUEST,
        DESELECT_REPLY,
        FSYNC_REQUEST,
        FSYNC_REPLY, // 40

        READ_SYMLINK_REQUEST,
        READ_SYMLINK_REPLY,
        CREATE_SYMLINK_REQUEST,
        CREATE_SYMLINK_REPLY,
        LINK_REQUEST,
        LINK_REPLY,
        UNLINK_REQUEST,
        UNLINK_REPLY,
        RENAME_REQUEST,
        RENAME_REPLY, // 50

        ACCESS_REQUEST,
        ACCESS_REPLY,
        READ_STAT_REQUEST,
        READ_STAT_REPLY,
        WRITE_STAT_REQUEST,
        WRITE_STAT_REPLY,

        // files
        CREATE_REQUEST,
        CREATE_REPLY,
        OPEN_REQUEST,
        OPEN_REPLY, // 60
        CLOSE_REQUEST,
        CLOSE_REPLY,
        FREE_COOKIE_REQUEST,
        FREE_COOKIE_REPLY,
        READ_REQUEST,
        READ_REPLY,
        WRITE_REQUEST,
        WRITE_REPLY,

        // directories
        CREATE_DIR_REQUEST,
        CREATE_DIR_REPLY, // 70
        REMOVE_DIR_REQUEST,
        REMOVE_DIR_REPLY,
        OPEN_DIR_REQUEST,
        OPEN_DIR_REPLY,
        CLOSE_DIR_REQUEST,
        CLOSE_DIR_REPLY,
        FREE_DIR_COOKIE_REQUEST,
        FREE_DIR_COOKIE_REPLY,
        READ_DIR_REQUEST,
        READ_DIR_REPLY, // 80
        REWIND_DIR_REQUEST,
        REWIND_DIR_REPLY,

        // attribute directories
        OPEN_ATTR_DIR_REQUEST,
        OPEN_ATTR_DIR_REPLY,
        CLOSE_ATTR_DIR_REQUEST,
        CLOSE_ATTR_DIR_REPLY,
        FREE_ATTR_DIR_COOKIE_REQUEST,
        FREE_ATTR_DIR_COOKIE_REPLY,
        READ_ATTR_DIR_REQUEST,
        READ_ATTR_DIR_REPLY, // 90
        REWIND_ATTR_DIR_REQUEST,
        REWIND_ATTR_DIR_REPLY,

        // attributes
        CREATE_ATTR_REQUEST,
        CREATE_ATTR_REPLY,
        OPEN_ATTR_REQUEST,
        OPEN_ATTR_REPLY,
        CLOSE_ATTR_REQUEST,
        CLOSE_ATTR_REPLY,
        FREE_ATTR_COOKIE_REQUEST,
        FREE_ATTR_COOKIE_REPLY, // 100
        READ_ATTR_REQUEST,
        READ_ATTR_REPLY,
        WRITE_ATTR_REQUEST,
        WRITE_ATTR_REPLY,
        READ_ATTR_STAT_REQUEST,
        READ_ATTR_STAT_REPLY,
        WRITE_ATTR_STAT_REQUEST,
        WRITE_ATTR_STAT_REPLY,
        RENAME_ATTR_REQUEST,
        RENAME_ATTR_REPLY, // 110
        REMOVE_ATTR_REQUEST,
        REMOVE_ATTR_REPLY,

        // indices
        OPEN_INDEX_DIR_REQUEST,
        OPEN_INDEX_DIR_REPLY,
        CLOSE_INDEX_DIR_REQUEST,
        CLOSE_INDEX_DIR_REPLY,
        FREE_INDEX_DIR_COOKIE_REQUEST,
        FREE_INDEX_DIR_COOKIE_REPLY,
        READ_INDEX_DIR_REQUEST,
        READ_INDEX_DIR_REPLY, // 120
        REWIND_INDEX_DIR_REQUEST,
        REWIND_INDEX_DIR_REPLY,
        CREATE_INDEX_REQUEST,
        CREATE_INDEX_REPLY,
        REMOVE_INDEX_REQUEST,
        REMOVE_INDEX_REPLY,
        READ_INDEX_STAT_REQUEST,
        READ_INDEX_STAT_REPLY,

        // queries
        OPEN_QUERY_REQUEST,
        OPEN_QUERY_REPLY, // 130
        CLOSE_QUERY_REQUEST,
        CLOSE_QUERY_REPLY,
        FREE_QUERY_COOKIE_REQUEST,
        FREE_QUERY_COOKIE_REPLY,
        READ_QUERY_REQUEST,
        READ_QUERY_REPLY,
        REWIND_QUERY_REQUEST,
        REWIND_QUERY_REPLY,

        // node monitoring
        NODE_MONITORING_EVENT_REQUEST,
        NODE_MONITORING_EVENT_REPLY, // 140

        // userland -> kernel requests
        // notifications
        NOTIFY_LISTENER_REQUEST,
        NOTIFY_LISTENER_REPLY,
        NOTIFY_SELECT_EVENT_REQUEST,
        NOTIFY_SELECT_EVENT_REPLY,
        NOTIFY_QUERY_REQUEST,
        NOTIFY_QUERY_REPLY,

        // vnodes
        GET_VNODE_REQUEST,
        GET_VNODE_REPLY,
        PUT_VNODE_REQUEST,
        PUT_VNODE_REPLY, // 150
        ACQUIRE_VNODE_REQUEST,
        ACQUIRE_VNODE_REPLY,
        NEW_VNODE_REQUEST,
        NEW_VNODE_REPLY,
        PUBLISH_VNODE_REQUEST,
        PUBLISH_VNODE_REPLY,
        REMOVE_VNODE_REQUEST,
        REMOVE_VNODE_REPLY,
        UNREMOVE_VNODE_REQUEST,
        UNREMOVE_VNODE_REPLY, // 160
        GET_VNODE_REMOVED_REQUEST,
        GET_VNODE_REMOVED_REPLY,

        // file cache
        FILE_CACHE_CREATE_REQUEST,
        FILE_CACHE_CREATE_REPLY,
        FILE_CACHE_DELETE_REQUEST,
        FILE_CACHE_DELETE_REPLY,
        FILE_CACHE_SET_ENABLED_REQUEST,
        FILE_CACHE_SET_ENABLED_REPLY,
        FILE_CACHE_SET_SIZE_REQUEST,
        FILE_CACHE_SET_SIZE_REPLY, // 170
        FILE_CACHE_SYNC_REQUEST,
        FILE_CACHE_SYNC_REPLY,
        FILE_CACHE_READ_REQUEST,
        FILE_CACHE_READ_REPLY,
        FILE_CACHE_WRITE_REQUEST,
        FILE_CACHE_WRITE_REPLY,

        // I/O
        DO_ITERATIVE_FD_IO_REQUEST,
        DO_ITERATIVE_FD_IO_REPLY,
        READ_FROM_IO_REQUEST_REQUEST,
        READ_FROM_IO_REQUEST_REPLY, // 180
        WRITE_TO_IO_REQUEST_REQUEST,
        WRITE_TO_IO_REQUEST_REPLY,
        NOTIFY_IO_REQUEST_REQUEST,
        NOTIFY_IO_REQUEST_REPLY,

        // node monitoring
        ADD_NODE_LISTENER_REQUEST,
        ADD_NODE_LISTENER_REPLY,
        REMOVE_NODE_LISTENER_REQUEST,
        REMOVE_NODE_LISTENER_REPLY,

        // general reply
        RECEIPT_ACK_REPLY,

        // invalid request ID (e.g. for request handlers)
        NO_REQUEST, // 190
};

namespace UserlandFSUtil {

// ReplyRequest
class ReplyRequest : public Request {
public:
        ReplyRequest(uint32 type) : Request(type) {}

        status_t        error;
};


// #pragma mark - kernel requests


// KernelRequest
class KernelRequest : public Request {
public:
        KernelRequest(uint32 type) : Request(type) {}

        team_id         team;
        thread_id       thread;
        uid_t           user;
        gid_t           group;
};

// VolumeRequest
class VolumeRequest : public KernelRequest {
public:
        VolumeRequest(uint32 type) : KernelRequest(type) {}

        void*           volume;
};

// NodeRequest
class NodeRequest : public VolumeRequest {
public:
        NodeRequest(uint32 type) : VolumeRequest(type) {}

        void*           node;
};

// FileRequest
class FileRequest : public NodeRequest {
public:
        FileRequest(uint32 type) : NodeRequest(type) {}

        void*           fileCookie;
};

// DirRequest
class DirRequest : public NodeRequest {
public:
        DirRequest(uint32 type) : NodeRequest(type) {}

        void*           dirCookie;
};

// AttrDirRequest
class AttrDirRequest : public NodeRequest {
public:
        AttrDirRequest(uint32 type) : NodeRequest(type) {}

        void*           attrDirCookie;
};

// AttributeRequest
class AttributeRequest : public NodeRequest {
public:
        AttributeRequest(uint32 type) : NodeRequest(type) {}

        void*           attrCookie;
};

// IndexDirRequest
class IndexDirRequest : public VolumeRequest {
public:
        IndexDirRequest(uint32 type) : VolumeRequest(type) {}

        void*           indexDirCookie;
};

// QueryRequest
class QueryRequest : public VolumeRequest {
public:
        QueryRequest(uint32 type) : VolumeRequest(type) {}

        void*           queryCookie;
};

// FileCacheRequest
class FileCacheRequest : public Request {
public:
        FileCacheRequest(uint32 type) : Request(type) {}

        dev_t           nsid;
        ino_t           vnid;
};

class IORequestRequest : public Request {
public:
        IORequestRequest(uint32 type) : Request(type) {}

        dev_t           nsid;
        int32           request;
};


// #pragma mark - administrative


// UFSDisconnectRequest
class UFSDisconnectRequest : public Request {
public:
        UFSDisconnectRequest() : Request(UFS_DISCONNECT_REQUEST) {}
};

// FSConnectRequest
class FSConnectRequest : public Request {
public:
        FSConnectRequest() : Request(FS_CONNECT_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         fsName;
};

// FSConnectReply
class FSConnectReply : public ReplyRequest {
public:
        FSConnectReply() : ReplyRequest(FS_CONNECT_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address                 portInfos;
        int32                   portInfoCount;
        FSCapabilities  capabilities;
        client_fs_type  clientFSType;
};


// #pragma mark - FS


// MountVolumeRequest
class MountVolumeRequest : public KernelRequest {
public:
        MountVolumeRequest() : KernelRequest(MOUNT_VOLUME_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        dev_t           nsid;
        Address         cwd;                    // current working dir of the mount() caller
        Address         device;
        uint32          flags;
        Address         parameters;
};

// MountVolumeReply
class MountVolumeReply : public ReplyRequest {
public:
        MountVolumeReply() : ReplyRequest(MOUNT_VOLUME_REPLY) {}

        ino_t                                   rootID;
        void*                                   volume;
        FSVolumeCapabilities    capabilities;
};

// UnmountVolumeRequest
class UnmountVolumeRequest : public VolumeRequest {
public:
        UnmountVolumeRequest() : VolumeRequest(UNMOUNT_VOLUME_REQUEST) {}
};

// UnmountVolumeReply
class UnmountVolumeReply : public ReplyRequest {
public:
        UnmountVolumeReply() : ReplyRequest(UNMOUNT_VOLUME_REPLY) {}
};

/*// InitializeVolumeRequest
class InitializeVolumeRequest : public Request {
public:
        InitializeVolumeRequest() : Request(INITIALIZE_VOLUME_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         device;
        Address         parameters;
};

// InitializeVolumeReply
class InitializeVolumeReply : public ReplyRequest {
public:
        InitializeVolumeReply() : ReplyRequest(INITIALIZE_VOLUME_REPLY) {}
};*/

// SyncVolumeRequest
class SyncVolumeRequest : public VolumeRequest {
public:
        SyncVolumeRequest() : VolumeRequest(SYNC_VOLUME_REQUEST) {}
};

// SyncVolumeReply
class SyncVolumeReply : public ReplyRequest {
public:
        SyncVolumeReply() : ReplyRequest(SYNC_VOLUME_REPLY) {}
};

// ReadFSInfoRequest
class ReadFSInfoRequest : public VolumeRequest {
public:
        ReadFSInfoRequest() : VolumeRequest(READ_FS_INFO_REQUEST) {}
};

// ReadFSInfoReply
class ReadFSInfoReply : public ReplyRequest {
public:
        ReadFSInfoReply() : ReplyRequest(READ_FS_INFO_REPLY) {}

        fs_info         info;
};

// WriteFSInfoRequest
class WriteFSInfoRequest : public VolumeRequest {
public:
        WriteFSInfoRequest() : VolumeRequest(WRITE_FS_INFO_REQUEST) {}

        fs_info         info;
        uint32          mask;
};

// WriteFSInfoReply
class WriteFSInfoReply : public ReplyRequest {
public:
        WriteFSInfoReply() : ReplyRequest(WRITE_FS_INFO_REPLY) {}
};


// #pragma mark - vnodes


// LookupRequest
class LookupRequest : public NodeRequest {
public:
        LookupRequest() : NodeRequest(LOOKUP_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         entryName;
        bool            traverseLink;
};

// LookupReply
class LookupReply : public ReplyRequest {
public:
        LookupReply() : ReplyRequest(LOOKUP_REPLY) {}

        ino_t           vnid;
};

// GetVNodeNameRequest
class GetVNodeNameRequest : public NodeRequest {
public:
        GetVNodeNameRequest() : NodeRequest(GET_VNODE_NAME_REQUEST) {}

        size_t          size;
};

// GetVNodeNameReply
class GetVNodeNameReply : public ReplyRequest {
public:
        GetVNodeNameReply() : ReplyRequest(GET_VNODE_NAME_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
};

// ReadVNodeRequest
class ReadVNodeRequest : public VolumeRequest {
public:
        ReadVNodeRequest() : VolumeRequest(READ_VNODE_REQUEST) {}

        ino_t           vnid;
        bool            reenter;
};

// ReadVNodeReply
class ReadVNodeReply : public ReplyRequest {
public:
        ReadVNodeReply() : ReplyRequest(READ_VNODE_REPLY) {}

        void*                           node;
        int                                     type;
        uint32                          flags;
        FSVNodeCapabilities     capabilities;
};

// WriteVNodeRequest
class WriteVNodeRequest : public NodeRequest {
public:
        WriteVNodeRequest() : NodeRequest(WRITE_VNODE_REQUEST) {}

        bool            reenter;
};

// WriteVNodeReply
class WriteVNodeReply : public ReplyRequest {
public:
        WriteVNodeReply() : ReplyRequest(WRITE_VNODE_REPLY) {}
};

// FSRemoveVNodeRequest
class FSRemoveVNodeRequest : public NodeRequest {
public:
        FSRemoveVNodeRequest() : NodeRequest(FS_REMOVE_VNODE_REQUEST) {}

        bool            reenter;
};

// FSRemoveVNodeReply
class FSRemoveVNodeReply : public ReplyRequest {
public:
        FSRemoveVNodeReply() : ReplyRequest(FS_REMOVE_VNODE_REPLY) {}
};


// #pragma mark - asynchronous I/O


// DoIORequest
class DoIORequest : public FileRequest {
public:
        DoIORequest() : FileRequest(DO_IO_REQUEST) {}

        off_t           offset;
        size_t          length;
        int32           request;
        bool            isWrite;
        bool            isVIP;
};

// DoIOReply
class DoIOReply : public ReplyRequest {
public:
        DoIOReply() : ReplyRequest(DO_IO_REPLY) {}
};

// CancelIORequest
class CancelIORequest : public FileRequest {
public:
        CancelIORequest() : FileRequest(CANCEL_IO_REQUEST) {}

        int32           request;
};

// CancelIOReply
class CancelIOReply : public ReplyRequest {
public:
        CancelIOReply() : ReplyRequest(CANCEL_IO_REPLY) {}
};

// IterativeIOGetVecsRequest
class IterativeIOGetVecsRequest : public VolumeRequest {
public:
        IterativeIOGetVecsRequest()
                : VolumeRequest(ITERATIVE_IO_GET_VECS_REQUEST) {}

        void*           cookie;
        off_t           offset;
        int32           request;
        size_t          size;
        uint32          vecCount;
};

// IterativeIOGetVecsReply
class IterativeIOGetVecsReply : public ReplyRequest {
public:
        IterativeIOGetVecsReply() : ReplyRequest(ITERATIVE_IO_GET_VECS_REPLY) {}

        enum { MAX_VECS = 8 };

        file_io_vec     vecs[MAX_VECS];
        uint32          vecCount;
};

// IterativeIOFinishedRequest
class IterativeIOFinishedRequest : public VolumeRequest {
public:
        IterativeIOFinishedRequest()
                : VolumeRequest(ITERATIVE_IO_FINISHED_REQUEST) {}

        void*           cookie;
        int32           request;
        status_t        status;
        bool            partialTransfer;
        size_t          bytesTransferred;
};

// IterativeIOFinishedReply
class IterativeIOFinishedReply : public ReplyRequest {
public:
        IterativeIOFinishedReply() : ReplyRequest(ITERATIVE_IO_FINISHED_REPLY) {}
};


// #pragma mark - nodes


// IOCtlRequest
class IOCtlRequest : public FileRequest {
public:
        IOCtlRequest() : FileRequest(IOCTL_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        uint32          command;
        void*           bufferParameter;
        size_t          lenParameter;
        bool            isBuffer;       // if false, just pass bufferParameter
                                                        // otherwise use buffer
        Address         buffer;
        int32           writeSize;      // ignored unless isBuffer -- then
                                                        // it indicates the size of the buffer to allocate
};

// IOCtlReply
class IOCtlReply : public ReplyRequest {
public:
        IOCtlReply() : ReplyRequest(IOCTL_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        status_t        ioctlError;             // we need a special handling since error
                                                                // may be a part of the client FS protocol
        Address         buffer;
};

// SetFlagsRequest
class SetFlagsRequest : public FileRequest {
public:
        SetFlagsRequest() : FileRequest(SET_FLAGS_REQUEST) {}

        int                     flags;
};

// SetFlagsReply
class SetFlagsReply : public ReplyRequest {
public:
        SetFlagsReply() : ReplyRequest(SET_FLAGS_REPLY) {}
};

// SelectRequest
class SelectRequest : public FileRequest {
public:
        SelectRequest() : FileRequest(SELECT_REQUEST) {}

        uint8           event;
        selectsync*     sync;
};

// SelectReply
class SelectReply : public ReplyRequest {
public:
        SelectReply() : ReplyRequest(SELECT_REPLY) {}
};

// DeselectRequest
class DeselectRequest : public FileRequest {
public:
        DeselectRequest() : FileRequest(DESELECT_REQUEST) {}

        uint8           event;
        selectsync*     sync;
};

// DeselectReply
class DeselectReply : public ReplyRequest {
public:
        DeselectReply() : ReplyRequest(DESELECT_REPLY) {}
};

// FSyncRequest
class FSyncRequest : public NodeRequest {
public:
        FSyncRequest() : NodeRequest(FSYNC_REQUEST) {}
};

// FSyncReply
class FSyncReply : public ReplyRequest {
public:
        FSyncReply() : ReplyRequest(FSYNC_REPLY) {}
};

// ReadSymlinkRequest
class ReadSymlinkRequest : public NodeRequest {
public:
        ReadSymlinkRequest() : NodeRequest(READ_SYMLINK_REQUEST) {}

        size_t          size;
};

// ReadSymlinkReply
class ReadSymlinkReply : public ReplyRequest {
public:
        ReadSymlinkReply() : ReplyRequest(READ_SYMLINK_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
        size_t          bytesRead;
};

// CreateSymlinkRequest
class CreateSymlinkRequest : public NodeRequest {
public:
        CreateSymlinkRequest() : NodeRequest(CREATE_SYMLINK_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
        Address         target;
        int                     mode;
};

// CreateSymlinkReply
class CreateSymlinkReply : public ReplyRequest {
public:
        CreateSymlinkReply() : ReplyRequest(CREATE_SYMLINK_REPLY) {}
};

// LinkRequest
class LinkRequest : public NodeRequest {
public:
        LinkRequest() : NodeRequest(LINK_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
        void*           target;
};

// LinkReply
class LinkReply : public ReplyRequest {
public:
        LinkReply() : ReplyRequest(LINK_REPLY) {}
};

// UnlinkRequest
class UnlinkRequest : public NodeRequest {
public:
        UnlinkRequest() : NodeRequest(UNLINK_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
};

// UnlinkReply
class UnlinkReply : public ReplyRequest {
public:
        UnlinkReply() : ReplyRequest(UNLINK_REPLY) {}
};

// RenameRequest
class RenameRequest : public VolumeRequest {
public:
        RenameRequest() : VolumeRequest(RENAME_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        void*           oldDir;
        Address         oldName;
        void*           newDir;
        Address         newName;
};

// RenameReply
class RenameReply : public ReplyRequest {
public:
        RenameReply() : ReplyRequest(RENAME_REPLY) {}
};

// AccessRequest
class AccessRequest : public NodeRequest {
public:
        AccessRequest() : NodeRequest(ACCESS_REQUEST) {}

        int                     mode;
};

// AccessReply
class AccessReply : public ReplyRequest {
public:
        AccessReply() : ReplyRequest(ACCESS_REPLY) {}
};

// ReadStatRequest
class ReadStatRequest : public NodeRequest {
public:
        ReadStatRequest() : NodeRequest(READ_STAT_REQUEST) {}
};

// ReadStatReply
class ReadStatReply : public ReplyRequest {
public:
        ReadStatReply() : ReplyRequest(READ_STAT_REPLY) {}

        struct stat     st;
};

// WriteStatRequest
class WriteStatRequest : public NodeRequest {
public:
        WriteStatRequest() : NodeRequest(WRITE_STAT_REQUEST) {}

        struct stat     st;
        uint32          mask;
};

// WriteStatReply
class WriteStatReply : public ReplyRequest {
public:
        WriteStatReply() : ReplyRequest(WRITE_STAT_REPLY) {}
};


// #pragma mark - files


// CreateRequest
class CreateRequest : public NodeRequest {
public:
        CreateRequest() : NodeRequest(CREATE_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
        int                     openMode;
        int                     mode;
};

// CreateReply
class CreateReply : public ReplyRequest {
public:
        CreateReply() : ReplyRequest(CREATE_REPLY) {}

        ino_t           vnid;
        void*           fileCookie;
};

// OpenRequest
class OpenRequest : public NodeRequest {
public:
        OpenRequest() : NodeRequest(OPEN_REQUEST) {}

        int                     openMode;
};

// OpenReply
class OpenReply : public ReplyRequest {
public:
        OpenReply() : ReplyRequest(OPEN_REPLY) {}

        void*           fileCookie;
};

// CloseRequest
class CloseRequest : public FileRequest {
public:
        CloseRequest() : FileRequest(CLOSE_REQUEST) {}
};

// CloseReply
class CloseReply : public ReplyRequest {
public:
        CloseReply() : ReplyRequest(CLOSE_REPLY) {}
};

// FreeCookieRequest
class FreeCookieRequest : public FileRequest {
public:
        FreeCookieRequest() : FileRequest(FREE_COOKIE_REQUEST) {}
};

// FreeCookieReply
class FreeCookieReply : public ReplyRequest {
public:
        FreeCookieReply() : ReplyRequest(FREE_COOKIE_REPLY) {}
};

// ReadRequest
class ReadRequest : public FileRequest {
public:
        ReadRequest() : FileRequest(READ_REQUEST) {}

        off_t           pos;
        size_t          size;
};

// ReadReply
class ReadReply : public ReplyRequest {
public:
        ReadReply() : ReplyRequest(READ_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
        size_t          bytesRead;
};

// WriteRequest
class WriteRequest : public FileRequest {
public:
        WriteRequest() : FileRequest(WRITE_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
        off_t           pos;
};

// WriteReply
class WriteReply : public ReplyRequest {
public:
        WriteReply() : ReplyRequest(WRITE_REPLY) {}

        size_t          bytesWritten;
};


// #pragma mark - directories


// CreateDirRequest
class CreateDirRequest : public NodeRequest {
public:
        CreateDirRequest() : NodeRequest(CREATE_DIR_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
        int                     mode;
};

// CreateDirReply
class CreateDirReply : public ReplyRequest {
public:
        CreateDirReply() : ReplyRequest(CREATE_DIR_REPLY) {}
};

// RemoveDirRequest
class RemoveDirRequest : public NodeRequest {
public:
        RemoveDirRequest() : NodeRequest(REMOVE_DIR_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
};

// RemoveDirReply
class RemoveDirReply : public ReplyRequest {
public:
        RemoveDirReply() : ReplyRequest(REMOVE_DIR_REPLY) {}
};

// OpenDirRequest
class OpenDirRequest : public NodeRequest {
public:
        OpenDirRequest() : NodeRequest(OPEN_DIR_REQUEST) {}
};

// OpenDirReply
class OpenDirReply : public ReplyRequest {
public:
        OpenDirReply() : ReplyRequest(OPEN_DIR_REPLY) {}

        void*           dirCookie;
};

// CloseDirRequest
class CloseDirRequest : public DirRequest {
public:
        CloseDirRequest() : DirRequest(CLOSE_DIR_REQUEST) {}
};

// CloseDirReply
class CloseDirReply : public ReplyRequest {
public:
        CloseDirReply() : ReplyRequest(CLOSE_DIR_REPLY) {}
};

// FreeDirCookieRequest
class FreeDirCookieRequest : public DirRequest {
public:
        FreeDirCookieRequest() : DirRequest(FREE_DIR_COOKIE_REQUEST) {}
};

// FreeDirCookieReply
class FreeDirCookieReply : public ReplyRequest {
public:
        FreeDirCookieReply() : ReplyRequest(FREE_DIR_COOKIE_REPLY) {}
};

// ReadDirRequest
class ReadDirRequest : public DirRequest {
public:
        ReadDirRequest() : DirRequest(READ_DIR_REQUEST) {}

        size_t          bufferSize;
        uint32          count;
};

// ReadDirReply
class ReadDirReply : public ReplyRequest {
public:
        ReadDirReply() : ReplyRequest(READ_DIR_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        uint32          count;
        Address         buffer;
};

// RewindDirRequest
class RewindDirRequest : public DirRequest {
public:
        RewindDirRequest() : DirRequest(REWIND_DIR_REQUEST) {}
};

// RewindDirReply
class RewindDirReply : public ReplyRequest {
public:
        RewindDirReply() : ReplyRequest(REWIND_DIR_REPLY) {}
};


// #pragma mark - attribute directories


// OpenAttrDirRequest
class OpenAttrDirRequest : public NodeRequest {
public:
        OpenAttrDirRequest() : NodeRequest(OPEN_ATTR_DIR_REQUEST) {}
};

// OpenAttrDirReply
class OpenAttrDirReply : public ReplyRequest {
public:
        OpenAttrDirReply() : ReplyRequest(OPEN_ATTR_DIR_REPLY) {}

        void*           attrDirCookie;
};

// CloseAttrDirRequest
class CloseAttrDirRequest : public AttrDirRequest {
public:
        CloseAttrDirRequest() : AttrDirRequest(CLOSE_ATTR_DIR_REQUEST) {}
};

// CloseAttrDirReply
class CloseAttrDirReply : public ReplyRequest {
public:
        CloseAttrDirReply() : ReplyRequest(CLOSE_ATTR_DIR_REPLY) {}
};

// FreeAttrDirCookieRequest
class FreeAttrDirCookieRequest : public AttrDirRequest {
public:
        FreeAttrDirCookieRequest() : AttrDirRequest(FREE_ATTR_DIR_COOKIE_REQUEST) {}
};

// FreeAttrDirCookieReply
class FreeAttrDirCookieReply : public ReplyRequest {
public:
        FreeAttrDirCookieReply() : ReplyRequest(FREE_ATTR_DIR_COOKIE_REPLY) {}
};

// ReadAttrDirRequest
class ReadAttrDirRequest : public AttrDirRequest {
public:
        ReadAttrDirRequest() : AttrDirRequest(READ_ATTR_DIR_REQUEST) {}

        size_t          bufferSize;
        uint32          count;
};

// ReadAttrDirReply
class ReadAttrDirReply : public ReplyRequest {
public:
        ReadAttrDirReply() : ReplyRequest(READ_ATTR_DIR_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        uint32          count;
        Address         buffer;
};

// RewindAttrDirRequest
class RewindAttrDirRequest : public AttrDirRequest {
public:
        RewindAttrDirRequest() : AttrDirRequest(REWIND_ATTR_DIR_REQUEST) {}
};

// RewindAttrDirReply
class RewindAttrDirReply : public ReplyRequest {
public:
        RewindAttrDirReply() : ReplyRequest(REWIND_ATTR_DIR_REPLY) {}
};


// #pragma mark - attributes


// CreateAttrRequest
class CreateAttrRequest : public NodeRequest {
public:
        CreateAttrRequest() : NodeRequest(CREATE_ATTR_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
        uint32          type;
        int                     openMode;
};

// CreateAttrReply
class CreateAttrReply : public ReplyRequest {
public:
        CreateAttrReply() : ReplyRequest(CREATE_ATTR_REPLY) {}

        void*           attrCookie;
};

// OpenAttrRequest
class OpenAttrRequest : public NodeRequest {
public:
        OpenAttrRequest() : NodeRequest(OPEN_ATTR_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
        int                     openMode;
};

// OpenAttrReply
class OpenAttrReply : public ReplyRequest {
public:
        OpenAttrReply() : ReplyRequest(OPEN_ATTR_REPLY) {}

        void*           attrCookie;
};

// CloseAttrRequest
class CloseAttrRequest : public AttributeRequest {
public:
        CloseAttrRequest() : AttributeRequest(CLOSE_ATTR_REQUEST) {}
};

// CloseAttrReply
class CloseAttrReply : public ReplyRequest {
public:
        CloseAttrReply() : ReplyRequest(CLOSE_ATTR_REPLY) {}
};

// FreeAttrCookieRequest
class FreeAttrCookieRequest : public AttributeRequest {
public:
        FreeAttrCookieRequest() : AttributeRequest(FREE_ATTR_COOKIE_REQUEST) {}
};

// FreeAttrCookieReply
class FreeAttrCookieReply : public ReplyRequest {
public:
        FreeAttrCookieReply() : ReplyRequest(FREE_ATTR_COOKIE_REPLY) {}
};

// ReadAttrRequest
class ReadAttrRequest : public AttributeRequest {
public:
        ReadAttrRequest() : AttributeRequest(READ_ATTR_REQUEST) {}

        off_t           pos;
        size_t          size;
};

// ReadAttrReply
class ReadAttrReply : public ReplyRequest {
public:
        ReadAttrReply() : ReplyRequest(READ_ATTR_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
        size_t          bytesRead;
};

// WriteAttrRequest
class WriteAttrRequest : public AttributeRequest {
public:
        WriteAttrRequest() : AttributeRequest(WRITE_ATTR_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
        off_t           pos;
        size_t          size;
};

// WriteAttrReply
class WriteAttrReply : public ReplyRequest {
public:
        WriteAttrReply() : ReplyRequest(WRITE_ATTR_REPLY) {}

        size_t          bytesWritten;
};

// ReadAttrStatRequest
class ReadAttrStatRequest : public AttributeRequest {
public:
        ReadAttrStatRequest() : AttributeRequest(READ_ATTR_STAT_REQUEST) {}
};

// ReadAttrStatReply
class ReadAttrStatReply : public ReplyRequest {
public:
        ReadAttrStatReply() : ReplyRequest(READ_ATTR_STAT_REPLY) {}

        struct stat     st;
};

// WriteAttrStatRequest
class WriteAttrStatRequest : public AttributeRequest {
public:
        WriteAttrStatRequest() : AttributeRequest(WRITE_ATTR_STAT_REQUEST) {}

        struct stat     st;
        uint32          mask;
};

// WriteAttrStatReply
class WriteAttrStatReply : public ReplyRequest {
public:
        WriteAttrStatReply() : ReplyRequest(WRITE_ATTR_STAT_REPLY) {}
};

// RenameAttrRequest
class RenameAttrRequest : public VolumeRequest {
public:
        RenameAttrRequest() : VolumeRequest(RENAME_ATTR_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        void*           oldNode;
        void*           newNode;
        Address         oldName;
        Address         newName;
};

// RenameAttrReply
class RenameAttrReply : public ReplyRequest {
public:
        RenameAttrReply() : ReplyRequest(RENAME_ATTR_REPLY) {}
};

// RemoveAttrRequest
class RemoveAttrRequest : public NodeRequest {
public:
        RemoveAttrRequest() : NodeRequest(REMOVE_ATTR_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
};

// RemoveAttrReply
class RemoveAttrReply : public ReplyRequest {
public:
        RemoveAttrReply() : ReplyRequest(REMOVE_ATTR_REPLY) {}
};


// #pragma mark - indices


// OpenIndexDirRequest
class OpenIndexDirRequest : public VolumeRequest {
public:
        OpenIndexDirRequest() : VolumeRequest(OPEN_INDEX_DIR_REQUEST) {}
};

// OpenIndexDirReply
class OpenIndexDirReply : public ReplyRequest {
public:
        OpenIndexDirReply() : ReplyRequest(OPEN_INDEX_DIR_REPLY) {}

        void*           indexDirCookie;
};

// CloseIndexDirRequest
class CloseIndexDirRequest : public IndexDirRequest {
public:
        CloseIndexDirRequest() : IndexDirRequest(CLOSE_INDEX_DIR_REQUEST) {}
};

// CloseIndexDirReply
class CloseIndexDirReply : public ReplyRequest {
public:
        CloseIndexDirReply() : ReplyRequest(CLOSE_INDEX_DIR_REPLY) {}
};

// FreeIndexDirCookieRequest
class FreeIndexDirCookieRequest : public IndexDirRequest {
public:
        FreeIndexDirCookieRequest()
                : IndexDirRequest(FREE_INDEX_DIR_COOKIE_REQUEST) {}
};

// FreeIndexDirCookieReply
class FreeIndexDirCookieReply : public ReplyRequest {
public:
        FreeIndexDirCookieReply() : ReplyRequest(FREE_INDEX_DIR_COOKIE_REPLY) {}
};

// ReadIndexDirRequest
class ReadIndexDirRequest : public IndexDirRequest {
public:
        ReadIndexDirRequest() : IndexDirRequest(READ_INDEX_DIR_REQUEST) {}

        size_t          bufferSize;
        uint32          count;
};

// ReadIndexDirReply
class ReadIndexDirReply : public ReplyRequest {
public:
        ReadIndexDirReply() : ReplyRequest(READ_INDEX_DIR_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        uint32          count;
        Address         buffer;
};

// RewindIndexDirRequest
class RewindIndexDirRequest : public IndexDirRequest {
public:
        RewindIndexDirRequest() : IndexDirRequest(REWIND_INDEX_DIR_REQUEST) {}
};

// RewindIndexDirReply
class RewindIndexDirReply : public ReplyRequest {
public:
        RewindIndexDirReply() : ReplyRequest(REWIND_INDEX_DIR_REPLY) {}
};

// CreateIndexRequest
class CreateIndexRequest : public VolumeRequest {
public:
        CreateIndexRequest() : VolumeRequest(CREATE_INDEX_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
        uint32          type;
        uint32          flags;
};

// CreateIndexReply
class CreateIndexReply : public ReplyRequest {
public:
        CreateIndexReply() : ReplyRequest(CREATE_INDEX_REPLY) {}
};

// RemoveIndexRequest
class RemoveIndexRequest : public VolumeRequest {
public:
        RemoveIndexRequest() : VolumeRequest(REMOVE_INDEX_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
};

// RemoveIndexReply
class RemoveIndexReply : public ReplyRequest {
public:
        RemoveIndexReply() : ReplyRequest(REMOVE_INDEX_REPLY) {}
};

// ReadIndexStatRequest
class ReadIndexStatRequest : public VolumeRequest {
public:
        ReadIndexStatRequest() : VolumeRequest(READ_INDEX_STAT_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         name;
};

// ReadIndexStatReply
class ReadIndexStatReply : public ReplyRequest {
public:
        ReadIndexStatReply() : ReplyRequest(READ_INDEX_STAT_REPLY) {}

        struct stat     st;
};


// #pragma mark - queries


// OpenQueryRequest
class OpenQueryRequest : public VolumeRequest {
public:
        OpenQueryRequest() : VolumeRequest(OPEN_QUERY_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         queryString;
        uint32          flags;
        port_id         port;
        uint32          token;
};

// OpenQueryReply
class OpenQueryReply : public ReplyRequest {
public:
        OpenQueryReply() : ReplyRequest(OPEN_QUERY_REPLY) {}

        void*           queryCookie;
};

// CloseQueryRequest
class CloseQueryRequest : public QueryRequest {
public:
        CloseQueryRequest() : QueryRequest(CLOSE_QUERY_REQUEST) {}
};

// CloseQueryReply
class CloseQueryReply : public ReplyRequest {
public:
        CloseQueryReply() : ReplyRequest(CLOSE_QUERY_REPLY) {}
};

// FreeQueryCookieRequest
class FreeQueryCookieRequest : public QueryRequest {
public:
        FreeQueryCookieRequest() : QueryRequest(FREE_QUERY_COOKIE_REQUEST) {}
};

// FreeQueryCookieReply
class FreeQueryCookieReply : public ReplyRequest {
public:
        FreeQueryCookieReply() : ReplyRequest(FREE_QUERY_COOKIE_REPLY) {}
};

// ReadQueryRequest
class ReadQueryRequest : public QueryRequest {
public:
        ReadQueryRequest() : QueryRequest(READ_QUERY_REQUEST) {}

        size_t          bufferSize;
        uint32          count;
};

// ReadQueryReply
class ReadQueryReply : public ReplyRequest {
public:
        ReadQueryReply() : ReplyRequest(READ_QUERY_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        uint32          count;
        Address         buffer;
};

// RewindQueryRequest
class RewindQueryRequest : public QueryRequest {
public:
        RewindQueryRequest() : QueryRequest(REWIND_QUERY_REQUEST) {}
};

// RewindQueryReply
class RewindQueryReply : public ReplyRequest {
public:
        RewindQueryReply() : ReplyRequest(REWIND_QUERY_REPLY) {}
};


// #pragma mark ----- node monitoring -----


// NodeMonitoringEventRequest
class NodeMonitoringEventRequest : public KernelRequest {
public:
        NodeMonitoringEventRequest()
                : KernelRequest(NODE_MONITORING_EVENT_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        void*           listener;
        Address         event;
};

// NodeMonitoringEventReply
class NodeMonitoringEventReply : public ReplyRequest {
public:
        NodeMonitoringEventReply() : ReplyRequest(NODE_MONITORING_EVENT_REPLY) {}
};


// #pragma mark -
// #pragma mark ----- userland requests -----

// #pragma mark -
// #pragma mark ----- notifications -----

// NotifyListenerRequest
class NotifyListenerRequest : public Request {
public:
        NotifyListenerRequest() : Request(NOTIFY_LISTENER_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        int32           operation;
        uint32          details;                        // for B_STAT_CHANGED:statFields
                                                                        // and B_ATTRIBUTE_CHANGED:cause
        dev_t           device;
        ino_t           oldDirectory;
        ino_t           directory;
        ino_t           node;
        Address         oldName;
        Address         name;
};

// NotifyListenerReply
class NotifyListenerReply : public ReplyRequest {
public:
        NotifyListenerReply() : ReplyRequest(NOTIFY_LISTENER_REPLY) {}
};

// NotifySelectRequest
class NotifySelectEventRequest : public Request {
public:
        NotifySelectEventRequest() : Request(NOTIFY_SELECT_EVENT_REQUEST) {}

        selectsync*     sync;
        uint8           event;
        bool            unspecifiedEvent;
};

// NotifySelectEventReply
class NotifySelectEventReply : public ReplyRequest {
public:
        NotifySelectEventReply() : ReplyRequest(NOTIFY_SELECT_EVENT_REPLY) {}
};

// NotifyQueryRequest
class NotifyQueryRequest : public Request {
public:
        NotifyQueryRequest() : Request(NOTIFY_QUERY_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        port_id         port;
        int32           token;
        int32           operation;                      // B_ENTRY_{CREATED,REMOVED}
        dev_t           device;
        ino_t           directory;
        ino_t           node;
        Address         name;
};

// NotifyQueryReply
class NotifyQueryReply : public ReplyRequest {
public:
        NotifyQueryReply() : ReplyRequest(NOTIFY_QUERY_REPLY) {}
};


// #pragma mark -
// #pragma mark ----- vnodes -----

// GetVNodeRequest
class GetVNodeRequest : public Request {
public:
        GetVNodeRequest() : Request(GET_VNODE_REQUEST) {}

        dev_t           nsid;
        ino_t           vnid;
};

// GetVNodeReply
class GetVNodeReply : public ReplyRequest {
public:
        GetVNodeReply() : ReplyRequest(GET_VNODE_REPLY) {}

        void*           node;
};

// PutVNodeRequest
class PutVNodeRequest : public Request {
public:
        PutVNodeRequest() : Request(PUT_VNODE_REQUEST) {}

        dev_t           nsid;
        ino_t           vnid;
};

// PutVNodeReply
class PutVNodeReply : public ReplyRequest {
public:
        PutVNodeReply() : ReplyRequest(PUT_VNODE_REPLY) {}
};

// AcquireVNodeRequest
class AcquireVNodeRequest : public Request {
public:
        AcquireVNodeRequest() : Request(ACQUIRE_VNODE_REQUEST) {}

        dev_t           nsid;
        ino_t           vnid;
};

// AcquireVNodeReply
class AcquireVNodeReply : public ReplyRequest {
public:
        AcquireVNodeReply() : ReplyRequest(ACQUIRE_VNODE_REPLY) {}
};

// NewVNodeRequest
class NewVNodeRequest : public Request {
public:
        NewVNodeRequest() : Request(NEW_VNODE_REQUEST) {}

        dev_t                           nsid;
        ino_t                           vnid;
        void*                           node;
        FSVNodeCapabilities     capabilities;
};

// NewVNodeReply
class NewVNodeReply : public ReplyRequest {
public:
        NewVNodeReply() : ReplyRequest(NEW_VNODE_REPLY) {}
};

// PublishVNodeRequest
class PublishVNodeRequest : public Request {
public:
        PublishVNodeRequest() : Request(PUBLISH_VNODE_REQUEST) {}

        dev_t                           nsid;
        ino_t                           vnid;
        void*                           node;
        int                                     type;
        uint32                          flags;
        FSVNodeCapabilities     capabilities;
};

// PublishVNodeReply
class PublishVNodeReply : public ReplyRequest {
public:
        PublishVNodeReply() : ReplyRequest(PUBLISH_VNODE_REPLY) {}
};

// RemoveVNodeRequest
class RemoveVNodeRequest : public Request {
public:
        RemoveVNodeRequest() : Request(REMOVE_VNODE_REQUEST) {}

        dev_t           nsid;
        ino_t           vnid;
};

// RemoveVNodeReply
class RemoveVNodeReply : public ReplyRequest {
public:
        RemoveVNodeReply() : ReplyRequest(REMOVE_VNODE_REPLY) {}
};

// UnremoveVNodeRequest
class UnremoveVNodeRequest : public Request {
public:
        UnremoveVNodeRequest() : Request(UNREMOVE_VNODE_REQUEST) {}

        dev_t           nsid;
        ino_t           vnid;
};

// UnremoveVNodeReply
class UnremoveVNodeReply : public ReplyRequest {
public:
        UnremoveVNodeReply() : ReplyRequest(UNREMOVE_VNODE_REPLY) {}
};

// GetVNodeRemovedRequest
class GetVNodeRemovedRequest : public Request {
public:
        GetVNodeRemovedRequest() : Request(GET_VNODE_REMOVED_REQUEST) {}

        dev_t           nsid;
        ino_t           vnid;
};

// GetVNodeRemovedReply
class GetVNodeRemovedReply : public ReplyRequest {
public:
        GetVNodeRemovedReply() : ReplyRequest(GET_VNODE_REMOVED_REPLY) {}

        bool            removed;
};


// #pragma mark - file cache


// FileCacheCreateRequest
class FileCacheCreateRequest : public FileCacheRequest {
public:
        FileCacheCreateRequest() : FileCacheRequest(FILE_CACHE_CREATE_REQUEST) {}

        off_t           size;
};

// FileCacheCreateReply
class FileCacheCreateReply : public ReplyRequest {
public:
        FileCacheCreateReply() : ReplyRequest(FILE_CACHE_CREATE_REPLY) {}
};

// FileCacheDeleteRequest
class FileCacheDeleteRequest : public FileCacheRequest {
public:
        FileCacheDeleteRequest() : FileCacheRequest(FILE_CACHE_DELETE_REQUEST) {}
};

// FileCacheDeleteReply
class FileCacheDeleteReply : public ReplyRequest {
public:
        FileCacheDeleteReply() : ReplyRequest(FILE_CACHE_DELETE_REPLY) {}
};

// FileCacheSetEnabledRequest
class FileCacheSetEnabledRequest : public FileCacheRequest {
public:
        FileCacheSetEnabledRequest()
                : FileCacheRequest(FILE_CACHE_SET_ENABLED_REQUEST) {}

        bool            enabled;
};

// FileCacheSetEnabledReply
class FileCacheSetEnabledReply : public ReplyRequest {
public:
        FileCacheSetEnabledReply() : ReplyRequest(FILE_CACHE_SET_ENABLED_REPLY) {}
};

// FileCacheSetSizeRequest
class FileCacheSetSizeRequest : public FileCacheRequest {
public:
        FileCacheSetSizeRequest() : FileCacheRequest(FILE_CACHE_SET_SIZE_REQUEST) {}

        size_t          size;
};

// FileCacheSetSizeReply
class FileCacheSetSizeReply : public ReplyRequest {
public:
        FileCacheSetSizeReply() : ReplyRequest(FILE_CACHE_SET_SIZE_REPLY) {}
};


// FileCacheSyncRequest
class FileCacheSyncRequest : public FileCacheRequest {
public:
        FileCacheSyncRequest() : FileCacheRequest(FILE_CACHE_SYNC_REQUEST) {}
};

// FileCacheSyncReply
class FileCacheSyncReply : public ReplyRequest {
public:
        FileCacheSyncReply() : ReplyRequest(FILE_CACHE_SYNC_REPLY) {}
};


// FileCacheReadRequest
class FileCacheReadRequest : public FileCacheRequest {
public:
        FileCacheReadRequest() : FileCacheRequest(FILE_CACHE_READ_REQUEST) {}

        void*           cookie;
        off_t           pos;
        size_t          size;
};

// FileCacheReadReply
class FileCacheReadReply : public ReplyRequest {
public:
        FileCacheReadReply() : ReplyRequest(FILE_CACHE_READ_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
        size_t          bytesRead;
};

// FileCacheWriteRequest
class FileCacheWriteRequest : public FileCacheRequest {
public:
        FileCacheWriteRequest() : FileCacheRequest(FILE_CACHE_WRITE_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        void*           cookie;
        Address         buffer;
        size_t          size;
        off_t           pos;
};

// FileCacheWriteReply
class FileCacheWriteReply : public ReplyRequest {
public:
        FileCacheWriteReply() : ReplyRequest(FILE_CACHE_WRITE_REPLY) {}

        size_t          bytesWritten;
};


// #pragma mark - I/O


// DoIterativeFDIORequest
class DoIterativeFDIORequest : public Request {
public:
        DoIterativeFDIORequest() : Request(DO_ITERATIVE_FD_IO_REQUEST) {}

        enum { MAX_VECS = 8 };

        dev_t           nsid;
        int                     fd;
        int32           request;
        void*           cookie;
        file_io_vec     vecs[MAX_VECS];
        uint32          vecCount;
};

// DoIterativeFDIOReply
class DoIterativeFDIOReply : public ReplyRequest {
public:
        DoIterativeFDIOReply() : ReplyRequest(DO_ITERATIVE_FD_IO_REPLY) {}
};

// ReadFromIORequestRequest
class ReadFromIORequestRequest : public IORequestRequest {
public:
        ReadFromIORequestRequest()
                : IORequestRequest(READ_FROM_IO_REQUEST_REQUEST) {}

        size_t          size;
};

// ReadFromIORequestReply
class ReadFromIORequestReply : public ReplyRequest {
public:
        ReadFromIORequestReply() : ReplyRequest(READ_FROM_IO_REQUEST_REPLY) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
};

// WriteToIORequestRequest
class WriteToIORequestRequest : public IORequestRequest {
public:
        WriteToIORequestRequest() : IORequestRequest(WRITE_TO_IO_REQUEST_REQUEST) {}
        status_t GetAddressInfos(AddressInfo* infos, int32* count);

        Address         buffer;
};

// WriteToIORequestReply
class WriteToIORequestReply : public ReplyRequest {
public:
        WriteToIORequestReply() : ReplyRequest(WRITE_TO_IO_REQUEST_REPLY) {}
};

// NotifyIORequestRequest
class NotifyIORequestRequest : public IORequestRequest {
public:
        NotifyIORequestRequest() : IORequestRequest(NOTIFY_IO_REQUEST_REQUEST) {}

        enum { MAX_VECS = 8 };

        status_t        status;
};

// NotifyIORequestReply
class NotifyIORequestReply : public ReplyRequest {
public:
        NotifyIORequestReply() : ReplyRequest(NOTIFY_IO_REQUEST_REPLY) {}
};


// #pragma mark - node monitoring


// AddNodeListenerRequest
class AddNodeListenerRequest : public Request {
public:
        AddNodeListenerRequest() : Request(ADD_NODE_LISTENER_REQUEST) {}

        dev_t           device;
        ino_t           node;
        uint32          flags;
        void*           listener;
};

// AddNodeListenerReply
class AddNodeListenerReply : public ReplyRequest {
public:
        AddNodeListenerReply() : ReplyRequest(ADD_NODE_LISTENER_REPLY) {}
};

// RemoveNodeListenerRequest
class RemoveNodeListenerRequest : public Request {
public:
        RemoveNodeListenerRequest() : Request(REMOVE_NODE_LISTENER_REQUEST) {}

        dev_t           device;
        ino_t           node;
        void*           listener;
};

// RemoveNodeListenerReply
class RemoveNodeListenerReply : public ReplyRequest {
public:
        RemoveNodeListenerReply() : ReplyRequest(REMOVE_NODE_LISTENER_REPLY) {}
};


//////////////////
// General Reply

// ReceiptAckReply
class ReceiptAckReply : public ReplyRequest {
public:
        ReceiptAckReply() : ReplyRequest(RECEIPT_ACK_REPLY) {}
};


///////////////////
// Request Checks

// do_for_request
template<class Task>
static
status_t
do_for_request(Request* request, Task& task)
{
        if (!request)
                return B_BAD_VALUE;
        switch (request->GetType()) {
                // kernel -> userland requests
                // administrative
                case UFS_DISCONNECT_REQUEST:
                        return task((UFSDisconnectRequest*)request);
                case FS_CONNECT_REQUEST:
                        return task((FSConnectRequest*)request);
                case FS_CONNECT_REPLY:
                        return task((FSConnectReply*)request);
                // FS
                case MOUNT_VOLUME_REQUEST:
                        return task((MountVolumeRequest*)request);
                case MOUNT_VOLUME_REPLY:
                        return task((MountVolumeReply*)request);
                case UNMOUNT_VOLUME_REQUEST:
                        return task((UnmountVolumeRequest*)request);
                case UNMOUNT_VOLUME_REPLY:
                        return task((UnmountVolumeReply*)request);
//              case INITIALIZE_VOLUME_REQUEST:
//                      return task((InitializeVolumeRequest*)request);
//              case INITIALIZE_VOLUME_REPLY:
//                      return task((InitializeVolumeReply*)request);
                case SYNC_VOLUME_REQUEST:
                        return task((SyncVolumeRequest*)request);
                case SYNC_VOLUME_REPLY:
                        return task((SyncVolumeReply*)request);
                case READ_FS_INFO_REQUEST:
                        return task((ReadFSInfoRequest*)request);
                case READ_FS_INFO_REPLY:
                        return task((ReadFSInfoReply*)request);
                case WRITE_FS_INFO_REQUEST:
                        return task((WriteFSInfoRequest*)request);
                case WRITE_FS_INFO_REPLY:
                        return task((WriteFSInfoReply*)request);
                // vnodes
                case LOOKUP_REQUEST:
                        return task((LookupRequest*)request);
                case LOOKUP_REPLY:
                        return task((LookupReply*)request);
                case GET_VNODE_NAME_REQUEST:
                        return task((GetVNodeNameRequest*)request);
                case GET_VNODE_NAME_REPLY:
                        return task((GetVNodeNameReply*)request);
                case READ_VNODE_REQUEST:
                        return task((ReadVNodeRequest*)request);
                case READ_VNODE_REPLY:
                        return task((ReadVNodeReply*)request);
                case WRITE_VNODE_REQUEST:
                        return task((WriteVNodeRequest*)request);
                case WRITE_VNODE_REPLY:
                        return task((WriteVNodeReply*)request);
                case FS_REMOVE_VNODE_REQUEST:
                        return task((FSRemoveVNodeRequest*)request);
                case FS_REMOVE_VNODE_REPLY:
                        return task((FSRemoveVNodeReply*)request);
                // asynchronous I/O
                case DO_IO_REQUEST:
                        return task((DoIORequest*)request);
                case DO_IO_REPLY:
                        return task((DoIOReply*)request);
                case CANCEL_IO_REQUEST:
                        return task((CancelIORequest*)request);
                case CANCEL_IO_REPLY:
                        return task((CancelIOReply*)request);
                case ITERATIVE_IO_GET_VECS_REQUEST:
                        return task((IterativeIOGetVecsRequest*)request);
                case ITERATIVE_IO_GET_VECS_REPLY:
                        return task((IterativeIOGetVecsReply*)request);
                case ITERATIVE_IO_FINISHED_REQUEST:
                        return task((IterativeIOFinishedRequest*)request);
                case ITERATIVE_IO_FINISHED_REPLY:
                        return task((IterativeIOFinishedReply*)request);
                // nodes
                case IOCTL_REQUEST:
                        return task((IOCtlRequest*)request);
                case IOCTL_REPLY:
                        return task((IOCtlReply*)request);
                case SET_FLAGS_REQUEST:
                        return task((SetFlagsRequest*)request);
                case SET_FLAGS_REPLY:
                        return task((SetFlagsReply*)request);
                case SELECT_REQUEST:
                        return task((SelectRequest*)request);
                case SELECT_REPLY:
                        return task((SelectReply*)request);
                case DESELECT_REQUEST:
                        return task((DeselectRequest*)request);
                case DESELECT_REPLY:
                        return task((DeselectReply*)request);
                case FSYNC_REQUEST:
                        return task((FSyncRequest*)request);
                case FSYNC_REPLY:
                        return task((FSyncReply*)request);
                case READ_SYMLINK_REQUEST:
                        return task((ReadSymlinkRequest*)request);
                case READ_SYMLINK_REPLY:
                        return task((ReadSymlinkReply*)request);
                case CREATE_SYMLINK_REQUEST:
                        return task((CreateSymlinkRequest*)request);
                case CREATE_SYMLINK_REPLY:
                        return task((CreateSymlinkReply*)request);
                case LINK_REQUEST:
                        return task((LinkRequest*)request);
                case LINK_REPLY:
                        return task((LinkReply*)request);
                case UNLINK_REQUEST:
                        return task((UnlinkRequest*)request);
                case UNLINK_REPLY:
                        return task((UnlinkReply*)request);
                case RENAME_REQUEST:
                        return task((RenameRequest*)request);
                case RENAME_REPLY:
                        return task((RenameReply*)request);
                case ACCESS_REQUEST:
                        return task((AccessRequest*)request);
                case ACCESS_REPLY:
                        return task((AccessReply*)request);
                case READ_STAT_REQUEST:
                        return task((ReadStatRequest*)request);
                case READ_STAT_REPLY:
                        return task((ReadStatReply*)request);
                case WRITE_STAT_REQUEST:
                        return task((WriteStatRequest*)request);
                case WRITE_STAT_REPLY:
                        return task((WriteStatReply*)request);
                // files
                case CREATE_REQUEST:
                        return task((CreateRequest*)request);
                case CREATE_REPLY:
                        return task((CreateReply*)request);
                case OPEN_REQUEST:
                        return task((OpenRequest*)request);
                case OPEN_REPLY:
                        return task((OpenReply*)request);
                case CLOSE_REQUEST:
                        return task((CloseRequest*)request);
                case CLOSE_REPLY:
                        return task((CloseReply*)request);
                case FREE_COOKIE_REQUEST:
                        return task((FreeCookieRequest*)request);
                case FREE_COOKIE_REPLY:
                        return task((FreeCookieReply*)request);
                case READ_REQUEST:
                        return task((ReadRequest*)request);
                case READ_REPLY:
                        return task((ReadReply*)request);
                case WRITE_REQUEST:
                        return task((WriteRequest*)request);
                case WRITE_REPLY:
                        return task((WriteReply*)request);
                // directories
                case CREATE_DIR_REQUEST:
                        return task((CreateDirRequest*)request);
                case CREATE_DIR_REPLY:
                        return task((CreateDirReply*)request);
                case REMOVE_DIR_REQUEST:
                        return task((RemoveDirRequest*)request);
                case REMOVE_DIR_REPLY:
                        return task((RemoveDirReply*)request);
                case OPEN_DIR_REQUEST:
                        return task((OpenDirRequest*)request);
                case OPEN_DIR_REPLY:
                        return task((OpenDirReply*)request);
                case CLOSE_DIR_REQUEST:
                        return task((CloseDirRequest*)request);
                case CLOSE_DIR_REPLY:
                        return task((CloseDirReply*)request);
                case FREE_DIR_COOKIE_REQUEST:
                        return task((FreeDirCookieRequest*)request);
                case FREE_DIR_COOKIE_REPLY:
                        return task((FreeDirCookieReply*)request);
                case READ_DIR_REQUEST:
                        return task((ReadDirRequest*)request);
                case READ_DIR_REPLY:
                        return task((ReadDirReply*)request);
                case REWIND_DIR_REQUEST:
                        return task((RewindDirRequest*)request);
                case REWIND_DIR_REPLY:
                        return task((RewindDirReply*)request);
                // attribute directories
                case OPEN_ATTR_DIR_REQUEST:
                        return task((OpenAttrDirRequest*)request);
                case OPEN_ATTR_DIR_REPLY:
                        return task((OpenAttrDirReply*)request);
                case CLOSE_ATTR_DIR_REQUEST:
                        return task((CloseAttrDirRequest*)request);
                case CLOSE_ATTR_DIR_REPLY:
                        return task((CloseAttrDirReply*)request);
                case FREE_ATTR_DIR_COOKIE_REQUEST:
                        return task((FreeAttrDirCookieRequest*)request);
                case FREE_ATTR_DIR_COOKIE_REPLY:
                        return task((FreeAttrDirCookieReply*)request);
                case READ_ATTR_DIR_REQUEST:
                        return task((ReadAttrDirRequest*)request);
                case READ_ATTR_DIR_REPLY:
                        return task((ReadAttrDirReply*)request);
                case REWIND_ATTR_DIR_REQUEST:
                        return task((RewindAttrDirRequest*)request);
                case REWIND_ATTR_DIR_REPLY:
                        return task((RewindAttrDirReply*)request);
                // attributes
                case CREATE_ATTR_REQUEST:
                        return task((CreateAttrRequest*)request);
                case CREATE_ATTR_REPLY:
                        return task((CreateAttrReply*)request);
                case OPEN_ATTR_REQUEST:
                        return task((OpenAttrRequest*)request);
                case OPEN_ATTR_REPLY:
                        return task((OpenAttrReply*)request);
                case CLOSE_ATTR_REQUEST:
                        return task((CloseAttrRequest*)request);
                case CLOSE_ATTR_REPLY:
                        return task((CloseAttrReply*)request);
                case FREE_ATTR_COOKIE_REQUEST:
                        return task((FreeAttrCookieRequest*)request);
                case FREE_ATTR_COOKIE_REPLY:
                        return task((FreeAttrCookieReply*)request);
                case READ_ATTR_REQUEST:
                        return task((ReadAttrRequest*)request);
                case READ_ATTR_REPLY:
                        return task((ReadAttrReply*)request);
                case WRITE_ATTR_REQUEST:
                        return task((WriteAttrRequest*)request);
                case WRITE_ATTR_REPLY:
                        return task((WriteAttrReply*)request);
                case READ_ATTR_STAT_REQUEST:
                        return task((ReadAttrStatRequest*)request);
                case READ_ATTR_STAT_REPLY:
                        return task((ReadAttrStatReply*)request);
                case WRITE_ATTR_STAT_REQUEST:
                        return task((WriteAttrStatRequest*)request);
                case WRITE_ATTR_STAT_REPLY:
                        return task((WriteAttrStatReply*)request);
                case RENAME_ATTR_REQUEST:
                        return task((RenameAttrRequest*)request);
                case RENAME_ATTR_REPLY:
                        return task((RenameAttrReply*)request);
                case REMOVE_ATTR_REQUEST:
                        return task((RemoveAttrRequest*)request);
                case REMOVE_ATTR_REPLY:
                        return task((RemoveAttrReply*)request);
                // indices
                case OPEN_INDEX_DIR_REQUEST:
                        return task((OpenIndexDirRequest*)request);
                case OPEN_INDEX_DIR_REPLY:
                        return task((OpenIndexDirReply*)request);
                case CLOSE_INDEX_DIR_REQUEST:
                        return task((CloseIndexDirRequest*)request);
                case CLOSE_INDEX_DIR_REPLY:
                        return task((CloseIndexDirReply*)request);
                case FREE_INDEX_DIR_COOKIE_REQUEST:
                        return task((FreeIndexDirCookieRequest*)request);
                case FREE_INDEX_DIR_COOKIE_REPLY:
                        return task((FreeIndexDirCookieReply*)request);
                case READ_INDEX_DIR_REQUEST:
                        return task((ReadIndexDirRequest*)request);
                case READ_INDEX_DIR_REPLY:
                        return task((ReadIndexDirReply*)request);
                case REWIND_INDEX_DIR_REQUEST:
                        return task((RewindIndexDirRequest*)request);
                case REWIND_INDEX_DIR_REPLY:
                        return task((RewindIndexDirReply*)request);
                case CREATE_INDEX_REQUEST:
                        return task((CreateIndexRequest*)request);
                case CREATE_INDEX_REPLY:
                        return task((CreateIndexReply*)request);
                case REMOVE_INDEX_REQUEST:
                        return task((RemoveIndexRequest*)request);
                case REMOVE_INDEX_REPLY:
                        return task((RemoveIndexReply*)request);
                case READ_INDEX_STAT_REQUEST:
                        return task((ReadIndexStatRequest*)request);
                case READ_INDEX_STAT_REPLY:
                        return task((ReadIndexStatReply*)request);
                // queries
                case OPEN_QUERY_REQUEST:
                        return task((OpenQueryRequest*)request);
                case OPEN_QUERY_REPLY:
                        return task((OpenQueryReply*)request);
                case CLOSE_QUERY_REQUEST:
                        return task((CloseQueryRequest*)request);
                case CLOSE_QUERY_REPLY:
                        return task((CloseQueryReply*)request);
                case FREE_QUERY_COOKIE_REQUEST:
                        return task((FreeQueryCookieRequest*)request);
                case FREE_QUERY_COOKIE_REPLY:
                        return task((FreeQueryCookieReply*)request);
                case READ_QUERY_REQUEST:
                        return task((ReadQueryRequest*)request);
                case READ_QUERY_REPLY:
                        return task((ReadQueryReply*)request);
                case REWIND_QUERY_REQUEST:
                        return task((RewindQueryRequest*)request);
                case REWIND_QUERY_REPLY:
                        return task((RewindQueryReply*)request);
                // node monitoring
                case NODE_MONITORING_EVENT_REQUEST:
                        return task((NodeMonitoringEventRequest*)request);
                case NODE_MONITORING_EVENT_REPLY:
                        return task((NodeMonitoringEventReply*)request);

                // userland -> kernel requests
                // notifications
                case NOTIFY_LISTENER_REQUEST:
                        return task((NotifyListenerRequest*)request);
                case NOTIFY_LISTENER_REPLY:
                        return task((NotifyListenerReply*)request);
                case NOTIFY_SELECT_EVENT_REQUEST:
                        return task((NotifySelectEventRequest*)request);
                case NOTIFY_SELECT_EVENT_REPLY:
                        return task((NotifySelectEventReply*)request);
                case NOTIFY_QUERY_REQUEST:
                        return task((NotifyQueryRequest*)request);
                case NOTIFY_QUERY_REPLY:
                        return task((NotifyQueryReply*)request);
                // vnodes
                case GET_VNODE_REQUEST:
                        return task((GetVNodeRequest*)request);
                case GET_VNODE_REPLY:
                        return task((GetVNodeReply*)request);
                case PUT_VNODE_REQUEST:
                        return task((PutVNodeRequest*)request);
                case PUT_VNODE_REPLY:
                        return task((PutVNodeReply*)request);
                case ACQUIRE_VNODE_REQUEST:
                        return task((PutVNodeRequest*)request);
                case ACQUIRE_VNODE_REPLY:
                        return task((AcquireVNodeReply*)request);
                case NEW_VNODE_REQUEST:
                        return task((NewVNodeRequest*)request);
                case NEW_VNODE_REPLY:
                        return task((NewVNodeReply*)request);
                case PUBLISH_VNODE_REQUEST:
                        return task((PublishVNodeRequest*)request);
                case PUBLISH_VNODE_REPLY:
                        return task((PublishVNodeReply*)request);
                case REMOVE_VNODE_REQUEST:
                        return task((RemoveVNodeRequest*)request);
                case REMOVE_VNODE_REPLY:
                        return task((RemoveVNodeReply*)request);
                case UNREMOVE_VNODE_REQUEST:
                        return task((UnremoveVNodeRequest*)request);
                case UNREMOVE_VNODE_REPLY:
                        return task((UnremoveVNodeReply*)request);
                case GET_VNODE_REMOVED_REQUEST:
                        return task((GetVNodeRemovedRequest*)request);
                case GET_VNODE_REMOVED_REPLY:
                        return task((GetVNodeRemovedReply*)request);
                // file cache
                case FILE_CACHE_CREATE_REQUEST:
                        return task((FileCacheCreateRequest*)request);
                case FILE_CACHE_CREATE_REPLY:
                        return task((FileCacheCreateReply*)request);
                case FILE_CACHE_DELETE_REQUEST:
                        return task((FileCacheDeleteRequest*)request);
                case FILE_CACHE_DELETE_REPLY:
                        return task((FileCacheDeleteReply*)request);
                case FILE_CACHE_SET_ENABLED_REQUEST:
                        return task((FileCacheSetEnabledRequest*)request);
                case FILE_CACHE_SET_ENABLED_REPLY:
                        return task((FileCacheSetEnabledReply*)request);
                case FILE_CACHE_SET_SIZE_REQUEST:
                        return task((FileCacheSetSizeRequest*)request);
                case FILE_CACHE_SET_SIZE_REPLY:
                        return task((FileCacheSetSizeReply*)request);
                case FILE_CACHE_SYNC_REQUEST:
                        return task((FileCacheSyncRequest*)request);
                case FILE_CACHE_SYNC_REPLY:
                        return task((FileCacheSyncReply*)request);
                case FILE_CACHE_READ_REQUEST:
                        return task((FileCacheReadRequest*)request);
                case FILE_CACHE_READ_REPLY:
                        return task((FileCacheReadReply*)request);
                case FILE_CACHE_WRITE_REQUEST:
                        return task((FileCacheWriteRequest*)request);
                case FILE_CACHE_WRITE_REPLY:
                        return task((FileCacheWriteReply*)request);
                // I/O
                case DO_ITERATIVE_FD_IO_REQUEST:
                        return task((DoIterativeFDIORequest*)request);
                case DO_ITERATIVE_FD_IO_REPLY:
                        return task((DoIterativeFDIOReply*)request);
                case READ_FROM_IO_REQUEST_REQUEST:
                        return task((ReadFromIORequestRequest*)request);
                case READ_FROM_IO_REQUEST_REPLY:
                        return task((ReadFromIORequestReply*)request);
                case WRITE_TO_IO_REQUEST_REQUEST:
                        return task((WriteToIORequestRequest*)request);
                case WRITE_TO_IO_REQUEST_REPLY:
                        return task((WriteToIORequestReply*)request);
                case NOTIFY_IO_REQUEST_REQUEST:
                        return task((NotifyIORequestRequest*)request);
                case NOTIFY_IO_REQUEST_REPLY:
                        return task((NotifyIORequestReply*)request);
                // node monitoring
                case ADD_NODE_LISTENER_REQUEST:
                        return task((AddNodeListenerRequest*)request);
                case ADD_NODE_LISTENER_REPLY:
                        return task((AddNodeListenerReply*)request);
                case REMOVE_NODE_LISTENER_REQUEST:
                        return task((RemoveNodeListenerRequest*)request);
                case REMOVE_NODE_LISTENER_REPLY:
                        return task((RemoveNodeListenerReply*)request);
                // general reply
                case RECEIPT_ACK_REPLY:
                        return task((ReceiptAckReply*)request);
                default:
                        return B_BAD_DATA;
        }
}

status_t get_request_address_infos(Request* request, AddressInfo* infos,
        int32* count);
status_t check_request(Request* request);
status_t relocate_request(Request* request, int32 requestBufferSize,
        area_id* areas, int32* count);

}       // namespace UserlandFSUtil

using UserlandFSUtil::ReplyRequest;
using UserlandFSUtil::KernelRequest;
using UserlandFSUtil::VolumeRequest;
using UserlandFSUtil::NodeRequest;
using UserlandFSUtil::FileRequest;
using UserlandFSUtil::DirRequest;
using UserlandFSUtil::AttrDirRequest;
using UserlandFSUtil::IndexDirRequest;

// kernel -> userland requests
// administrative
using UserlandFSUtil::UFSDisconnectRequest;
using UserlandFSUtil::FSConnectRequest;
using UserlandFSUtil::FSConnectReply;
// FS
using UserlandFSUtil::MountVolumeRequest;
using UserlandFSUtil::MountVolumeReply;
using UserlandFSUtil::UnmountVolumeRequest;
using UserlandFSUtil::UnmountVolumeReply;
//using UserlandFSUtil::InitializeVolumeRequest;
//using UserlandFSUtil::InitializeVolumeReply;
using UserlandFSUtil::SyncVolumeRequest;
using UserlandFSUtil::SyncVolumeReply;
using UserlandFSUtil::ReadFSInfoRequest;
using UserlandFSUtil::ReadFSInfoReply;
using UserlandFSUtil::WriteFSInfoRequest;
using UserlandFSUtil::WriteFSInfoReply;
// vnodes
using UserlandFSUtil::LookupRequest;
using UserlandFSUtil::LookupReply;
using UserlandFSUtil::GetVNodeNameRequest;
using UserlandFSUtil::GetVNodeNameReply;
using UserlandFSUtil::ReadVNodeRequest;
using UserlandFSUtil::ReadVNodeReply;
using UserlandFSUtil::WriteVNodeRequest;
using UserlandFSUtil::WriteVNodeReply;
using UserlandFSUtil::FSRemoveVNodeRequest;
using UserlandFSUtil::FSRemoveVNodeReply;
// asynchronous I/O
using UserlandFSUtil::DoIORequest;
using UserlandFSUtil::DoIOReply;
using UserlandFSUtil::CancelIORequest;
using UserlandFSUtil::CancelIOReply;
using UserlandFSUtil::IterativeIOGetVecsRequest;
using UserlandFSUtil::IterativeIOGetVecsReply;
using UserlandFSUtil::IterativeIOFinishedRequest;
using UserlandFSUtil::IterativeIOFinishedReply;
// nodes
using UserlandFSUtil::IOCtlRequest;
using UserlandFSUtil::IOCtlReply;
using UserlandFSUtil::SetFlagsRequest;
using UserlandFSUtil::SetFlagsReply;
using UserlandFSUtil::SelectRequest;
using UserlandFSUtil::SelectReply;
using UserlandFSUtil::DeselectRequest;
using UserlandFSUtil::DeselectReply;
using UserlandFSUtil::FSyncRequest;
using UserlandFSUtil::FSyncReply;
using UserlandFSUtil::ReadSymlinkRequest;
using UserlandFSUtil::ReadSymlinkReply;
using UserlandFSUtil::CreateSymlinkRequest;
using UserlandFSUtil::CreateSymlinkReply;
using UserlandFSUtil::LinkRequest;
using UserlandFSUtil::LinkReply;
using UserlandFSUtil::UnlinkRequest;
using UserlandFSUtil::UnlinkReply;
using UserlandFSUtil::RenameRequest;
using UserlandFSUtil::RenameReply;
using UserlandFSUtil::AccessRequest;
using UserlandFSUtil::AccessReply;
using UserlandFSUtil::ReadStatRequest;
using UserlandFSUtil::ReadStatReply;
using UserlandFSUtil::WriteStatRequest;
using UserlandFSUtil::WriteStatReply;
// files
using UserlandFSUtil::CreateRequest;
using UserlandFSUtil::CreateReply;
using UserlandFSUtil::OpenRequest;
using UserlandFSUtil::OpenReply;
using UserlandFSUtil::CloseRequest;
using UserlandFSUtil::CloseReply;
using UserlandFSUtil::FreeCookieRequest;
using UserlandFSUtil::FreeCookieReply;
using UserlandFSUtil::ReadRequest;
using UserlandFSUtil::ReadReply;
using UserlandFSUtil::WriteRequest;
using UserlandFSUtil::WriteReply;
// directories
using UserlandFSUtil::CreateDirRequest;
using UserlandFSUtil::CreateDirReply;
using UserlandFSUtil::RemoveDirRequest;
using UserlandFSUtil::RemoveDirReply;
using UserlandFSUtil::OpenDirRequest;
using UserlandFSUtil::OpenDirReply;
using UserlandFSUtil::CloseDirRequest;
using UserlandFSUtil::CloseDirReply;
using UserlandFSUtil::FreeDirCookieRequest;
using UserlandFSUtil::FreeDirCookieReply;
using UserlandFSUtil::ReadDirRequest;
using UserlandFSUtil::ReadDirReply;
using UserlandFSUtil::RewindDirRequest;
using UserlandFSUtil::RewindDirReply;
// attribute directories
using UserlandFSUtil::OpenAttrDirRequest;
using UserlandFSUtil::OpenAttrDirReply;
using UserlandFSUtil::CloseAttrDirRequest;
using UserlandFSUtil::CloseAttrDirReply;
using UserlandFSUtil::FreeAttrDirCookieRequest;
using UserlandFSUtil::FreeAttrDirCookieReply;
using UserlandFSUtil::ReadAttrDirRequest;
using UserlandFSUtil::ReadAttrDirReply;
using UserlandFSUtil::RewindAttrDirRequest;
using UserlandFSUtil::RewindAttrDirReply;
// attributes
using UserlandFSUtil::CreateAttrRequest;
using UserlandFSUtil::CreateAttrReply;
using UserlandFSUtil::OpenAttrRequest;
using UserlandFSUtil::OpenAttrReply;
using UserlandFSUtil::CloseAttrRequest;
using UserlandFSUtil::CloseAttrReply;
using UserlandFSUtil::FreeAttrCookieRequest;
using UserlandFSUtil::FreeAttrCookieReply;
using UserlandFSUtil::ReadAttrRequest;
using UserlandFSUtil::ReadAttrReply;
using UserlandFSUtil::WriteAttrRequest;
using UserlandFSUtil::WriteAttrReply;
using UserlandFSUtil::ReadAttrStatRequest;
using UserlandFSUtil::ReadAttrStatReply;
using UserlandFSUtil::WriteAttrStatRequest;
using UserlandFSUtil::WriteAttrStatReply;
using UserlandFSUtil::RenameAttrRequest;
using UserlandFSUtil::RenameAttrReply;
using UserlandFSUtil::RemoveAttrRequest;
using UserlandFSUtil::RemoveAttrReply;
// indices
using UserlandFSUtil::OpenIndexDirRequest;
using UserlandFSUtil::OpenIndexDirReply;
using UserlandFSUtil::CloseIndexDirRequest;
using UserlandFSUtil::CloseIndexDirReply;
using UserlandFSUtil::FreeIndexDirCookieRequest;
using UserlandFSUtil::FreeIndexDirCookieReply;
using UserlandFSUtil::ReadIndexDirRequest;
using UserlandFSUtil::ReadIndexDirReply;
using UserlandFSUtil::RewindIndexDirRequest;
using UserlandFSUtil::RewindIndexDirReply;
using UserlandFSUtil::CreateIndexRequest;
using UserlandFSUtil::CreateIndexReply;
using UserlandFSUtil::RemoveIndexRequest;
using UserlandFSUtil::RemoveIndexReply;
using UserlandFSUtil::ReadIndexStatRequest;
using UserlandFSUtil::ReadIndexStatReply;
// queries
using UserlandFSUtil::OpenQueryRequest;
using UserlandFSUtil::OpenQueryReply;
using UserlandFSUtil::CloseQueryRequest;
using UserlandFSUtil::CloseQueryReply;
using UserlandFSUtil::FreeQueryCookieRequest;
using UserlandFSUtil::FreeQueryCookieReply;
using UserlandFSUtil::ReadQueryRequest;
using UserlandFSUtil::ReadQueryReply;
using UserlandFSUtil::RewindQueryRequest;
using UserlandFSUtil::RewindQueryReply;
// node monitoring
using UserlandFSUtil::NodeMonitoringEventRequest;
using UserlandFSUtil::NodeMonitoringEventReply;

// userland -> kernel requests
// notifications
using UserlandFSUtil::NotifyListenerRequest;
using UserlandFSUtil::NotifyListenerReply;
using UserlandFSUtil::NotifySelectEventRequest;
using UserlandFSUtil::NotifySelectEventReply;
using UserlandFSUtil::NotifyQueryRequest;
using UserlandFSUtil::NotifyQueryReply;
// vnodes
using UserlandFSUtil::GetVNodeRequest;
using UserlandFSUtil::GetVNodeReply;
using UserlandFSUtil::PutVNodeRequest;
using UserlandFSUtil::PutVNodeReply;
using UserlandFSUtil::AcquireVNodeRequest;
using UserlandFSUtil::AcquireVNodeReply;
using UserlandFSUtil::NewVNodeRequest;
using UserlandFSUtil::NewVNodeReply;
using UserlandFSUtil::PublishVNodeRequest;
using UserlandFSUtil::PublishVNodeReply;
using UserlandFSUtil::RemoveVNodeRequest;
using UserlandFSUtil::RemoveVNodeReply;
using UserlandFSUtil::UnremoveVNodeRequest;
using UserlandFSUtil::UnremoveVNodeReply;
using UserlandFSUtil::GetVNodeRemovedRequest;
using UserlandFSUtil::GetVNodeRemovedReply;
// file cache
using UserlandFSUtil::FileCacheCreateRequest;
using UserlandFSUtil::FileCacheCreateReply;
using UserlandFSUtil::FileCacheDeleteRequest;
using UserlandFSUtil::FileCacheDeleteReply;
using UserlandFSUtil::FileCacheSetEnabledRequest;
using UserlandFSUtil::FileCacheSetEnabledReply;
using UserlandFSUtil::FileCacheSetSizeRequest;
using UserlandFSUtil::FileCacheSetSizeReply;
using UserlandFSUtil::FileCacheSyncRequest;
using UserlandFSUtil::FileCacheSyncReply;
using UserlandFSUtil::FileCacheReadRequest;
using UserlandFSUtil::FileCacheReadReply;
using UserlandFSUtil::FileCacheWriteRequest;
using UserlandFSUtil::FileCacheWriteReply;
// I/O
using UserlandFSUtil::DoIterativeFDIORequest;
using UserlandFSUtil::DoIterativeFDIOReply;
using UserlandFSUtil::ReadFromIORequestRequest;
using UserlandFSUtil::ReadFromIORequestReply;
using UserlandFSUtil::WriteToIORequestRequest;
using UserlandFSUtil::WriteToIORequestReply;
using UserlandFSUtil::NotifyIORequestRequest;
using UserlandFSUtil::NotifyIORequestReply;
                // node monitoring
using UserlandFSUtil::AddNodeListenerRequest;
using UserlandFSUtil::AddNodeListenerReply;
using UserlandFSUtil::RemoveNodeListenerRequest;
using UserlandFSUtil::RemoveNodeListenerReply;
// general reply
using UserlandFSUtil::ReceiptAckReply;

using UserlandFSUtil::do_for_request;
using UserlandFSUtil::get_request_address_infos;
using UserlandFSUtil::check_request;
using UserlandFSUtil::relocate_request;

#endif  // USERLAND_FS_REQUESTS_H