⛏️ index : haiku.git

/*
 * Copyright 2007-2009, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef USERLAND_FS_HAIKU_KERNEL_VOLUME_H
#define USERLAND_FS_HAIKU_KERNEL_VOLUME_H

#include <fs_interface.h>

#include "../Volume.h"

namespace UserlandFS {

class HaikuKernelFileSystem;
class HaikuKernelNode;


class HaikuKernelVolume : public Volume {
public:
								HaikuKernelVolume(FileSystem* fileSystem,
									dev_t id,
									file_system_module_info* fsModule);
	virtual						~HaikuKernelVolume();

	static	HaikuKernelVolume*	GetVolume(const fs_volume* volume);

	inline	fs_volume*			GetFSVolume()	{ return &fVolume; }

			status_t			Init();

			status_t			NewVNode(ino_t vnodeID, void* privateNode,
									fs_vnode_ops* ops, HaikuKernelNode** node);
			status_t			PublishVNode(ino_t vnodeID, void* privateNode,
									fs_vnode_ops* ops, int type, uint32 flags,
									HaikuKernelNode** node);
			void				UndoNewVNode(HaikuKernelNode* node);
			void				UndoPublishVNode(HaikuKernelNode* node);

			HaikuKernelNode*	NodeWithID(ino_t vnodeID) const;

	// FS
	virtual	status_t			Mount(const char* device, uint32 flags,
									const char* parameters, ino_t* rootID);
	virtual	status_t			Unmount();
	virtual	status_t			Sync();
	virtual	status_t			ReadFSInfo(fs_info* info);
	virtual	status_t			WriteFSInfo(const struct fs_info* info,
									uint32 mask);

	// file cache
	virtual	status_t			GetFileMap(void* node, off_t offset,
									size_t size, struct file_io_vec* vecs,
									size_t* count);

	// vnodes
	virtual	status_t			Lookup(void* dir, const char* entryName,
									ino_t* vnid);
	virtual	status_t			GetVNodeName(void* node, char* buffer,
									size_t bufferSize);
	virtual	status_t			ReadVNode(ino_t vnid, bool reenter,
									void** node, int* type, uint32* flags,
									FSVNodeCapabilities* _capabilities);
	virtual	status_t			WriteVNode(void* node, bool reenter);
	virtual	status_t			RemoveVNode(void* node, bool reenter);

	// asynchronous I/O
	virtual	status_t			DoIO(void* node, void* cookie,
									const IORequestInfo& requestInfo);
	virtual	status_t			CancelIO(void* node, void* cookie,
									int32 ioRequestID);
	virtual	status_t			IterativeIOGetVecs(void* cookie,
									int32 requestID, off_t offset, size_t size,
									struct file_io_vec* vecs, size_t* _count);
	virtual	status_t			IterativeIOFinished(void* cookie,
									int32 requestID, status_t status,
									bool partialTransfer,
									size_t bytesTransferred);

	// nodes
	virtual	status_t			IOCtl(void* node, void* cookie,
									uint32 command, void* buffer, size_t size);
	virtual	status_t			SetFlags(void* node, void* cookie,
									int flags);
	virtual	status_t			Select(void* node, void* cookie,
									uint8 event, selectsync* sync);
	virtual	status_t			Deselect(void* node, void* cookie,
									uint8 event, selectsync* sync);

	virtual	status_t			FSync(void* node);

	virtual	status_t			ReadSymlink(void* node, char* buffer,
									size_t bufferSize, size_t* bytesRead);
	virtual	status_t			CreateSymlink(void* dir, const char* name,
									const char* target, int mode);

	virtual	status_t			Link(void* dir, const char* name,
									void* node);
	virtual	status_t			Unlink(void* dir, const char* name);
	virtual	status_t			Rename(void* oldDir, const char* oldName,
									void* newDir, const char* newName);

	virtual	status_t			Access(void* node, int mode);
	virtual	status_t			ReadStat(void* node, struct stat* st);
	virtual	status_t			WriteStat(void* node, const struct stat *st,
									uint32 mask);

	// files
	virtual	status_t			Create(void* dir, const char* name,
									int openMode, int mode, void** cookie,
									ino_t* vnid);
	virtual	status_t			Open(void* node, int openMode,
									void** cookie);
	virtual	status_t			Close(void* node, void* cookie);
	virtual	status_t			FreeCookie(void* node, void* cookie);
	virtual	status_t			Read(void* node, void* cookie, off_t pos,
									void* buffer, size_t bufferSize,
									size_t* bytesRead);
	virtual	status_t			Write(void* node, void* cookie,
									off_t pos, const void* buffer,
									size_t bufferSize, size_t* bytesWritten);

	// directories
	virtual	status_t			CreateDir(void* dir, const char* name,
									int mode);
	virtual	status_t			RemoveDir(void* dir, const char* name);
	virtual	status_t			OpenDir(void* node, void** cookie);
	virtual	status_t			CloseDir(void* node, void* cookie);
	virtual	status_t			FreeDirCookie(void* node, void* cookie);
	virtual	status_t			ReadDir(void* node, void* cookie,
									void* buffer, size_t bufferSize,
									uint32 count, uint32* countRead);
	virtual	status_t			RewindDir(void* node, void* cookie);

	// attribute directories
	virtual	status_t			OpenAttrDir(void* node, void** cookie);
	virtual	status_t			CloseAttrDir(void* node, void* cookie);
	virtual	status_t			FreeAttrDirCookie(void* node,
									void* cookie);
	virtual	status_t			ReadAttrDir(void* node, void* cookie,
									void* buffer, size_t bufferSize,
									uint32 count, uint32* countRead);
	virtual	status_t			RewindAttrDir(void* node, void* cookie);

	// attributes
	virtual	status_t			CreateAttr(void* node, const char *name,
									uint32 type, int openMode,
									void** cookie);
	virtual	status_t			OpenAttr(void* node, const char *name,
									int openMode, void** cookie);
	virtual	status_t			CloseAttr(void* node, void* cookie);
	virtual	status_t			FreeAttrCookie(void* node, void* cookie);
	virtual	status_t			ReadAttr(void* node, void* cookie,
									off_t pos, void* buffer, size_t bufferSize,
									size_t* bytesRead);
	virtual	status_t			WriteAttr(void* node, void* cookie,
									off_t pos, const void* buffer,
									size_t bufferSize, size_t* bytesWritten);
	virtual	status_t			ReadAttrStat(void* node, void* cookie,
									struct stat *st);
	virtual	status_t			WriteAttrStat(void* node, void* cookie,
									const struct stat* st, int statMask);
	virtual	status_t			RenameAttr(void* oldNode,
									const char* oldName, void* newNode,
									const char* newName);
	virtual	status_t			RemoveAttr(void* node, const char* name);

	// indices
	virtual	status_t			OpenIndexDir(void** cookie);
	virtual	status_t			CloseIndexDir(void* cookie);
	virtual	status_t			FreeIndexDirCookie(void* cookie);
	virtual	status_t			ReadIndexDir(void* cookie, void* buffer,
									size_t bufferSize, uint32 count,
									uint32* countRead);
	virtual	status_t			RewindIndexDir(void* cookie);
	virtual	status_t			CreateIndex(const char* name, uint32 type,
									uint32 flags);
	virtual	status_t			RemoveIndex(const char* name);
	virtual	status_t			ReadIndexStat(const char *name,
									struct stat *st);

	// queries
	virtual	status_t			OpenQuery(const char* queryString,
									uint32 flags, port_id port, uint32 token,
									void** cookie);
	virtual	status_t			CloseQuery(void* cookie);
	virtual	status_t			FreeQueryCookie(void* cookie);
	virtual	status_t			ReadQuery(void* cookie, void* buffer,
									size_t bufferSize, uint32 count,
									uint32* countRead);
	virtual	status_t			RewindQuery(void* cookie);

private:
	struct FSVolume : fs_volume {
		HaikuKernelVolume*	haikuVolume;
	};

	class NodeMap;

private:
			void				_InitCapabilities();
	inline	HaikuKernelFileSystem* _FileSystem() const;

private:
			file_system_module_info* fFSModule;
			FSVolume			fVolume;
			NodeMap*			fNodes;
};


/*static*/ inline HaikuKernelVolume*
HaikuKernelVolume::GetVolume(const fs_volume* volume)
{
	return static_cast<const FSVolume*>(volume)->haikuVolume;
}


}	// namespace UserlandFS

using UserlandFS::HaikuKernelVolume;

#endif	// USERLAND_FS_HAIKU_KERNEL_VOLUME_H