root/src/add-ons/kernel/file_systems/btrfs/Volume.h
/*
 * Copyright 2017, Chế Vũ Gia Hy, cvghy116@gmail.com.
 * Copyright 2011, Jérôme Duval, korli@users.berlios.de.
 * Copyright 2008-2010, Axel Dörfler, axeld@pinc-software.de.
 * This file may be used under the terms of the MIT License.
 */
#ifndef VOLUME_H
#define VOLUME_H


#include "btrfs.h"


enum volume_flags {
        VOLUME_READ_ONLY        = 0x0001
};

class BTree;
class Chunk;
class Inode;
class Journal;
class Transaction;
class ExtentAllocator;


class Volume {
public:
                                                                Volume(fs_volume* volume);
                                                                ~Volume();

                        status_t                        Mount(const char* device, uint32 flags);
                        status_t                        Unmount();
                        status_t                        Initialize(int fd, const char* label,
                                                                        uint32 blockSize, uint32 sectorSize);

                        bool                            IsValidSuperBlock();
                        bool                            IsReadOnly() const
                                                                        { return (fFlags & VOLUME_READ_ONLY) != 0; }

                        Inode*                          RootNode() const { return fRootNode; }
                        int                                     Device() const { return fDevice; }

                        dev_t                           ID() const
                                                                        { return fFSVolume ? fFSVolume->id : -1; }
                        fs_volume*                      FSVolume() const { return fFSVolume; }
                        const char*                     Name() const;
                        BTree*                          FSTree() const { return fFSTree; }
                        BTree*                          ExtentTree() const { return fExtentTree; }
                        BTree*                          RootTree() const { return fRootTree; }

                        uint32                          SectorSize() const { return fSectorSize; }
                        uint32                          MaxInlineSize() const
                                                                        { return fSectorSize / 2; }
                        uint32                          BlockSize() const { return fBlockSize; }
                        ino_t                           GetNextInodeID() { return ++fLargestInodeID; }
                        Chunk*                          SystemChunk() const { return fChunk; }
                        Journal*                        GetJournal() const { return fJournal; }
                        ExtentAllocator*        GetAllocator() const { return fExtentAllocator; }

                        btrfs_super_block&      SuperBlock() { return fSuperBlock; }

                        mutex&                          GetLock() { return fLock; }

                        status_t                        LoadSuperBlock();
                        status_t                        WriteSuperBlock();

                        // cache access
                        void*                           BlockCache() { return fBlockCache; }

        static  status_t                        Identify(int fd, btrfs_super_block* superBlock);

                        status_t                        FindBlock(off_t logical, fsblock_t& physical);
                        status_t                        FindBlock(off_t logical, off_t& physical);
                        status_t                        GetNewBlock(uint64& logical, fsblock_t& physical,
                                                                        uint64 start = (uint64)-1,
                                                                        uint64 flags = BTRFS_BLOCKGROUP_FLAG_METADATA);

private:
                        mutex                           fLock;
                        fs_volume*                      fFSVolume;
                        int                                     fDevice;
                        ino_t                           fLargestInodeID;
                        btrfs_super_block       fSuperBlock;
                        char                            fName[32];

                        uint32                          fFlags;
                        uint32                          fSectorSize;
                        uint32                          fBlockSize;

                        void*                           fBlockCache;
                        Inode*                          fRootNode;

                        ExtentAllocator*        fExtentAllocator;
                        Chunk*                          fChunk;
                        Journal*                        fJournal;
                        BTree*                          fChunkTree;
                        BTree*                          fRootTree;
                        BTree*                          fDevTree;
                        BTree*                          fExtentTree;
                        BTree*                          fFSTree;
                        BTree*                          fChecksumTree;
};


#endif  // VOLUME_H