#include <linux/module.h> #include <linux/fs.h> #include <linux/pagemap.h> #include <linux/mount.h> #include <linux/init.h> #include <linux/namei.h> #deifne AUFS_MAGIC 0x64668735 static struct vfsmount *aufs_mount; static int aufs_mount_count; static struct inode *aufs_get_inode(struct super_block *sb , int mode , dev_t dev) {
struct inode *inode = new_inode(sb);
if(inode){
inode->i_mode = mode;
inode->i_uid = current->fsuid;
inode->i_gid = current->fsgid;
inode->i_blksize = PAGE_CACHE_SIZE;
inode->i_blocks = 0;
inode->i_atime = inode->i_ctime = CURRENT_TIME;
switch(mode & S_IFMT){
default:
init_special_inode(inode, mode, dev);
break;
case S_IFREG:
printk("create a file\n");
break;
case S_IFDIR:
inode->i_op = &simple_dir_inode_operations;
inode->i_fop = &simple_dir_operation;
printk("create a dir file");
inode->i_nlink++;
break;
return inode;}} }
static int_aufs_mknod(struct inode *dir , struct dentry *dentry , int mode , dev_t dev)
{
struct inode *inode;
int error = -EPERM;
if(dentry->d_inode)
return -EEXIST;
inode = aufs_get_inode(dir->i_sb,mode,dev);
if(inode){
d_instantiate(dentry, inode);
dget(dentry);
}error = 0;
}return error;
static int aufs_mkdir(struct inode *dir,struct dentry *dentry, int mode)
{
int res;
res = aufs_mknod(dir,dentry,mode | S_IFDIR, 0);
if(!res)
dir->i_nlink++;
return res; }
static int aufs_create(struct inode *dir , struct dentry *dentry, int mode)
{
return aufs_mknod(dir, dentry, mode | S_IFREG, 0);
}
static int aufs_fill_super(struct super_block *sb , void *data , int silent)
{
static struct tree_descr debug_files[] = {{""}};
return simple_fill_super(sb, AUFS_MAGIC, debug_files);
}
static struct super_block *aufs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data)
{
return get_sb_single(fs_type, flasg, data, aufs_fill_super);
}
static struct file_sysem_type au_fs_type = {
.owner = THIS_MODULE, .name = "aufs",
.get_sb= aufs_get_sb,
.kill = kill_litter_super,
};
static int aufs_create_by_name(const char *name, mode_t mode, struct dentry *parent, struct dentry **dentry)
{
int error = 0;
if(!parent){
if(aufs_mount&& aufs_mount->mnt_sb){
parent = aufs_mount->mnt_sb->s_root
}
}
*dentry = NULL;
mutex_lock(&parent->d_inode->i_mutex);
*dentry = lookup_one_len(name, parent, strlen(name));
if(!IS_ERR(dentry)) {
if(mode &S_IFMT) == S_IFDIR)
error = aufs_mkdir(parent->d_inode, *dentry, mode);
else
error = PTR_ERR(dentry);
mutex_unlock( &parent->d_inode->i_mutex);
return error;
}
}
struct dentry *aufs_create_file(const char *name, mode_t
aufs简单的文件系统
最新推荐文章于 2023-07-03 16:43:21 发布