Newer
Older
ubixos / src / sys / ubixfsv2 / ubixfs.h
@flameshadow flameshadow on 14 Sep 2004 4 KB sync
#ifndef UBIXFS_H
#define UBIXFS_H

#include <sys/types.h>
#include <unistd.h>
#include "fsAbstract.h"
#include "types.h"

#define INODE_IN_USE      0x00000001
#define INODE_DIRECTORY   0x00000002
#define ATTR_INODE        0x00000004
#define INODE_LOGGED      0x00000008
#define INODE_DELETED     0x00000010
#define PERMANENT_FLAGS   0x0000ffff
#define INODE_NO_CACHE    0x00010000
#define INODE_WAS_WRITTEN 0x00020000
#define NO_TRANSACTION    0x00040000

#define NUM_DIRECT_BLOCKS 64
#define MAX_FILENAME_LENGTH 256

#define UBIXFS_MAGIC1 0xA0A0A0A
#define UBIXFS_MAGIC2 0xB0B0B0B
#define UBIXFS_MAGIC3 0xC0C0C0C

/* befs magic numbers
#define SUPER_BLOCK_MAGIC1 0x42465331 // BFS1
#define SUPER_BLOCK_MAGIC2 0xdd121031
#define SUPER_BLOCK_MAGIC3 0x15b6830e
#define INODE_MAGIC 0x3bbe0ad9
 */
#define UBIXFS_CLEAN 0x434C454E  // CLEN
#define UBIXFS_DIRTY 0x44495254  // DIRT


typedef struct blockRun {
  int            allocationGroup  __attribute__ ((packed));
  unsigned short start            __attribute__ ((packed));
  unsigned short len              __attribute__ ((packed));
} inodeAddr;

struct bNode;
struct ubixfsInode;
class bTree;

typedef union uPtr {
  inodeAddr iAddr;
  bNode * bPtr;
  bTree * btPtr;
  ubixfsInode * iPtr;
  void * vPtr;
  off_t offset;
};

typedef struct diskSuperBlock {
  char      name[32]      __attribute__ ((packed));
  int32     magic1        __attribute__ ((packed));
  int32     fsByteOrder   __attribute__ ((packed));

// blockSize on disk (4096 for UbixFS v2)
  int32     blockSize     __attribute__ ((packed));

// number of bits needed to shift a block number to get a byte address
  int32     blockShift    __attribute__ ((packed));

  off_t     numBlocks     __attribute__ ((packed));
  off_t     usedBlocks    __attribute__ ((packed));

// BlockAllocationTable
  uInt32    batSectors    __attribute__ ((packed));

  uInt32    inodeCount    __attribute__ ((packed));
  int32     inodeSize     __attribute__ ((packed));
  int32     magic2        __attribute__ ((packed));
  int32     blocksPerAG   __attribute__ ((packed));
  int32     AGShift       __attribute__ ((packed));
  int32     numAGs        __attribute__ ((packed));
  int32     lastUsedAG    __attribute__ ((packed));
// flags tells whether the FS is clean (0x434C454E) or dirty (0x44495954)
  int32     flags         __attribute__ ((packed));

// journal information
  blockRun  logBlocks     __attribute__ ((packed));
  off_t     logStart      __attribute__ ((packed));
  off_t     logEnd        __attribute__ ((packed));

  int32     magic3        __attribute__ ((packed));

// root dir of the SYS container
  inodeAddr rootDir       __attribute__ ((packed));

// indicies
  inodeAddr indicies      __attribute__ ((packed));

  char      pad[368]      __attribute__ ((packed));

} diskSuperBlock;

typedef struct dataStream {
  struct blockRun direct[NUM_DIRECT_BLOCKS] __attribute__ ((packed));
  off_t           maxDirectRange            __attribute__ ((packed));
  struct blockRun indirect                  __attribute__ ((packed));
  off_t           maxIndirectRange          __attribute__ ((packed));
  struct blockRun double_indirect           __attribute__ ((packed));
  off_t           maxDoubleIndirectRange    __attribute__ ((packed));
  off_t           size                      __attribute__ ((packed));
} dataStream;

typedef struct ubixfsInode {
  int32       magic1        __attribute__ ((packed));
  inodeAddr   inodeNum      __attribute__ ((packed));
  char        name[MAX_FILENAME_LENGTH]  __attribute__ ((packed));
  uid_t       uid           __attribute__ ((packed));
  gid_t       gid           __attribute__ ((packed));
  int32       mode          __attribute__ ((packed));
  int32       flags         __attribute__ ((packed));
 // uInt64      createTime    __attribute_ ((packed));
 // uInt64      lastModifiedTime __attribute__ (packed));
//  inodeAddr   attributes    __attribute__ ((packed));
  uInt32      type          __attribute__ ((packed));
  int32       inodeSize     __attribute__ ((packed));
  uPtr        parent      __attribute__ ((packed));
  uPtr        next        __attribute__ ((packed));
  uPtr        prev        __attribute__ ((packed));
  uPtr        data        __attribute__ ((packed));
  dataStream  blocks          __attribute__ ((packed));
  char       smallData[3212]  __attribute__ ((packed));
} ubixfsInode;

class UbixFS : public vfs_abstract {
 protected:
  signed char *    freeBlockList;
  diskSuperBlock * superBlock;
  blockRun         getFreeBlock(uInt32);
  blockRun         getFreeBlock(void);
  blockRun         get8FreeBlocks(uInt32);
  void *           mknod(const char *, ubixfsInode *);
  uInt32           getNextAG(void);
  void             printSuperBlock(void);
 public:
                   UbixFS(void);
                   UbixFS(device_t *);
  virtual int      vfs_init(void);
  virtual int      vfs_format(device_t *);
  virtual void *   vfs_mknod(const char *, mode_t);
  virtual         ~UbixFS(void); 
}; // UbixFS

#endif // !UBIXFS_H