📄 inode.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 + -