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

📄 inode.c

📁 课程设计
💻 C
字号:
#include <linux/fs.h>
#include <linux/buffer_head.h>

#include "xbfs.h"

void bmp_free_block(struct super_block *sb, u32 block);

extern struct file_operations xbfs_dir_operations;
extern struct inode_operations xbfs_dir_inode_operations;

extern struct file_operations xbfs_file_operations;
extern struct inode_operations xbfs_file_inode_operations;
extern struct address_space_operations xbfs_aops;

void xbfs_set_inode(struct inode *inode)
{
	if (S_ISREG(inode->i_mode)) {
		inode->i_op = &xbfs_file_inode_operations;
		inode->i_fop = &xbfs_file_operations;
		inode->i_mapping->a_ops = &xbfs_aops;
	} else if (S_ISDIR(inode->i_mode)) {
		inode->i_op = &xbfs_dir_inode_operations;
		inode->i_fop = &xbfs_dir_operations;
	} else
		DPRINT("inode %ld is fucked. file mode invalid\n", inode->i_ino);
}

static void xbfs_read_inode(struct inode *inode)
{
	struct buffer_head *bh;
	struct xbfs_inode_disk *id;

	DPRINT("enter\n");

	bh = sb_bread(inode->i_sb, inode->i_ino);
	if (!bh) {
		DPRINT("sb_bread inode %ld error\n", inode->i_ino);
		make_bad_inode(inode);
		return;
	}
	id = (typeof(id))bh->b_data;
	
	inode->i_mode = id->mode | S_IRWXUGO;
	inode->i_size = id->size;
	inode->i_blocks = 0;
	
	xbfs_set_inode(inode);
	brelse(bh);
}

static int xbfs_write_inode(struct inode * inode, int sync)
{
	struct buffer_head *bh;
	struct xbfs_inode_disk *id;

	DPRINT("enter\n");

	bh = sb_bread(inode->i_sb, inode->i_ino);
	if (!bh) {
		DPRINT("sb_bread inode %ld error\n", inode->i_ino);
		return -EINVAL;
	}

	id = (typeof(id))bh->b_data;
	id->mode = inode->i_mode;
	id->size = inode->i_size;
	
	mark_buffer_dirty(bh);
	brelse(bh);
	return 0;
}

static void xbfs_put_super(struct super_block *sb)
{
	int i;
	struct xbfs_sb_mem *sm = XBFS_SM(sb);

	DPRINT("enter\n");

	for (i = 0; i < sm->sb->bmp_count; i++)
		if (sm->bh_bmp[i])
			brelse(sm->bh_bmp[i]);
	kfree(sm->bh_bmp);
	kfree(sm);
	sb->s_fs_info = NULL;
	return;
}

static void xbfs_delete_inode(struct inode *inode)
{
	struct buffer_head *bh;
	struct xbfs_inode_disk *id;

	DPRINT("enter\n");

	bh = sb_bread(inode->i_sb, inode->i_ino);
	if (!bh) {
		DPRINT("sb_bread inode %ld error\n", inode->i_ino);
		return ;
	}

	id = (typeof(id))bh->b_data;
	if (S_ISDIR(id->mode)) {
		struct xbfs_dirent *ent;
		
		for_each_dirent(id, ent, {
			DPRINT(	"oh, fuck your ass hole.\n"
					"try to delete dir contains entry %s\n", 
					ent->name);
		});
	} else if (S_ISREG(id->mode)) {
		int i, n;

		n = (inode->i_size + BLK_SIZE - 1) >> BLK_SIZE_BITS;
		for (i = 0; i < n; i++)
			bmp_free_block(inode->i_sb, id->blk_list[i]);
	}

	inode->i_size = 0;
	truncate_inode_pages(inode->i_mapping, 0);
	bmp_free_block(inode->i_sb, inode->i_ino);
	clear_inode(inode);
	brelse(bh);
}

const struct super_operations xbfs_sops = {
	.read_inode	= xbfs_read_inode,
	.write_inode	= xbfs_write_inode,
	.delete_inode	= xbfs_delete_inode,
	.put_super	= xbfs_put_super
};


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -