Blame view
fs/hfs/super.c
12.1 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 |
/* * linux/fs/hfs/super.c * * Copyright (C) 1995-1997 Paul H. Hargrove * (C) 2003 Ardis Technologies <roman@ardistech.com> * This file may be distributed under the terms of the GNU General Public License. * * This file contains hfs_read_super(), some of the super_ops and |
14b30d628 hfs: update comme... |
9 |
* init_hfs_fs() and exit_hfs_fs(). The remaining super_ops are in |
1da177e4c Linux-2.6.12-rc2 |
10 11 12 13 |
* inode.c since they deal with inodes. * * Based on the minix file system code, (C) 1991, 1992 by Linus Torvalds */ |
1da177e4c Linux-2.6.12-rc2 |
14 15 |
#include <linux/module.h> #include <linux/blkdev.h> |
717dd80e9 [PATCH] hfs: show... |
16 |
#include <linux/mount.h> |
1da177e4c Linux-2.6.12-rc2 |
17 |
#include <linux/init.h> |
328b92278 [PATCH] hfs: NLS ... |
18 |
#include <linux/nls.h> |
1da177e4c Linux-2.6.12-rc2 |
19 |
#include <linux/parser.h> |
717dd80e9 [PATCH] hfs: show... |
20 |
#include <linux/seq_file.h> |
5a0e3ad6a include cleanup: ... |
21 |
#include <linux/slab.h> |
1da177e4c Linux-2.6.12-rc2 |
22 23 24 25 |
#include <linux/vfs.h> #include "hfs_fs.h" #include "btree.h" |
e18b890bb [PATCH] slab: rem... |
26 |
static struct kmem_cache *hfs_inode_cachep; |
1da177e4c Linux-2.6.12-rc2 |
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
MODULE_LICENSE("GPL"); /* * hfs_write_super() * * Description: * This function is called by the VFS only. When the filesystem * is mounted r/w it updates the MDB on disk. * Input Variable(s): * struct super_block *sb: Pointer to the hfs superblock * Output Variable(s): * NONE * Returns: * void * Preconditions: * 'sb' points to a "valid" (struct super_block). * Postconditions: * The MDB is marked 'unsuccessfully unmounted' by clearing bit 8 of drAtrb * (hfs_put_super() must set this flag!). Some MDB fields are updated * and the MDB buffer is written to disk by calling hfs_mdb_commit(). */ static void hfs_write_super(struct super_block *sb) { |
ebc1ac164 ->write_super loc... |
51 |
lock_super(sb); |
1da177e4c Linux-2.6.12-rc2 |
52 |
sb->s_dirt = 0; |
ebc1ac164 ->write_super loc... |
53 |
|
1da177e4c Linux-2.6.12-rc2 |
54 |
/* sync everything to the buffers */ |
ebc1ac164 ->write_super loc... |
55 56 57 |
if (!(sb->s_flags & MS_RDONLY)) hfs_mdb_commit(sb); unlock_super(sb); |
1da177e4c Linux-2.6.12-rc2 |
58 |
} |
58bc5bbb8 hfs: add ->sync_fs |
59 60 61 62 63 64 65 66 67 |
static int hfs_sync_fs(struct super_block *sb, int wait) { lock_super(sb); hfs_mdb_commit(sb); sb->s_dirt = 0; unlock_super(sb); return 0; } |
1da177e4c Linux-2.6.12-rc2 |
68 69 70 71 72 73 74 75 76 |
/* * hfs_put_super() * * This is the put_super() entry in the super_operations structure for * HFS filesystems. The purpose is to release the resources * associated with the superblock sb. */ static void hfs_put_super(struct super_block *sb) { |
8c85e1251 remove ->write_su... |
77 78 |
if (sb->s_dirt) hfs_write_super(sb); |
1da177e4c Linux-2.6.12-rc2 |
79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
hfs_mdb_close(sb); /* release the MDB's resources */ hfs_mdb_put(sb); } /* * hfs_statfs() * * This is the statfs() entry in the super_operations structure for * HFS filesystems. The purpose is to return various data about the * filesystem. * * changed f_files/f_ffree to reflect the fs_ablock/free_ablocks. */ |
726c33422 [PATCH] VFS: Perm... |
93 |
static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf) |
1da177e4c Linux-2.6.12-rc2 |
94 |
{ |
726c33422 [PATCH] VFS: Perm... |
95 |
struct super_block *sb = dentry->d_sb; |
7dd2c000f fs/hfs: return f_... |
96 |
u64 id = huge_encode_dev(sb->s_bdev->bd_dev); |
726c33422 [PATCH] VFS: Perm... |
97 |
|
1da177e4c Linux-2.6.12-rc2 |
98 99 100 101 102 103 104 |
buf->f_type = HFS_SUPER_MAGIC; buf->f_bsize = sb->s_blocksize; buf->f_blocks = (u32)HFS_SB(sb)->fs_ablocks * HFS_SB(sb)->fs_div; buf->f_bfree = (u32)HFS_SB(sb)->free_ablocks * HFS_SB(sb)->fs_div; buf->f_bavail = buf->f_bfree; buf->f_files = HFS_SB(sb)->fs_ablocks; buf->f_ffree = HFS_SB(sb)->free_ablocks; |
7dd2c000f fs/hfs: return f_... |
105 106 |
buf->f_fsid.val[0] = (u32)id; buf->f_fsid.val[1] = (u32)(id >> 32); |
1da177e4c Linux-2.6.12-rc2 |
107 108 109 110 111 112 113 114 115 116 117 118 |
buf->f_namelen = HFS_NAMELEN; return 0; } static int hfs_remount(struct super_block *sb, int *flags, char *data) { *flags |= MS_NODIRATIME; if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) return 0; if (!(*flags & MS_RDONLY)) { if (!(HFS_SB(sb)->mdb->drAtrb & cpu_to_be16(HFS_SB_ATTRIB_UNMNT))) { |
7cf3cc303 [PATCH] hfs: clea... |
119 |
printk(KERN_WARNING "hfs: filesystem was not cleanly unmounted, " |
1da177e4c Linux-2.6.12-rc2 |
120 121 122 123 124 |
"running fsck.hfs is recommended. leaving read-only. "); sb->s_flags |= MS_RDONLY; *flags |= MS_RDONLY; } else if (HFS_SB(sb)->mdb->drAtrb & cpu_to_be16(HFS_SB_ATTRIB_SLOCK)) { |
7cf3cc303 [PATCH] hfs: clea... |
125 126 |
printk(KERN_WARNING "hfs: filesystem is marked locked, leaving read-only. "); |
1da177e4c Linux-2.6.12-rc2 |
127 128 129 130 131 132 |
sb->s_flags |= MS_RDONLY; *flags |= MS_RDONLY; } } return 0; } |
34c80b1d9 vfs: switch ->sho... |
133 |
static int hfs_show_options(struct seq_file *seq, struct dentry *root) |
717dd80e9 [PATCH] hfs: show... |
134 |
{ |
34c80b1d9 vfs: switch ->sho... |
135 |
struct hfs_sb_info *sbi = HFS_SB(root->d_sb); |
717dd80e9 [PATCH] hfs: show... |
136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
if (sbi->s_creator != cpu_to_be32(0x3f3f3f3f)) seq_printf(seq, ",creator=%.4s", (char *)&sbi->s_creator); if (sbi->s_type != cpu_to_be32(0x3f3f3f3f)) seq_printf(seq, ",type=%.4s", (char *)&sbi->s_type); seq_printf(seq, ",uid=%u,gid=%u", sbi->s_uid, sbi->s_gid); if (sbi->s_file_umask != 0133) seq_printf(seq, ",file_umask=%o", sbi->s_file_umask); if (sbi->s_dir_umask != 0022) seq_printf(seq, ",dir_umask=%o", sbi->s_dir_umask); if (sbi->part >= 0) seq_printf(seq, ",part=%u", sbi->part); if (sbi->session >= 0) seq_printf(seq, ",session=%u", sbi->session); |
328b92278 [PATCH] hfs: NLS ... |
150 151 152 153 |
if (sbi->nls_disk) seq_printf(seq, ",codepage=%s", sbi->nls_disk->charset); if (sbi->nls_io) seq_printf(seq, ",iocharset=%s", sbi->nls_io->charset); |
717dd80e9 [PATCH] hfs: show... |
154 155 156 157 |
if (sbi->s_quiet) seq_printf(seq, ",quiet"); return 0; } |
1da177e4c Linux-2.6.12-rc2 |
158 159 160 |
static struct inode *hfs_alloc_inode(struct super_block *sb) { struct hfs_inode_info *i; |
e94b17660 [PATCH] slab: rem... |
161 |
i = kmem_cache_alloc(hfs_inode_cachep, GFP_KERNEL); |
1da177e4c Linux-2.6.12-rc2 |
162 163 |
return i ? &i->vfs_inode : NULL; } |
fa0d7e3de fs: icache RCU fr... |
164 |
static void hfs_i_callback(struct rcu_head *head) |
1da177e4c Linux-2.6.12-rc2 |
165 |
{ |
fa0d7e3de fs: icache RCU fr... |
166 |
struct inode *inode = container_of(head, struct inode, i_rcu); |
1da177e4c Linux-2.6.12-rc2 |
167 168 |
kmem_cache_free(hfs_inode_cachep, HFS_I(inode)); } |
fa0d7e3de fs: icache RCU fr... |
169 170 171 172 |
static void hfs_destroy_inode(struct inode *inode) { call_rcu(&inode->i_rcu, hfs_i_callback); } |
ee9b6d61a [PATCH] Mark stru... |
173 |
static const struct super_operations hfs_super_operations = { |
1da177e4c Linux-2.6.12-rc2 |
174 175 176 |
.alloc_inode = hfs_alloc_inode, .destroy_inode = hfs_destroy_inode, .write_inode = hfs_write_inode, |
b57922d97 convert remaining... |
177 |
.evict_inode = hfs_evict_inode, |
1da177e4c Linux-2.6.12-rc2 |
178 179 |
.put_super = hfs_put_super, .write_super = hfs_write_super, |
58bc5bbb8 hfs: add ->sync_fs |
180 |
.sync_fs = hfs_sync_fs, |
1da177e4c Linux-2.6.12-rc2 |
181 182 |
.statfs = hfs_statfs, .remount_fs = hfs_remount, |
717dd80e9 [PATCH] hfs: show... |
183 |
.show_options = hfs_show_options, |
1da177e4c Linux-2.6.12-rc2 |
184 185 186 187 188 |
}; enum { opt_uid, opt_gid, opt_umask, opt_file_umask, opt_dir_umask, opt_part, opt_session, opt_type, opt_creator, opt_quiet, |
328b92278 [PATCH] hfs: NLS ... |
189 |
opt_codepage, opt_iocharset, |
1da177e4c Linux-2.6.12-rc2 |
190 191 |
opt_err }; |
a447c0932 vfs: Use const fo... |
192 |
static const match_table_t tokens = { |
1da177e4c Linux-2.6.12-rc2 |
193 194 195 196 197 198 199 200 201 202 |
{ opt_uid, "uid=%u" }, { opt_gid, "gid=%u" }, { opt_umask, "umask=%o" }, { opt_file_umask, "file_umask=%o" }, { opt_dir_umask, "dir_umask=%o" }, { opt_part, "part=%u" }, { opt_session, "session=%u" }, { opt_type, "type=%s" }, { opt_creator, "creator=%s" }, { opt_quiet, "quiet" }, |
328b92278 [PATCH] hfs: NLS ... |
203 204 |
{ opt_codepage, "codepage=%s" }, { opt_iocharset, "iocharset=%s" }, |
1da177e4c Linux-2.6.12-rc2 |
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 |
{ opt_err, NULL } }; static inline int match_fourchar(substring_t *arg, u32 *result) { if (arg->to - arg->from != 4) return -EINVAL; memcpy(result, arg->from, 4); return 0; } /* * parse_options() * * adapted from linux/fs/msdos/inode.c written 1992,93 by Werner Almesberger * This function is called by hfs_read_super() to parse the mount options. */ static int parse_options(char *options, struct hfs_sb_info *hsb) { char *p; substring_t args[MAX_OPT_ARGS]; int tmp, token; /* initialize the sb with defaults */ |
94c9a5ee4 CRED: Wrap task c... |
229 230 |
hsb->s_uid = current_uid(); hsb->s_gid = current_gid(); |
1da177e4c Linux-2.6.12-rc2 |
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
hsb->s_file_umask = 0133; hsb->s_dir_umask = 0022; hsb->s_type = hsb->s_creator = cpu_to_be32(0x3f3f3f3f); /* == '????' */ hsb->s_quiet = 0; hsb->part = -1; hsb->session = -1; if (!options) return 1; while ((p = strsep(&options, ",")) != NULL) { if (!*p) continue; token = match_token(p, tokens, args); switch (token) { case opt_uid: if (match_int(&args[0], &tmp)) { |
7cf3cc303 [PATCH] hfs: clea... |
249 250 |
printk(KERN_ERR "hfs: uid requires an argument "); |
1da177e4c Linux-2.6.12-rc2 |
251 252 253 254 255 256 |
return 0; } hsb->s_uid = (uid_t)tmp; break; case opt_gid: if (match_int(&args[0], &tmp)) { |
7cf3cc303 [PATCH] hfs: clea... |
257 258 |
printk(KERN_ERR "hfs: gid requires an argument "); |
1da177e4c Linux-2.6.12-rc2 |
259 260 261 262 263 264 |
return 0; } hsb->s_gid = (gid_t)tmp; break; case opt_umask: if (match_octal(&args[0], &tmp)) { |
7cf3cc303 [PATCH] hfs: clea... |
265 266 |
printk(KERN_ERR "hfs: umask requires a value "); |
1da177e4c Linux-2.6.12-rc2 |
267 268 269 270 271 272 273 |
return 0; } hsb->s_file_umask = (umode_t)tmp; hsb->s_dir_umask = (umode_t)tmp; break; case opt_file_umask: if (match_octal(&args[0], &tmp)) { |
7cf3cc303 [PATCH] hfs: clea... |
274 275 |
printk(KERN_ERR "hfs: file_umask requires a value "); |
1da177e4c Linux-2.6.12-rc2 |
276 277 278 279 280 281 |
return 0; } hsb->s_file_umask = (umode_t)tmp; break; case opt_dir_umask: if (match_octal(&args[0], &tmp)) { |
7cf3cc303 [PATCH] hfs: clea... |
282 283 |
printk(KERN_ERR "hfs: dir_umask requires a value "); |
1da177e4c Linux-2.6.12-rc2 |
284 285 286 287 288 289 |
return 0; } hsb->s_dir_umask = (umode_t)tmp; break; case opt_part: if (match_int(&args[0], &hsb->part)) { |
7cf3cc303 [PATCH] hfs: clea... |
290 291 |
printk(KERN_ERR "hfs: part requires an argument "); |
1da177e4c Linux-2.6.12-rc2 |
292 293 294 295 296 |
return 0; } break; case opt_session: if (match_int(&args[0], &hsb->session)) { |
7cf3cc303 [PATCH] hfs: clea... |
297 298 |
printk(KERN_ERR "hfs: session requires an argument "); |
1da177e4c Linux-2.6.12-rc2 |
299 300 301 302 303 |
return 0; } break; case opt_type: if (match_fourchar(&args[0], &hsb->s_type)) { |
7cf3cc303 [PATCH] hfs: clea... |
304 305 |
printk(KERN_ERR "hfs: type requires a 4 character value "); |
1da177e4c Linux-2.6.12-rc2 |
306 307 308 309 310 |
return 0; } break; case opt_creator: if (match_fourchar(&args[0], &hsb->s_creator)) { |
7cf3cc303 [PATCH] hfs: clea... |
311 312 |
printk(KERN_ERR "hfs: creator requires a 4 character value "); |
1da177e4c Linux-2.6.12-rc2 |
313 314 315 316 317 318 |
return 0; } break; case opt_quiet: hsb->s_quiet = 1; break; |
328b92278 [PATCH] hfs: NLS ... |
319 320 |
case opt_codepage: if (hsb->nls_disk) { |
7cf3cc303 [PATCH] hfs: clea... |
321 322 |
printk(KERN_ERR "hfs: unable to change codepage "); |
328b92278 [PATCH] hfs: NLS ... |
323 324 325 |
return 0; } p = match_strdup(&args[0]); |
3fbe5c310 hfs: handle match... |
326 327 |
if (p) hsb->nls_disk = load_nls(p); |
328b92278 [PATCH] hfs: NLS ... |
328 |
if (!hsb->nls_disk) { |
7cf3cc303 [PATCH] hfs: clea... |
329 330 |
printk(KERN_ERR "hfs: unable to load codepage \"%s\" ", p); |
328b92278 [PATCH] hfs: NLS ... |
331 332 333 334 335 336 337 |
kfree(p); return 0; } kfree(p); break; case opt_iocharset: if (hsb->nls_io) { |
7cf3cc303 [PATCH] hfs: clea... |
338 339 |
printk(KERN_ERR "hfs: unable to change iocharset "); |
328b92278 [PATCH] hfs: NLS ... |
340 341 342 |
return 0; } p = match_strdup(&args[0]); |
3fbe5c310 hfs: handle match... |
343 344 |
if (p) hsb->nls_io = load_nls(p); |
328b92278 [PATCH] hfs: NLS ... |
345 |
if (!hsb->nls_io) { |
7cf3cc303 [PATCH] hfs: clea... |
346 347 |
printk(KERN_ERR "hfs: unable to load iocharset \"%s\" ", p); |
328b92278 [PATCH] hfs: NLS ... |
348 349 350 351 352 |
kfree(p); return 0; } kfree(p); break; |
1da177e4c Linux-2.6.12-rc2 |
353 354 355 356 |
default: return 0; } } |
328b92278 [PATCH] hfs: NLS ... |
357 358 359 |
if (hsb->nls_disk && !hsb->nls_io) { hsb->nls_io = load_nls_default(); if (!hsb->nls_io) { |
7cf3cc303 [PATCH] hfs: clea... |
360 361 |
printk(KERN_ERR "hfs: unable to load default iocharset "); |
328b92278 [PATCH] hfs: NLS ... |
362 363 364 |
return 0; } } |
1da177e4c Linux-2.6.12-rc2 |
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 |
hsb->s_dir_umask &= 0777; hsb->s_file_umask &= 0577; return 1; } /* * hfs_read_super() * * This is the function that is responsible for mounting an HFS * filesystem. It performs all the tasks necessary to get enough data * from the disk to read the root inode. This includes parsing the * mount options, dealing with Macintosh partitions, reading the * superblock and the allocation bitmap blocks, calling * hfs_btree_init() to get the necessary data about the extents and * catalog B-trees and, finally, reading the root inode into memory. */ static int hfs_fill_super(struct super_block *sb, void *data, int silent) { struct hfs_sb_info *sbi; struct hfs_find_data fd; hfs_cat_rec rec; struct inode *root_inode; int res; |
f8314dc60 [PATCH] fs: Conve... |
389 |
sbi = kzalloc(sizeof(struct hfs_sb_info), GFP_KERNEL); |
8526fb37c BKL: Remove BKL f... |
390 |
if (!sbi) |
1da177e4c Linux-2.6.12-rc2 |
391 |
return -ENOMEM; |
8526fb37c BKL: Remove BKL f... |
392 |
|
1da177e4c Linux-2.6.12-rc2 |
393 |
sb->s_fs_info = sbi; |
1da177e4c Linux-2.6.12-rc2 |
394 395 396 |
res = -EINVAL; if (!parse_options((char *)data, sbi)) { |
7cf3cc303 [PATCH] hfs: clea... |
397 398 |
printk(KERN_ERR "hfs: unable to parse mount options. "); |
945b09201 [PATCH] hfs, hfsp... |
399 |
goto bail; |
1da177e4c Linux-2.6.12-rc2 |
400 401 402 403 |
} sb->s_op = &hfs_super_operations; sb->s_flags |= MS_NODIRATIME; |
3084b72de hfs: convert bitm... |
404 |
mutex_init(&sbi->bitmap_lock); |
1da177e4c Linux-2.6.12-rc2 |
405 406 407 408 |
res = hfs_mdb_get(sb); if (res) { if (!silent) |
7cf3cc303 [PATCH] hfs: clea... |
409 410 |
printk(KERN_WARNING "hfs: can't find a HFS filesystem on dev %s. ", |
1da177e4c Linux-2.6.12-rc2 |
411 412 |
hfs_mdb_name(sb)); res = -EINVAL; |
945b09201 [PATCH] hfs, hfsp... |
413 |
goto bail; |
1da177e4c Linux-2.6.12-rc2 |
414 415 416 417 418 |
} /* try to get the root inode */ hfs_find_init(HFS_SB(sb)->cat_tree, &fd); res = hfs_cat_find_brec(sb, HFS_ROOT_CNID, &fd); |
ec81aecb2 hfs: fix a potent... |
419 420 421 422 423 |
if (!res) { if (fd.entrylength > sizeof(rec) || fd.entrylength < 0) { res = -EIO; goto bail; } |
1da177e4c Linux-2.6.12-rc2 |
424 |
hfs_bnode_read(fd.bnode, &rec, fd.entryoffset, fd.entrylength); |
ec81aecb2 hfs: fix a potent... |
425 |
} |
1da177e4c Linux-2.6.12-rc2 |
426 427 428 429 |
if (res) { hfs_find_exit(&fd); goto bail_no_root; } |
d6ddf5544 [PATCH] hfs_fill_... |
430 |
res = -EINVAL; |
1da177e4c Linux-2.6.12-rc2 |
431 432 433 434 |
root_inode = hfs_iget(sb, &fd.search_key->cat, &rec); hfs_find_exit(&fd); if (!root_inode) goto bail_no_root; |
518c79d28 switch hfs |
435 |
sb->s_d_op = &hfs_dentry_operations; |
d6ddf5544 [PATCH] hfs_fill_... |
436 |
res = -ENOMEM; |
1da177e4c Linux-2.6.12-rc2 |
437 438 439 |
sb->s_root = d_alloc_root(root_inode); if (!sb->s_root) goto bail_iput; |
1da177e4c Linux-2.6.12-rc2 |
440 441 442 443 444 445 |
/* everything's okay */ return 0; bail_iput: iput(root_inode); bail_no_root: |
7cf3cc303 [PATCH] hfs: clea... |
446 447 |
printk(KERN_ERR "hfs: get root inode failed. "); |
945b09201 [PATCH] hfs, hfsp... |
448 |
bail: |
1da177e4c Linux-2.6.12-rc2 |
449 |
hfs_mdb_put(sb); |
1da177e4c Linux-2.6.12-rc2 |
450 451 |
return res; } |
152a08366 new helper: mount... |
452 453 |
static struct dentry *hfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data) |
1da177e4c Linux-2.6.12-rc2 |
454 |
{ |
152a08366 new helper: mount... |
455 |
return mount_bdev(fs_type, flags, dev_name, data, hfs_fill_super); |
1da177e4c Linux-2.6.12-rc2 |
456 457 458 459 460 |
} static struct file_system_type hfs_fs_type = { .owner = THIS_MODULE, .name = "hfs", |
152a08366 new helper: mount... |
461 |
.mount = hfs_mount, |
1da177e4c Linux-2.6.12-rc2 |
462 463 464 |
.kill_sb = kill_block_super, .fs_flags = FS_REQUIRES_DEV, }; |
51cc50685 SL*B: drop kmem c... |
465 |
static void hfs_init_once(void *p) |
1da177e4c Linux-2.6.12-rc2 |
466 467 |
{ struct hfs_inode_info *i = p; |
a35afb830 Remove SLAB_CTOR_... |
468 |
inode_init_once(&i->vfs_inode); |
1da177e4c Linux-2.6.12-rc2 |
469 470 471 472 473 474 475 476 |
} static int __init init_hfs_fs(void) { int err; hfs_inode_cachep = kmem_cache_create("hfs_inode_cache", sizeof(struct hfs_inode_info), 0, SLAB_HWCACHE_ALIGN, |
20c2df83d mm: Remove slab d... |
477 |
hfs_init_once); |
1da177e4c Linux-2.6.12-rc2 |
478 479 480 481 482 483 484 485 486 487 488 |
if (!hfs_inode_cachep) return -ENOMEM; err = register_filesystem(&hfs_fs_type); if (err) kmem_cache_destroy(hfs_inode_cachep); return err; } static void __exit exit_hfs_fs(void) { unregister_filesystem(&hfs_fs_type); |
1a1d92c10 [PATCH] Really ig... |
489 |
kmem_cache_destroy(hfs_inode_cachep); |
1da177e4c Linux-2.6.12-rc2 |
490 491 492 493 |
} module_init(init_hfs_fs) module_exit(exit_hfs_fs) |