root/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelFileSystem.h
/*
 * Copyright 2007-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef USERLAND_FS_HAIKU_KERNEL_FILE_SYSTEM_H
#define USERLAND_FS_HAIKU_KERNEL_FILE_SYSTEM_H

#include "Locker.h"

#include "HaikuKernelNode.h"

#include "../FileSystem.h"


struct file_system_module_info;


namespace UserlandFS {

struct HaikuKernelIORequest;

class HaikuKernelFileSystem : public FileSystem {
public:
                                                                HaikuKernelFileSystem(const char* fsName,
                                                                        file_system_module_info* fsModule);
        virtual                                         ~HaikuKernelFileSystem();

                        status_t                        Init();

        virtual status_t                        CreateVolume(Volume** volume, dev_t id);
        virtual status_t                        DeleteVolume(Volume* volume);

                        status_t                        AddIORequest(HaikuKernelIORequest* request);
                        HaikuKernelIORequest* GetIORequest(int32 requestID);
                        void                            PutIORequest(HaikuKernelIORequest* request,
                                                                        int32 refCount = 1);

                        HaikuKernelNode::Capabilities* GetNodeCapabilities(
                                                                        fs_vnode_ops* ops);
                        void                            PutNodeCapabilities(
                                                                        HaikuKernelNode::Capabilities*
                                                                                capabilities);

private:
        struct IORequestHashDefinition;
        struct IORequestTable;
        struct NodeCapabilitiesHashDefinition;
        struct NodeCapabilitiesTable;

private:
                        void                            _InitCapabilities();
        static  void                            _InitNodeCapabilities(fs_vnode_ops* ops,
                                                                        FSVNodeCapabilities& capabilities);

private:
                        file_system_module_info* fFSModule;
                        IORequestTable*         fIORequests;
                        NodeCapabilitiesTable* fNodeCapabilities;
                        Locker                          fLock;
};

}       // namespace UserlandFS

using UserlandFS::HaikuKernelFileSystem;

#endif  // USERLAND_FS_HAIKU_KERNEL_FILE_SYSTEM_H