⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xbfs.h

📁 课程设计
💻 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 + -