nuclear@88: #ifndef FS_H_ nuclear@88: #define FS_H_ nuclear@88: nuclear@90: #include nuclear@90: nuclear@96: #define MAGIC 0xccf5ccf5 nuclear@96: #define FS_VER 1 nuclear@96: #define BLKSZ 1024 nuclear@96: nuclear@96: #define NAME_MAX 27 /* +1 termin. +4 ino = 32 per dirent */ nuclear@96: #define PATH_MAX 256 nuclear@90: nuclear@90: #define SECT_TO_BLK(x) ((x) / (BLKSZ / 512)) nuclear@90: nuclear@91: #define DEVNO(maj, min) ((((maj) & 0xff) << 8) | ((min) & 0xff)) nuclear@90: #define DEV_MAJOR(dev) (((dev) >> 8) & 0xff) nuclear@90: #define DEV_MINOR(dev) ((dev) & 0xff) nuclear@90: nuclear@90: nuclear@90: typedef uint32_t dev_t; nuclear@90: typedef uint32_t blkid; nuclear@90: nuclear@94: nuclear@94: /* 20 direct blocks + 10 attributes + 2 indirect = 128 bytes per inode */ nuclear@94: #define NDIRBLK 20 nuclear@94: struct inode { nuclear@94: int ino; nuclear@94: int uid, gid, mode; nuclear@94: int nlink; nuclear@94: dev_t dev; nuclear@94: uint32_t atime, ctime, mtime; nuclear@94: uint32_t size; nuclear@94: blkid blk[NDIRBLK]; /* direct blocks */ nuclear@94: blkid ind; /* indirect */ nuclear@94: blkid dind; /* double-indirect */ nuclear@94: } __attribute__((packed)); nuclear@94: nuclear@96: struct dir_entry { nuclear@96: int ino; nuclear@96: char name[NAME_MAX + 1]; nuclear@96: } __attribute__((packed)); nuclear@94: nuclear@90: struct superblock { nuclear@90: uint32_t magic; /* magic number */ nuclear@90: int ver; /* filesystem version */ nuclear@90: int blksize; /* only BLKSZ supported at the moment */ nuclear@90: nuclear@90: /* total number of blocks */ nuclear@90: unsigned int num_blocks; nuclear@95: /* total number of inodes */ nuclear@95: unsigned int num_inodes; nuclear@95: nuclear@90: /* inode allocation bitmap start and count */ nuclear@90: blkid ibm_start; nuclear@90: unsigned int ibm_count; nuclear@90: /* inode table start and count */ nuclear@90: blkid itbl_start; nuclear@90: unsigned int itbl_count; nuclear@93: /* block allocation bitmap start and count */ nuclear@93: blkid bm_start; nuclear@93: unsigned int bm_count; nuclear@90: nuclear@94: int root_ino; /* root direcotry inode number */ nuclear@90: nuclear@90: /* the following are valid only at runtime, ignored on disk */ nuclear@93: uint32_t *ibm; /* in-memory inode bitmap */ nuclear@93: uint32_t *bm; /* in-memory block bitmap */ nuclear@94: struct inode *root; /* in-memory root inode */ nuclear@90: nuclear@90: } __attribute__((packed)); nuclear@90: nuclear@90: nuclear@90: nuclear@93: struct filesys { nuclear@93: struct block_device *bdev; nuclear@93: nuclear@93: struct superblock *sb; nuclear@93: nuclear@93: struct filesys *next; nuclear@93: }; nuclear@93: nuclear@93: /* defined in fs.c */ nuclear@93: int openfs(struct filesys *fs, dev_t dev); nuclear@96: int mkfs(struct filesys *fs, dev_t dev); nuclear@94: void closefs(struct filesys *fs); nuclear@93: int find_inode(const char *path); nuclear@93: nuclear@93: /* defined in fs_sys.c */ nuclear@90: int sys_mount(char *mntpt, char *devname, unsigned int flags); nuclear@90: int sys_umount(char *devname); nuclear@90: nuclear@90: int sys_open(char *pathname, int flags, unsigned int mode); nuclear@90: int sys_close(int fd); nuclear@90: nuclear@90: int sys_read(int fd, void *buf, int sz); nuclear@90: int sys_write(int fd, void *buf, int sz); nuclear@90: long sys_lseek(int fd, long offs, int from); nuclear@90: nuclear@89: nuclear@88: #endif /* FS_H_ */