1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * linux/fs/affs/inode.c 4 * 5 * (c) 1996 Hans-Joachim Widmaier - Rewritten 6 * 7 * (C) 1993 Ray Burr - Modified for Amiga FFS filesystem. 8 * 9 * (C) 1992 Eric Youngdale Modified for ISO 9660 filesystem. 10 * 11 * (C) 1991 Linus Torvalds - minix filesystem 12 */ 13 14 #include <linux/module.h> 15 #include <linux/init.h> 16 #include <linux/statfs.h> 17 #include <linux/fs_parser.h> 18 #include <linux/fs_context.h> 19 #include <linux/magic.h> 20 #include <linux/sched.h> 21 #include <linux/cred.h> 22 #include <linux/slab.h> 23 #include <linux/writeback.h> 24 #include <linux/blkdev.h> 25 #include <linux/seq_file.h> 26 #include <linux/iversion.h> 27 #include "affs.h" 28 29 static int affs_statfs(struct dentry *dentry, struct kstatfs *buf); 30 static int affs_show_options(struct seq_file *m, struct dentry *root); 31 32 static void 33 affs_commit_super(struct super_block *sb, int wait) 34 { 35 struct affs_sb_info *sbi = AFFS_SB(sb); 36 struct buffer_head *bh = sbi->s_root_bh; 37 struct affs_root_tail *tail = AFFS_ROOT_TAIL(sb, bh); 38 39 lock_buffer(bh); 40 affs_secs_to_datestamp(ktime_get_real_seconds(), &tail->disk_change); 41 affs_fix_checksum(sb, bh); 42 unlock_buffer(bh); 43 44 mark_buffer_dirty(bh); 45 if (wait) 46 sync_dirty_buffer(bh); 47 } 48 49 static void 50 affs_put_super(struct super_block *sb) 51 { 52 struct affs_sb_info *sbi = AFFS_SB(sb); 53 pr_debug("%s()\n", __func__); 54 55 cancel_delayed_work_sync(&sbi->sb_work); 56 } 57 58 static int 59 affs_sync_fs(struct super_block *sb, int wait) 60 { 61 affs_commit_super(sb, wait); 62 return 0; 63 } 64 65 static void flush_superblock(struct work_struct *work) 66 { 67 struct affs_sb_info *sbi; 68 struct super_block *sb; 69 70 sbi = container_of(work, struct affs_sb_info, sb_work.work); 71 sb = sbi->sb; 72 73 spin_lock(&sbi->work_lock); 74 sbi->work_queued = 0; 75 spin_unlock(&sbi->work_lock); 76 77 affs_commit_super(sb, 1); 78 } 79 80 void affs_mark_sb_dirty(struct super_block *sb) 81 { 82 struct affs_sb_info *sbi = AFFS_SB(sb); 83 unsigned long delay; 84 85 if (sb_rdonly(sb)) 86 return; 87 88 spin_lock(&sbi->work_lock); 89 if (!sbi->work_queued) { 90 delay = msecs_to_jiffies(dirty_writeback_interval * 10); 91 queue_delayed_work(system_long_wq, &sbi->sb_work, delay); 92 sbi->work_queued = 1; 93 } 94 spin_unlock(&sbi->work_lock); 95 } 96 97 static struct kmem_cache * affs_inode_cachep; 98 99 static struct inode *affs_alloc_inode(struct super_block *sb) 100 { 101 struct affs_inode_info *i; 102 103 i = alloc_inode_sb(sb, affs_inode_cachep, GFP_KERNEL); 104 if (!i) 105 return NULL; 106 107 inode_set_iversion(&i->vfs_inode, 1); 108 i->i_lc = NULL; 109 i->i_ext_bh = NULL; 110 i->i_pa_cnt = 0; 111 112 return &i->vfs_inode; 113 } 114 115 static void affs_free_inode(struct inode *inode) 116 { 117 kmem_cache_free(affs_inode_cachep, AFFS_I(inode)); 118 } 119 120 static void init_once(void *foo) 121 { 122 struct affs_inode_info *ei = (struct affs_inode_info *) foo; 123 124 mutex_init(&ei->i_link_lock); 125 mutex_init(&ei->i_ext_lock); 126 inode_init_once(&ei->vfs_inode); 127 } 128 129 static int __init init_inodecache(void) 130 { 131 affs_inode_cachep = kmem_cache_create("affs_inode_cache", 132 sizeof(struct affs_inode_info), 133 0, (SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT), 134 init_once); 135 if (affs_inode_cachep == NULL) 136 return -ENOMEM; 137 return 0; 138 } 139 140 static void destroy_inodecache(void) 141 { 142 /* 143 * Make sure all delayed rcu free inodes are flushed before we 144 * destroy cache. 145 */ 146 rcu_barrier(); 147 kmem_cache_destroy(affs_inode_cachep); 148 } 149 150 static const struct super_operations affs_sops = { 151 .alloc_inode = affs_alloc_inode, 152 .free_inode = affs_free_inode, 153 .write_inode = affs_write_inode, 154 .evict_inode = affs_evict_inode, 155 .put_super = affs_put_super, 156 .sync_fs = affs_sync_fs, 157 .statfs = affs_statfs, 158 .show_options = affs_show_options, 159 }; 160 161 enum { 162 Opt_bs, Opt_mode, Opt_mufs, Opt_notruncate, Opt_prefix, Opt_protect, 163 Opt_reserved, Opt_root, Opt_setgid, Opt_setuid, 164 Opt_verbose, Opt_volume, Opt_ignore, 165 }; 166 167 struct affs_context { 168 kuid_t uid; /* uid to override */ 169 kgid_t gid; /* gid to override */ 170 unsigned int mode; /* mode to override */ 171 unsigned int reserved; /* Number of reserved blocks */ 172 int root_block; /* FFS root block number */ 173 int blocksize; /* Initial device blksize */ 174 char *prefix; /* Prefix for volumes and assigns */ 175 char volume[32]; /* Vol. prefix for absolute symlinks */ 176 unsigned long mount_flags; /* Options */ 177 }; 178 179 static const struct fs_parameter_spec affs_param_spec[] = { 180 fsparam_u32 ("bs", Opt_bs), 181 fsparam_u32oct ("mode", Opt_mode), 182 fsparam_flag ("mufs", Opt_mufs), 183 fsparam_flag ("nofilenametruncate", Opt_notruncate), 184 fsparam_string ("prefix", Opt_prefix), 185 fsparam_flag ("protect", Opt_protect), 186 fsparam_u32 ("reserved", Opt_reserved), 187 fsparam_u32 ("root", Opt_root), 188 fsparam_gid ("setgid", Opt_setgid), 189 fsparam_uid ("setuid", Opt_setuid), 190 fsparam_flag ("verbose", Opt_verbose), 191 fsparam_string ("volume", Opt_volume), 192 fsparam_flag ("grpquota", Opt_ignore), 193 fsparam_flag ("noquota", Opt_ignore), 194 fsparam_flag ("quota", Opt_ignore), 195 fsparam_flag ("usrquota", Opt_ignore), 196 {}, 197 }; 198 199 static int affs_parse_param(struct fs_context *fc, struct fs_parameter *param) 200 { 201 struct affs_context *ctx = fc->fs_private; 202 struct fs_parse_result result; 203 int n; 204 int opt; 205 206 opt = fs_parse(fc, affs_param_spec, param, &result); 207 if (opt < 0) 208 return opt; 209 210 switch (opt) { 211 case Opt_bs: 212 n = result.uint_32; 213 if (n != 512 && n != 1024 && n != 2048 214 && n != 4096) { 215 pr_warn("Invalid blocksize (512, 1024, 2048, 4096 allowed)\n"); 216 return -EINVAL; 217 } 218 ctx->blocksize = n; 219 break; 220 case Opt_mode: 221 ctx->mode = result.uint_32 & 0777; 222 affs_set_opt(ctx->mount_flags, SF_SETMODE); 223 break; 224 case Opt_mufs: 225 affs_set_opt(ctx->mount_flags, SF_MUFS); 226 break; 227 case Opt_notruncate: 228 affs_set_opt(ctx->mount_flags, SF_NO_TRUNCATE); 229 break; 230 case Opt_prefix: 231 kfree(ctx->prefix); 232 ctx->prefix = param->string; 233 param->string = NULL; 234 affs_set_opt(ctx->mount_flags, SF_PREFIX); 235 break; 236 case Opt_protect: 237 affs_set_opt(ctx->mount_flags, SF_IMMUTABLE); 238 break; 239 case Opt_reserved: 240 ctx->reserved = result.uint_32; 241 break; 242 case Opt_root: 243 ctx->root_block = result.uint_32; 244 break; 245 case Opt_setgid: 246 ctx->gid = result.gid; 247 affs_set_opt(ctx->mount_flags, SF_SETGID); 248 break; 249 case Opt_setuid: 250 ctx->uid = result.uid; 251 affs_set_opt(ctx->mount_flags, SF_SETUID); 252 break; 253 case Opt_verbose: 254 affs_set_opt(ctx->mount_flags, SF_VERBOSE); 255 break; 256 case Opt_volume: 257 strscpy(ctx->volume, param->string, 32); 258 break; 259 case Opt_ignore: 260 /* Silently ignore the quota options */ 261 break; 262 default: 263 return -EINVAL; 264 } 265 return 0; 266 } 267 268 static int affs_show_options(struct seq_file *m, struct dentry *root) 269 { 270 struct super_block *sb = root->d_sb; 271 struct affs_sb_info *sbi = AFFS_SB(sb); 272 273 if (sb->s_blocksize) 274 seq_printf(m, ",bs=%lu", sb->s_blocksize); 275 if (affs_test_opt(sbi->s_flags, SF_SETMODE)) 276 seq_printf(m, ",mode=%o", sbi->s_mode); 277 if (affs_test_opt(sbi->s_flags, SF_MUFS)) 278 seq_puts(m, ",mufs"); 279 if (affs_test_opt(sbi->s_flags, SF_NO_TRUNCATE)) 280 seq_puts(m, ",nofilenametruncate"); 281 if (affs_test_opt(sbi->s_flags, SF_PREFIX)) 282 seq_printf(m, ",prefix=%s", sbi->s_prefix); 283 if (affs_test_opt(sbi->s_flags, SF_IMMUTABLE)) 284 seq_puts(m, ",protect"); 285 if (sbi->s_reserved != 2) 286 seq_printf(m, ",reserved=%u", sbi->s_reserved); 287 if (sbi->s_root_block != (sbi->s_reserved + sbi->s_partition_size - 1) / 2) 288 seq_printf(m, ",root=%u", sbi->s_root_block); 289 if (affs_test_opt(sbi->s_flags, SF_SETGID)) 290 seq_printf(m, ",setgid=%u", 291 from_kgid_munged(&init_user_ns, sbi->s_gid)); 292 if (affs_test_opt(sbi->s_flags, SF_SETUID)) 293 seq_printf(m, ",setuid=%u", 294 from_kuid_munged(&init_user_ns, sbi->s_uid)); 295 if (affs_test_opt(sbi->s_flags, SF_VERBOSE)) 296 seq_puts(m, ",verbose"); 297 if (sbi->s_volume[0]) 298 seq_printf(m, ",volume=%s", sbi->s_volume); 299 return 0; 300 } 301 302 /* This function definitely needs to be split up. Some fine day I'll 303 * hopefully have the guts to do so. Until then: sorry for the mess. 304 */ 305 306 static int affs_fill_super(struct super_block *sb, struct fs_context *fc) 307 { 308 struct affs_sb_info *sbi; 309 struct affs_context *ctx = fc->fs_private; 310 struct buffer_head *root_bh = NULL; 311 struct buffer_head *boot_bh; 312 struct inode *root_inode = NULL; 313 int silent = fc->sb_flags & SB_SILENT; 314 int size, blocksize; 315 u32 chksum; 316 int num_bm; 317 int i, j; 318 int tmp_flags; /* fix remount prototype... */ 319 u8 sig[4]; 320 int ret; 321 322 sb->s_magic = AFFS_SUPER_MAGIC; 323 sb->s_op = &affs_sops; 324 sb->s_flags |= SB_NODIRATIME; 325 326 sb->s_time_gran = NSEC_PER_SEC; 327 sb->s_time_min = sys_tz.tz_minuteswest * 60 + AFFS_EPOCH_DELTA; 328 sb->s_time_max = 86400LL * U32_MAX + 86400 + sb->s_time_min; 329 330 sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL); 331 if (!sbi) 332 return -ENOMEM; 333 334 sb->s_fs_info = sbi; 335 sbi->sb = sb; 336 mutex_init(&sbi->s_bmlock); 337 spin_lock_init(&sbi->symlink_lock); 338 spin_lock_init(&sbi->work_lock); 339 INIT_DELAYED_WORK(&sbi->sb_work, flush_superblock); 340 341 sbi->s_flags = ctx->mount_flags; 342 sbi->s_mode = ctx->mode; 343 sbi->s_uid = ctx->uid; 344 sbi->s_gid = ctx->gid; 345 sbi->s_reserved = ctx->reserved; 346 sbi->s_prefix = ctx->prefix; 347 ctx->prefix = NULL; 348 memcpy(sbi->s_volume, ctx->volume, 32); 349 350 /* N.B. after this point s_prefix must be released */ 351 352 /* Get the size of the device in 512-byte blocks. 353 * If we later see that the partition uses bigger 354 * blocks, we will have to change it. 355 */ 356 357 size = bdev_nr_sectors(sb->s_bdev); 358 pr_debug("initial blocksize=%d, #blocks=%d\n", 512, size); 359 360 affs_set_blocksize(sb, PAGE_SIZE); 361 /* Try to find root block. Its location depends on the block size. */ 362 363 i = bdev_logical_block_size(sb->s_bdev); 364 j = PAGE_SIZE; 365 blocksize = ctx->blocksize; 366 if (blocksize > 0) { 367 i = j = blocksize; 368 size = size / (blocksize / 512); 369 } 370 371 for (blocksize = i; blocksize <= j; blocksize <<= 1, size >>= 1) { 372 sbi->s_root_block = ctx->root_block; 373 if (ctx->root_block < 0) 374 sbi->s_root_block = (ctx->reserved + size - 1) / 2; 375 pr_debug("setting blocksize to %d\n", blocksize); 376 affs_set_blocksize(sb, blocksize); 377 sbi->s_partition_size = size; 378 379 /* The root block location that was calculated above is not 380 * correct if the partition size is an odd number of 512- 381 * byte blocks, which will be rounded down to a number of 382 * 1024-byte blocks, and if there were an even number of 383 * reserved blocks. Ideally, all partition checkers should 384 * report the real number of blocks of the real blocksize, 385 * but since this just cannot be done, we have to try to 386 * find the root block anyways. In the above case, it is one 387 * block behind the calculated one. So we check this one, too. 388 */ 389 for (num_bm = 0; num_bm < 2; num_bm++) { 390 pr_debug("Dev %s, trying root=%u, bs=%d, " 391 "size=%d, reserved=%d\n", 392 sb->s_id, 393 sbi->s_root_block + num_bm, 394 ctx->blocksize, size, ctx->reserved); 395 root_bh = affs_bread(sb, sbi->s_root_block + num_bm); 396 if (!root_bh) 397 continue; 398 if (!affs_checksum_block(sb, root_bh) && 399 be32_to_cpu(AFFS_ROOT_HEAD(root_bh)->ptype) == T_SHORT && 400 be32_to_cpu(AFFS_ROOT_TAIL(sb, root_bh)->stype) == ST_ROOT) { 401 sbi->s_hashsize = blocksize / 4 - 56; 402 sbi->s_root_block += num_bm; 403 goto got_root; 404 } 405 affs_brelse(root_bh); 406 root_bh = NULL; 407 } 408 } 409 if (!silent) 410 pr_err("No valid root block on device %s\n", sb->s_id); 411 return -EINVAL; 412 413 /* N.B. after this point bh must be released */ 414 got_root: 415 /* Keep super block in cache */ 416 sbi->s_root_bh = root_bh; 417 ctx->root_block = sbi->s_root_block; 418 419 /* Find out which kind of FS we have */ 420 boot_bh = sb_bread(sb, 0); 421 if (!boot_bh) { 422 pr_err("Cannot read boot block\n"); 423 return -EINVAL; 424 } 425 memcpy(sig, boot_bh->b_data, 4); 426 brelse(boot_bh); 427 chksum = be32_to_cpu(*(__be32 *)sig); 428 429 /* Dircache filesystems are compatible with non-dircache ones 430 * when reading. As long as they aren't supported, writing is 431 * not recommended. 432 */ 433 if ((chksum == FS_DCFFS || chksum == MUFS_DCFFS || chksum == FS_DCOFS 434 || chksum == MUFS_DCOFS) && !sb_rdonly(sb)) { 435 pr_notice("Dircache FS - mounting %s read only\n", sb->s_id); 436 sb->s_flags |= SB_RDONLY; 437 } 438 switch (chksum) { 439 case MUFS_FS: 440 case MUFS_INTLFFS: 441 case MUFS_DCFFS: 442 affs_set_opt(sbi->s_flags, SF_MUFS); 443 fallthrough; 444 case FS_INTLFFS: 445 case FS_DCFFS: 446 affs_set_opt(sbi->s_flags, SF_INTL); 447 break; 448 case MUFS_FFS: 449 affs_set_opt(sbi->s_flags, SF_MUFS); 450 break; 451 case FS_FFS: 452 break; 453 case MUFS_OFS: 454 affs_set_opt(sbi->s_flags, SF_MUFS); 455 fallthrough; 456 case FS_OFS: 457 affs_set_opt(sbi->s_flags, SF_OFS); 458 sb->s_flags |= SB_NOEXEC; 459 break; 460 case MUFS_DCOFS: 461 case MUFS_INTLOFS: 462 affs_set_opt(sbi->s_flags, SF_MUFS); 463 fallthrough; 464 case FS_DCOFS: 465 case FS_INTLOFS: 466 affs_set_opt(sbi->s_flags, SF_INTL); 467 affs_set_opt(sbi->s_flags, SF_OFS); 468 sb->s_flags |= SB_NOEXEC; 469 break; 470 default: 471 pr_err("Unknown filesystem on device %s: %08X\n", 472 sb->s_id, chksum); 473 return -EINVAL; 474 } 475 476 if (affs_test_opt(ctx->mount_flags, SF_VERBOSE)) { 477 u8 len = AFFS_ROOT_TAIL(sb, root_bh)->disk_name[0]; 478 pr_notice("Mounting volume \"%.*s\": Type=%.3s\\%c, Blocksize=%d\n", 479 len > 31 ? 31 : len, 480 AFFS_ROOT_TAIL(sb, root_bh)->disk_name + 1, 481 sig, sig[3] + '0', blocksize); 482 } 483 484 sb->s_flags |= SB_NODEV | SB_NOSUID; 485 486 sbi->s_data_blksize = sb->s_blocksize; 487 if (affs_test_opt(sbi->s_flags, SF_OFS)) 488 sbi->s_data_blksize -= 24; 489 490 tmp_flags = sb->s_flags; 491 ret = affs_init_bitmap(sb, &tmp_flags); 492 if (ret) 493 return ret; 494 sb->s_flags = tmp_flags; 495 496 /* set up enough so that it can read an inode */ 497 498 root_inode = affs_iget(sb, ctx->root_block); 499 if (IS_ERR(root_inode)) 500 return PTR_ERR(root_inode); 501 502 if (affs_test_opt(AFFS_SB(sb)->s_flags, SF_INTL)) 503 sb->s_d_op = &affs_intl_dentry_operations; 504 else 505 sb->s_d_op = &affs_dentry_operations; 506 507 sb->s_root = d_make_root(root_inode); 508 if (!sb->s_root) { 509 pr_err("AFFS: Get root inode failed\n"); 510 return -ENOMEM; 511 } 512 513 sb->s_export_op = &affs_export_ops; 514 pr_debug("s_flags=%lX\n", sb->s_flags); 515 return 0; 516 } 517 518 static int affs_reconfigure(struct fs_context *fc) 519 { 520 struct super_block *sb = fc->root->d_sb; 521 struct affs_context *ctx = fc->fs_private; 522 struct affs_sb_info *sbi = AFFS_SB(sb); 523 int res = 0; 524 525 sync_filesystem(sb); 526 fc->sb_flags |= SB_NODIRATIME; 527 528 flush_delayed_work(&sbi->sb_work); 529 530 /* 531 * NB: Historically, only mount_flags, mode, uid, gic, prefix, 532 * and volume are accepted during remount. 533 */ 534 sbi->s_flags = ctx->mount_flags; 535 sbi->s_mode = ctx->mode; 536 sbi->s_uid = ctx->uid; 537 sbi->s_gid = ctx->gid; 538 /* protect against readers */ 539 spin_lock(&sbi->symlink_lock); 540 if (ctx->prefix) { 541 kfree(sbi->s_prefix); 542 sbi->s_prefix = ctx->prefix; 543 ctx->prefix = NULL; 544 } 545 memcpy(sbi->s_volume, ctx->volume, 32); 546 spin_unlock(&sbi->symlink_lock); 547 548 if ((bool)(fc->sb_flags & SB_RDONLY) == sb_rdonly(sb)) 549 return 0; 550 551 if (fc->sb_flags & SB_RDONLY) 552 affs_free_bitmap(sb); 553 else 554 res = affs_init_bitmap(sb, &fc->sb_flags); 555 556 return res; 557 } 558 559 static int 560 affs_statfs(struct dentry *dentry, struct kstatfs *buf) 561 { 562 struct super_block *sb = dentry->d_sb; 563 int free; 564 u64 id = huge_encode_dev(sb->s_bdev->bd_dev); 565 566 pr_debug("%s() partsize=%d, reserved=%d\n", 567 __func__, AFFS_SB(sb)->s_partition_size, 568 AFFS_SB(sb)->s_reserved); 569 570 free = affs_count_free_blocks(sb); 571 buf->f_type = AFFS_SUPER_MAGIC; 572 buf->f_bsize = sb->s_blocksize; 573 buf->f_blocks = AFFS_SB(sb)->s_partition_size - AFFS_SB(sb)->s_reserved; 574 buf->f_bfree = free; 575 buf->f_bavail = free; 576 buf->f_fsid = u64_to_fsid(id); 577 buf->f_namelen = AFFSNAMEMAX; 578 return 0; 579 } 580 581 static int affs_get_tree(struct fs_context *fc) 582 { 583 return get_tree_bdev(fc, affs_fill_super); 584 } 585 586 static void affs_kill_sb(struct super_block *sb) 587 { 588 struct affs_sb_info *sbi = AFFS_SB(sb); 589 kill_block_super(sb); 590 if (sbi) { 591 affs_free_bitmap(sb); 592 affs_brelse(sbi->s_root_bh); 593 kfree(sbi->s_prefix); 594 mutex_destroy(&sbi->s_bmlock); 595 kfree_rcu(sbi, rcu); 596 } 597 } 598 599 static void affs_free_fc(struct fs_context *fc) 600 { 601 struct affs_context *ctx = fc->fs_private; 602 603 kfree(ctx->prefix); 604 kfree(ctx); 605 } 606 607 static const struct fs_context_operations affs_context_ops = { 608 .parse_param = affs_parse_param, 609 .get_tree = affs_get_tree, 610 .reconfigure = affs_reconfigure, 611 .free = affs_free_fc, 612 }; 613 614 static int affs_init_fs_context(struct fs_context *fc) 615 { 616 struct affs_context *ctx; 617 618 ctx = kzalloc(sizeof(struct affs_context), GFP_KERNEL); 619 if (!ctx) 620 return -ENOMEM; 621 622 if (fc->purpose == FS_CONTEXT_FOR_RECONFIGURE) { 623 struct super_block *sb = fc->root->d_sb; 624 struct affs_sb_info *sbi = AFFS_SB(sb); 625 626 /* 627 * NB: historically, no options other than volume were 628 * preserved across a remount unless they were explicitly 629 * passed in. 630 */ 631 memcpy(ctx->volume, sbi->s_volume, 32); 632 } else { 633 ctx->uid = current_uid(); 634 ctx->gid = current_gid(); 635 ctx->reserved = 2; 636 ctx->root_block = -1; 637 ctx->blocksize = -1; 638 ctx->volume[0] = ':'; 639 } 640 641 fc->ops = &affs_context_ops; 642 fc->fs_private = ctx; 643 644 return 0; 645 } 646 647 static struct file_system_type affs_fs_type = { 648 .owner = THIS_MODULE, 649 .name = "affs", 650 .kill_sb = affs_kill_sb, 651 .fs_flags = FS_REQUIRES_DEV, 652 .init_fs_context = affs_init_fs_context, 653 .parameters = affs_param_spec, 654 }; 655 MODULE_ALIAS_FS("affs"); 656 657 static int __init init_affs_fs(void) 658 { 659 int err = init_inodecache(); 660 if (err) 661 goto out1; 662 err = register_filesystem(&affs_fs_type); 663 if (err) 664 goto out; 665 return 0; 666 out: 667 destroy_inodecache(); 668 out1: 669 return err; 670 } 671 672 static void __exit exit_affs_fs(void) 673 { 674 unregister_filesystem(&affs_fs_type); 675 destroy_inodecache(); 676 } 677 678 MODULE_DESCRIPTION("Amiga filesystem support for Linux"); 679 MODULE_LICENSE("GPL"); 680 681 module_init(init_affs_fs) 682 module_exit(exit_affs_fs) 683