@@ -21,16 +21,28 @@ struct mbt_ctx {
21
21
};
22
22
23
23
struct mbt_ext4_super_block {
24
- struct super_block sb ;
24
+ struct ext4_super_block es ;
25
+ struct ext4_sb_info sbi ;
25
26
struct mbt_ctx mbt_ctx ;
26
27
};
27
28
28
- #define MBT_CTX (_sb ) (&(container_of((_sb), struct mbt_ext4_super_block, sb)->mbt_ctx))
29
+ #define MBT_SB (_sb ) (container_of((_sb)->s_fs_info, struct mbt_ext4_super_block, sbi))
30
+ #define MBT_CTX (_sb ) (&MBT_SB(_sb)->mbt_ctx)
29
31
#define MBT_GRP_CTX (_sb , _group ) (&MBT_CTX(_sb)->grp_ctx[_group])
30
32
31
33
static const struct super_operations mbt_sops = {
32
34
};
33
35
36
+ static void mbt_kill_sb (struct super_block * sb )
37
+ {
38
+ generic_shutdown_super (sb );
39
+ }
40
+
41
+ static struct file_system_type mbt_fs_type = {
42
+ .name = "mballoc test" ,
43
+ .kill_sb = mbt_kill_sb ,
44
+ };
45
+
34
46
static int mbt_mb_init (struct super_block * sb )
35
47
{
36
48
int ret ;
@@ -72,43 +84,54 @@ static void mbt_mb_release(struct super_block *sb)
72
84
kfree (sb -> s_bdev );
73
85
}
74
86
87
+ static int mbt_set (struct super_block * sb , void * data )
88
+ {
89
+ return 0 ;
90
+ }
91
+
75
92
static struct super_block * mbt_ext4_alloc_super_block (void )
76
93
{
77
- struct ext4_super_block * es = kzalloc ( sizeof ( * es ), GFP_KERNEL ) ;
78
- struct ext4_sb_info * sbi = kzalloc ( sizeof ( * sbi ), GFP_KERNEL ) ;
79
- struct mbt_ext4_super_block * fsb = kzalloc ( sizeof ( * fsb ), GFP_KERNEL ) ;
94
+ struct mbt_ext4_super_block * fsb ;
95
+ struct super_block * sb ;
96
+ struct ext4_sb_info * sbi ;
80
97
81
- if (fsb == NULL || sbi == NULL || es == NULL )
98
+ fsb = kzalloc (sizeof (* fsb ), GFP_KERNEL );
99
+ if (fsb == NULL )
100
+ return NULL ;
101
+
102
+ sb = sget (& mbt_fs_type , NULL , mbt_set , 0 , NULL );
103
+ if (IS_ERR (sb ))
82
104
goto out ;
83
105
106
+ sbi = & fsb -> sbi ;
107
+
84
108
sbi -> s_blockgroup_lock =
85
109
kzalloc (sizeof (struct blockgroup_lock ), GFP_KERNEL );
86
110
if (!sbi -> s_blockgroup_lock )
87
- goto out ;
111
+ goto out_deactivate ;
88
112
89
113
bgl_lock_init (sbi -> s_blockgroup_lock );
90
114
91
- sbi -> s_es = es ;
92
- fsb -> sb . s_fs_info = sbi ;
115
+ sbi -> s_es = & fsb -> es ;
116
+ sb -> s_fs_info = sbi ;
93
117
94
- return & fsb -> sb ;
118
+ up_write (& sb -> s_umount );
119
+ return sb ;
95
120
121
+ out_deactivate :
122
+ deactivate_locked_super (sb );
96
123
out :
97
124
kfree (fsb );
98
- kfree (sbi );
99
- kfree (es );
100
125
return NULL ;
101
126
}
102
127
103
128
static void mbt_ext4_free_super_block (struct super_block * sb )
104
129
{
105
- struct mbt_ext4_super_block * fsb =
106
- container_of (sb , struct mbt_ext4_super_block , sb );
130
+ struct mbt_ext4_super_block * fsb = MBT_SB (sb );
107
131
struct ext4_sb_info * sbi = EXT4_SB (sb );
108
132
109
133
kfree (sbi -> s_blockgroup_lock );
110
- kfree (sbi -> s_es );
111
- kfree (sbi );
134
+ deactivate_super (sb );
112
135
kfree (fsb );
113
136
}
114
137
0 commit comments