📄 xbfs.h
字号:
#pragma once
#ifdef _MKFS_
#define __u32 unsigned long
#define u32 unsigned long
#define __u8 unsigned short
#else
#include <linux/fs.h>
#include <linux/stddef.h>
#endif
#define XBFS_DEBUG
#define BLK_SIZE_BITS 12
#define BLK_SIZE (1 << BLK_SIZE_BITS)
#define BLK_PER_BMP (BLK_SIZE << 3)
#define BLK_PER_BMP_BITS (BLK_SIZE_BITS + 3)
struct xbfs_sb_disk {
__u32 magic;
#define XBFS_MAGIC 0x16531653
__u32 bmp_start;
__u32 bmp_count;
__u32 data_start;
__u32 data_count;
__u32 root_inode;
} __attribute__ ((packed));
struct xbfs_sb_mem {
struct buffer_head *bh_sb;
struct xbfs_sb_disk *sb;
struct buffer_head **bh_bmp;
};
#define XBFS_SM(x) ((struct xbfs_sb_mem *)(x)->s_fs_info)
struct xbfs_dirent {
char name[28];
__u32 block;
} __attribute__ ((packed));
struct xbfs_inode_disk {
__u32 size;
__u32 mode;
union {
__u32 blk_list[0];
struct xbfs_dirent dirent[0];
};
} __attribute__ ((packed));
#define for_each_dirent(id, ent, code) \
for (ent = id->dirent; (char *)ent < (char *)id + BLK_SIZE; ent++) { \
if (ent->name[0] == 0x00) \
break; \
if (ent->name[0] == 0x01) \
continue; \
code; \
}
static inline struct xbfs_dirent *find_empty_dirent(struct xbfs_inode_disk *id)
{
struct xbfs_dirent *ent;
for (ent = id->dirent;
(char *)ent < (char *)id + BLK_SIZE - sizeof(struct xbfs_dirent);
ent++)
if (ent->name[0] == 0x00 || ent->name[0] == 0x01)
return ent;
return NULL;
}
static inline void set_dirent_empty(struct xbfs_dirent *ent)
{
ent->name[0] = 0x00;
}
static inline void set_dirent_tombstone(struct xbfs_dirent *ent)
{
ent->name[0] = 0x01;
}
#ifdef XBFS_DEBUG
#define DPRINT(fmt, args...) printk(KERN_ERR "%s: " fmt, __FUNCTION__, ##args)
#else
#define DPRINT(fmt, args...) do { } while (0)
#endif
#define COPYRIGHT "xbfs --author: xb. scut software 06 class 2. 117270865@qq.com\n"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -