0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include <linux/module.h>
0028 #include <linux/string.h>
0029 #include <linux/slab.h>
0030 #include <linux/init.h>
0031 #include <linux/blkdev.h>
0032 #include <linux/parser.h>
0033 #include <linux/crc32.h>
0034 #include <linux/vfs.h>
0035 #include <linux/writeback.h>
0036 #include <linux/seq_file.h>
0037 #include <linux/mount.h>
0038 #include "nilfs.h"
0039 #include "export.h"
0040 #include "mdt.h"
0041 #include "alloc.h"
0042 #include "btree.h"
0043 #include "btnode.h"
0044 #include "page.h"
0045 #include "cpfile.h"
0046 #include "sufile.h" /* nilfs_sufile_resize(), nilfs_sufile_set_alloc_range() */
0047 #include "ifile.h"
0048 #include "dat.h"
0049 #include "segment.h"
0050 #include "segbuf.h"
0051
0052 MODULE_AUTHOR("NTT Corp.");
0053 MODULE_DESCRIPTION("A New Implementation of the Log-structured Filesystem "
0054 "(NILFS)");
0055 MODULE_LICENSE("GPL");
0056
0057 static struct kmem_cache *nilfs_inode_cachep;
0058 struct kmem_cache *nilfs_transaction_cachep;
0059 struct kmem_cache *nilfs_segbuf_cachep;
0060 struct kmem_cache *nilfs_btree_path_cache;
0061
0062 static int nilfs_setup_super(struct super_block *sb, int is_mount);
0063 static int nilfs_remount(struct super_block *sb, int *flags, char *data);
0064
0065 void __nilfs_msg(struct super_block *sb, const char *fmt, ...)
0066 {
0067 struct va_format vaf;
0068 va_list args;
0069 int level;
0070
0071 va_start(args, fmt);
0072
0073 level = printk_get_level(fmt);
0074 vaf.fmt = printk_skip_level(fmt);
0075 vaf.va = &args;
0076
0077 if (sb)
0078 printk("%c%cNILFS (%s): %pV\n",
0079 KERN_SOH_ASCII, level, sb->s_id, &vaf);
0080 else
0081 printk("%c%cNILFS: %pV\n",
0082 KERN_SOH_ASCII, level, &vaf);
0083
0084 va_end(args);
0085 }
0086
0087 static void nilfs_set_error(struct super_block *sb)
0088 {
0089 struct the_nilfs *nilfs = sb->s_fs_info;
0090 struct nilfs_super_block **sbp;
0091
0092 down_write(&nilfs->ns_sem);
0093 if (!(nilfs->ns_mount_state & NILFS_ERROR_FS)) {
0094 nilfs->ns_mount_state |= NILFS_ERROR_FS;
0095 sbp = nilfs_prepare_super(sb, 0);
0096 if (likely(sbp)) {
0097 sbp[0]->s_state |= cpu_to_le16(NILFS_ERROR_FS);
0098 if (sbp[1])
0099 sbp[1]->s_state |= cpu_to_le16(NILFS_ERROR_FS);
0100 nilfs_commit_super(sb, NILFS_SB_COMMIT_ALL);
0101 }
0102 }
0103 up_write(&nilfs->ns_sem);
0104 }
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119 void __nilfs_error(struct super_block *sb, const char *function,
0120 const char *fmt, ...)
0121 {
0122 struct the_nilfs *nilfs = sb->s_fs_info;
0123 struct va_format vaf;
0124 va_list args;
0125
0126 va_start(args, fmt);
0127
0128 vaf.fmt = fmt;
0129 vaf.va = &args;
0130
0131 printk(KERN_CRIT "NILFS error (device %s): %s: %pV\n",
0132 sb->s_id, function, &vaf);
0133
0134 va_end(args);
0135
0136 if (!sb_rdonly(sb)) {
0137 nilfs_set_error(sb);
0138
0139 if (nilfs_test_opt(nilfs, ERRORS_RO)) {
0140 printk(KERN_CRIT "Remounting filesystem read-only\n");
0141 sb->s_flags |= SB_RDONLY;
0142 }
0143 }
0144
0145 if (nilfs_test_opt(nilfs, ERRORS_PANIC))
0146 panic("NILFS (device %s): panic forced after error\n",
0147 sb->s_id);
0148 }
0149
0150 struct inode *nilfs_alloc_inode(struct super_block *sb)
0151 {
0152 struct nilfs_inode_info *ii;
0153
0154 ii = alloc_inode_sb(sb, nilfs_inode_cachep, GFP_NOFS);
0155 if (!ii)
0156 return NULL;
0157 ii->i_bh = NULL;
0158 ii->i_state = 0;
0159 ii->i_cno = 0;
0160 ii->i_assoc_inode = NULL;
0161 ii->i_bmap = &ii->i_bmap_data;
0162 return &ii->vfs_inode;
0163 }
0164
0165 static void nilfs_free_inode(struct inode *inode)
0166 {
0167 if (nilfs_is_metadata_file_inode(inode))
0168 nilfs_mdt_destroy(inode);
0169
0170 kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode));
0171 }
0172
0173 static int nilfs_sync_super(struct super_block *sb, int flag)
0174 {
0175 struct the_nilfs *nilfs = sb->s_fs_info;
0176 int err;
0177
0178 retry:
0179 set_buffer_dirty(nilfs->ns_sbh[0]);
0180 if (nilfs_test_opt(nilfs, BARRIER)) {
0181 err = __sync_dirty_buffer(nilfs->ns_sbh[0],
0182 REQ_SYNC | REQ_PREFLUSH | REQ_FUA);
0183 } else {
0184 err = sync_dirty_buffer(nilfs->ns_sbh[0]);
0185 }
0186
0187 if (unlikely(err)) {
0188 nilfs_err(sb, "unable to write superblock: err=%d", err);
0189 if (err == -EIO && nilfs->ns_sbh[1]) {
0190
0191
0192
0193
0194 memcpy(nilfs->ns_sbp[1], nilfs->ns_sbp[0],
0195 nilfs->ns_sbsize);
0196 nilfs_fall_back_super_block(nilfs);
0197 goto retry;
0198 }
0199 } else {
0200 struct nilfs_super_block *sbp = nilfs->ns_sbp[0];
0201
0202 nilfs->ns_sbwcount++;
0203
0204
0205
0206
0207
0208 clear_nilfs_discontinued(nilfs);
0209
0210
0211 if (nilfs->ns_sbh[1]) {
0212 if (flag == NILFS_SB_COMMIT_ALL) {
0213 set_buffer_dirty(nilfs->ns_sbh[1]);
0214 if (sync_dirty_buffer(nilfs->ns_sbh[1]) < 0)
0215 goto out;
0216 }
0217 if (le64_to_cpu(nilfs->ns_sbp[1]->s_last_cno) <
0218 le64_to_cpu(nilfs->ns_sbp[0]->s_last_cno))
0219 sbp = nilfs->ns_sbp[1];
0220 }
0221
0222 spin_lock(&nilfs->ns_last_segment_lock);
0223 nilfs->ns_prot_seq = le64_to_cpu(sbp->s_last_seq);
0224 spin_unlock(&nilfs->ns_last_segment_lock);
0225 }
0226 out:
0227 return err;
0228 }
0229
0230 void nilfs_set_log_cursor(struct nilfs_super_block *sbp,
0231 struct the_nilfs *nilfs)
0232 {
0233 sector_t nfreeblocks;
0234
0235
0236 nilfs_count_free_blocks(nilfs, &nfreeblocks);
0237 sbp->s_free_blocks_count = cpu_to_le64(nfreeblocks);
0238
0239 spin_lock(&nilfs->ns_last_segment_lock);
0240 sbp->s_last_seq = cpu_to_le64(nilfs->ns_last_seq);
0241 sbp->s_last_pseg = cpu_to_le64(nilfs->ns_last_pseg);
0242 sbp->s_last_cno = cpu_to_le64(nilfs->ns_last_cno);
0243 spin_unlock(&nilfs->ns_last_segment_lock);
0244 }
0245
0246 struct nilfs_super_block **nilfs_prepare_super(struct super_block *sb,
0247 int flip)
0248 {
0249 struct the_nilfs *nilfs = sb->s_fs_info;
0250 struct nilfs_super_block **sbp = nilfs->ns_sbp;
0251
0252
0253 if (sbp[0]->s_magic != cpu_to_le16(NILFS_SUPER_MAGIC)) {
0254 if (sbp[1] &&
0255 sbp[1]->s_magic == cpu_to_le16(NILFS_SUPER_MAGIC)) {
0256 memcpy(sbp[0], sbp[1], nilfs->ns_sbsize);
0257 } else {
0258 nilfs_crit(sb, "superblock broke");
0259 return NULL;
0260 }
0261 } else if (sbp[1] &&
0262 sbp[1]->s_magic != cpu_to_le16(NILFS_SUPER_MAGIC)) {
0263 memcpy(sbp[1], sbp[0], nilfs->ns_sbsize);
0264 }
0265
0266 if (flip && sbp[1])
0267 nilfs_swap_super_block(nilfs);
0268
0269 return sbp;
0270 }
0271
0272 int nilfs_commit_super(struct super_block *sb, int flag)
0273 {
0274 struct the_nilfs *nilfs = sb->s_fs_info;
0275 struct nilfs_super_block **sbp = nilfs->ns_sbp;
0276 time64_t t;
0277
0278
0279 t = ktime_get_real_seconds();
0280 nilfs->ns_sbwtime = t;
0281 sbp[0]->s_wtime = cpu_to_le64(t);
0282 sbp[0]->s_sum = 0;
0283 sbp[0]->s_sum = cpu_to_le32(crc32_le(nilfs->ns_crc_seed,
0284 (unsigned char *)sbp[0],
0285 nilfs->ns_sbsize));
0286 if (flag == NILFS_SB_COMMIT_ALL && sbp[1]) {
0287 sbp[1]->s_wtime = sbp[0]->s_wtime;
0288 sbp[1]->s_sum = 0;
0289 sbp[1]->s_sum = cpu_to_le32(crc32_le(nilfs->ns_crc_seed,
0290 (unsigned char *)sbp[1],
0291 nilfs->ns_sbsize));
0292 }
0293 clear_nilfs_sb_dirty(nilfs);
0294 nilfs->ns_flushed_device = 1;
0295
0296 smp_wmb();
0297 return nilfs_sync_super(sb, flag);
0298 }
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308 int nilfs_cleanup_super(struct super_block *sb)
0309 {
0310 struct the_nilfs *nilfs = sb->s_fs_info;
0311 struct nilfs_super_block **sbp;
0312 int flag = NILFS_SB_COMMIT;
0313 int ret = -EIO;
0314
0315 sbp = nilfs_prepare_super(sb, 0);
0316 if (sbp) {
0317 sbp[0]->s_state = cpu_to_le16(nilfs->ns_mount_state);
0318 nilfs_set_log_cursor(sbp[0], nilfs);
0319 if (sbp[1] && sbp[0]->s_last_cno == sbp[1]->s_last_cno) {
0320
0321
0322
0323
0324
0325 sbp[1]->s_state = sbp[0]->s_state;
0326 flag = NILFS_SB_COMMIT_ALL;
0327 }
0328 ret = nilfs_commit_super(sb, flag);
0329 }
0330 return ret;
0331 }
0332
0333
0334
0335
0336
0337
0338 static int nilfs_move_2nd_super(struct super_block *sb, loff_t sb2off)
0339 {
0340 struct the_nilfs *nilfs = sb->s_fs_info;
0341 struct buffer_head *nsbh;
0342 struct nilfs_super_block *nsbp;
0343 sector_t blocknr, newblocknr;
0344 unsigned long offset;
0345 int sb2i;
0346 int ret = 0;
0347
0348
0349 if (nilfs->ns_sbh[1] &&
0350 nilfs->ns_sbh[1]->b_blocknr > nilfs->ns_first_data_block) {
0351 sb2i = 1;
0352 blocknr = nilfs->ns_sbh[1]->b_blocknr;
0353 } else if (nilfs->ns_sbh[0]->b_blocknr > nilfs->ns_first_data_block) {
0354 sb2i = 0;
0355 blocknr = nilfs->ns_sbh[0]->b_blocknr;
0356 } else {
0357 sb2i = -1;
0358 blocknr = 0;
0359 }
0360 if (sb2i >= 0 && (u64)blocknr << nilfs->ns_blocksize_bits == sb2off)
0361 goto out;
0362
0363
0364 newblocknr = sb2off >> nilfs->ns_blocksize_bits;
0365 offset = sb2off & (nilfs->ns_blocksize - 1);
0366 nsbh = sb_getblk(sb, newblocknr);
0367 if (!nsbh) {
0368 nilfs_warn(sb,
0369 "unable to move secondary superblock to block %llu",
0370 (unsigned long long)newblocknr);
0371 ret = -EIO;
0372 goto out;
0373 }
0374 nsbp = (void *)nsbh->b_data + offset;
0375 memset(nsbp, 0, nilfs->ns_blocksize);
0376
0377 if (sb2i >= 0) {
0378 memcpy(nsbp, nilfs->ns_sbp[sb2i], nilfs->ns_sbsize);
0379 brelse(nilfs->ns_sbh[sb2i]);
0380 nilfs->ns_sbh[sb2i] = nsbh;
0381 nilfs->ns_sbp[sb2i] = nsbp;
0382 } else if (nilfs->ns_sbh[0]->b_blocknr < nilfs->ns_first_data_block) {
0383
0384 nilfs->ns_sbh[1] = nsbh;
0385 nilfs->ns_sbp[1] = nsbp;
0386 } else {
0387 brelse(nsbh);
0388 }
0389 out:
0390 return ret;
0391 }
0392
0393
0394
0395
0396
0397
0398 int nilfs_resize_fs(struct super_block *sb, __u64 newsize)
0399 {
0400 struct the_nilfs *nilfs = sb->s_fs_info;
0401 struct nilfs_super_block **sbp;
0402 __u64 devsize, newnsegs;
0403 loff_t sb2off;
0404 int ret;
0405
0406 ret = -ERANGE;
0407 devsize = bdev_nr_bytes(sb->s_bdev);
0408 if (newsize > devsize)
0409 goto out;
0410
0411
0412
0413
0414
0415
0416 down_write(&nilfs->ns_segctor_sem);
0417
0418 sb2off = NILFS_SB2_OFFSET_BYTES(newsize);
0419 newnsegs = sb2off >> nilfs->ns_blocksize_bits;
0420 do_div(newnsegs, nilfs->ns_blocks_per_segment);
0421
0422 ret = nilfs_sufile_resize(nilfs->ns_sufile, newnsegs);
0423 up_write(&nilfs->ns_segctor_sem);
0424 if (ret < 0)
0425 goto out;
0426
0427 ret = nilfs_construct_segment(sb);
0428 if (ret < 0)
0429 goto out;
0430
0431 down_write(&nilfs->ns_sem);
0432 nilfs_move_2nd_super(sb, sb2off);
0433 ret = -EIO;
0434 sbp = nilfs_prepare_super(sb, 0);
0435 if (likely(sbp)) {
0436 nilfs_set_log_cursor(sbp[0], nilfs);
0437
0438
0439
0440
0441
0442 sbp[0]->s_state = cpu_to_le16(le16_to_cpu(sbp[0]->s_state) &
0443 ~NILFS_RESIZE_FS);
0444 sbp[0]->s_dev_size = cpu_to_le64(newsize);
0445 sbp[0]->s_nsegments = cpu_to_le64(nilfs->ns_nsegments);
0446 if (sbp[1])
0447 memcpy(sbp[1], sbp[0], nilfs->ns_sbsize);
0448 ret = nilfs_commit_super(sb, NILFS_SB_COMMIT_ALL);
0449 }
0450 up_write(&nilfs->ns_sem);
0451
0452
0453
0454
0455
0456
0457
0458 if (!ret)
0459 nilfs_sufile_set_alloc_range(nilfs->ns_sufile, 0, newnsegs - 1);
0460 out:
0461 return ret;
0462 }
0463
0464 static void nilfs_put_super(struct super_block *sb)
0465 {
0466 struct the_nilfs *nilfs = sb->s_fs_info;
0467
0468 nilfs_detach_log_writer(sb);
0469
0470 if (!sb_rdonly(sb)) {
0471 down_write(&nilfs->ns_sem);
0472 nilfs_cleanup_super(sb);
0473 up_write(&nilfs->ns_sem);
0474 }
0475
0476 iput(nilfs->ns_sufile);
0477 iput(nilfs->ns_cpfile);
0478 iput(nilfs->ns_dat);
0479
0480 destroy_nilfs(nilfs);
0481 sb->s_fs_info = NULL;
0482 }
0483
0484 static int nilfs_sync_fs(struct super_block *sb, int wait)
0485 {
0486 struct the_nilfs *nilfs = sb->s_fs_info;
0487 struct nilfs_super_block **sbp;
0488 int err = 0;
0489
0490
0491 if (wait)
0492 err = nilfs_construct_segment(sb);
0493
0494 down_write(&nilfs->ns_sem);
0495 if (nilfs_sb_dirty(nilfs)) {
0496 sbp = nilfs_prepare_super(sb, nilfs_sb_will_flip(nilfs));
0497 if (likely(sbp)) {
0498 nilfs_set_log_cursor(sbp[0], nilfs);
0499 nilfs_commit_super(sb, NILFS_SB_COMMIT);
0500 }
0501 }
0502 up_write(&nilfs->ns_sem);
0503
0504 if (!err)
0505 err = nilfs_flush_device(nilfs);
0506
0507 return err;
0508 }
0509
0510 int nilfs_attach_checkpoint(struct super_block *sb, __u64 cno, int curr_mnt,
0511 struct nilfs_root **rootp)
0512 {
0513 struct the_nilfs *nilfs = sb->s_fs_info;
0514 struct nilfs_root *root;
0515 struct nilfs_checkpoint *raw_cp;
0516 struct buffer_head *bh_cp;
0517 int err = -ENOMEM;
0518
0519 root = nilfs_find_or_create_root(
0520 nilfs, curr_mnt ? NILFS_CPTREE_CURRENT_CNO : cno);
0521 if (!root)
0522 return err;
0523
0524 if (root->ifile)
0525 goto reuse;
0526
0527 down_read(&nilfs->ns_segctor_sem);
0528 err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, cno, 0, &raw_cp,
0529 &bh_cp);
0530 up_read(&nilfs->ns_segctor_sem);
0531 if (unlikely(err)) {
0532 if (err == -ENOENT || err == -EINVAL) {
0533 nilfs_err(sb,
0534 "Invalid checkpoint (checkpoint number=%llu)",
0535 (unsigned long long)cno);
0536 err = -EINVAL;
0537 }
0538 goto failed;
0539 }
0540
0541 err = nilfs_ifile_read(sb, root, nilfs->ns_inode_size,
0542 &raw_cp->cp_ifile_inode, &root->ifile);
0543 if (err)
0544 goto failed_bh;
0545
0546 atomic64_set(&root->inodes_count,
0547 le64_to_cpu(raw_cp->cp_inodes_count));
0548 atomic64_set(&root->blocks_count,
0549 le64_to_cpu(raw_cp->cp_blocks_count));
0550
0551 nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp);
0552
0553 reuse:
0554 *rootp = root;
0555 return 0;
0556
0557 failed_bh:
0558 nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp);
0559 failed:
0560 nilfs_put_root(root);
0561
0562 return err;
0563 }
0564
0565 static int nilfs_freeze(struct super_block *sb)
0566 {
0567 struct the_nilfs *nilfs = sb->s_fs_info;
0568 int err;
0569
0570 if (sb_rdonly(sb))
0571 return 0;
0572
0573
0574 down_write(&nilfs->ns_sem);
0575 err = nilfs_cleanup_super(sb);
0576 up_write(&nilfs->ns_sem);
0577 return err;
0578 }
0579
0580 static int nilfs_unfreeze(struct super_block *sb)
0581 {
0582 struct the_nilfs *nilfs = sb->s_fs_info;
0583
0584 if (sb_rdonly(sb))
0585 return 0;
0586
0587 down_write(&nilfs->ns_sem);
0588 nilfs_setup_super(sb, false);
0589 up_write(&nilfs->ns_sem);
0590 return 0;
0591 }
0592
0593 static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf)
0594 {
0595 struct super_block *sb = dentry->d_sb;
0596 struct nilfs_root *root = NILFS_I(d_inode(dentry))->i_root;
0597 struct the_nilfs *nilfs = root->nilfs;
0598 u64 id = huge_encode_dev(sb->s_bdev->bd_dev);
0599 unsigned long long blocks;
0600 unsigned long overhead;
0601 unsigned long nrsvblocks;
0602 sector_t nfreeblocks;
0603 u64 nmaxinodes, nfreeinodes;
0604 int err;
0605
0606
0607
0608
0609
0610
0611
0612 blocks = nilfs->ns_blocks_per_segment * nilfs->ns_nsegments
0613 - nilfs->ns_first_data_block;
0614 nrsvblocks = nilfs->ns_nrsvsegs * nilfs->ns_blocks_per_segment;
0615
0616
0617
0618
0619
0620
0621
0622 overhead = 0;
0623
0624 err = nilfs_count_free_blocks(nilfs, &nfreeblocks);
0625 if (unlikely(err))
0626 return err;
0627
0628 err = nilfs_ifile_count_free_inodes(root->ifile,
0629 &nmaxinodes, &nfreeinodes);
0630 if (unlikely(err)) {
0631 nilfs_warn(sb, "failed to count free inodes: err=%d", err);
0632 if (err == -ERANGE) {
0633
0634
0635
0636
0637
0638
0639 nmaxinodes = atomic64_read(&root->inodes_count);
0640 nfreeinodes = 0;
0641 err = 0;
0642 } else
0643 return err;
0644 }
0645
0646 buf->f_type = NILFS_SUPER_MAGIC;
0647 buf->f_bsize = sb->s_blocksize;
0648 buf->f_blocks = blocks - overhead;
0649 buf->f_bfree = nfreeblocks;
0650 buf->f_bavail = (buf->f_bfree >= nrsvblocks) ?
0651 (buf->f_bfree - nrsvblocks) : 0;
0652 buf->f_files = nmaxinodes;
0653 buf->f_ffree = nfreeinodes;
0654 buf->f_namelen = NILFS_NAME_LEN;
0655 buf->f_fsid = u64_to_fsid(id);
0656
0657 return 0;
0658 }
0659
0660 static int nilfs_show_options(struct seq_file *seq, struct dentry *dentry)
0661 {
0662 struct super_block *sb = dentry->d_sb;
0663 struct the_nilfs *nilfs = sb->s_fs_info;
0664 struct nilfs_root *root = NILFS_I(d_inode(dentry))->i_root;
0665
0666 if (!nilfs_test_opt(nilfs, BARRIER))
0667 seq_puts(seq, ",nobarrier");
0668 if (root->cno != NILFS_CPTREE_CURRENT_CNO)
0669 seq_printf(seq, ",cp=%llu", (unsigned long long)root->cno);
0670 if (nilfs_test_opt(nilfs, ERRORS_PANIC))
0671 seq_puts(seq, ",errors=panic");
0672 if (nilfs_test_opt(nilfs, ERRORS_CONT))
0673 seq_puts(seq, ",errors=continue");
0674 if (nilfs_test_opt(nilfs, STRICT_ORDER))
0675 seq_puts(seq, ",order=strict");
0676 if (nilfs_test_opt(nilfs, NORECOVERY))
0677 seq_puts(seq, ",norecovery");
0678 if (nilfs_test_opt(nilfs, DISCARD))
0679 seq_puts(seq, ",discard");
0680
0681 return 0;
0682 }
0683
0684 static const struct super_operations nilfs_sops = {
0685 .alloc_inode = nilfs_alloc_inode,
0686 .free_inode = nilfs_free_inode,
0687 .dirty_inode = nilfs_dirty_inode,
0688 .evict_inode = nilfs_evict_inode,
0689 .put_super = nilfs_put_super,
0690 .sync_fs = nilfs_sync_fs,
0691 .freeze_fs = nilfs_freeze,
0692 .unfreeze_fs = nilfs_unfreeze,
0693 .statfs = nilfs_statfs,
0694 .remount_fs = nilfs_remount,
0695 .show_options = nilfs_show_options
0696 };
0697
0698 enum {
0699 Opt_err_cont, Opt_err_panic, Opt_err_ro,
0700 Opt_barrier, Opt_nobarrier, Opt_snapshot, Opt_order, Opt_norecovery,
0701 Opt_discard, Opt_nodiscard, Opt_err,
0702 };
0703
0704 static match_table_t tokens = {
0705 {Opt_err_cont, "errors=continue"},
0706 {Opt_err_panic, "errors=panic"},
0707 {Opt_err_ro, "errors=remount-ro"},
0708 {Opt_barrier, "barrier"},
0709 {Opt_nobarrier, "nobarrier"},
0710 {Opt_snapshot, "cp=%u"},
0711 {Opt_order, "order=%s"},
0712 {Opt_norecovery, "norecovery"},
0713 {Opt_discard, "discard"},
0714 {Opt_nodiscard, "nodiscard"},
0715 {Opt_err, NULL}
0716 };
0717
0718 static int parse_options(char *options, struct super_block *sb, int is_remount)
0719 {
0720 struct the_nilfs *nilfs = sb->s_fs_info;
0721 char *p;
0722 substring_t args[MAX_OPT_ARGS];
0723
0724 if (!options)
0725 return 1;
0726
0727 while ((p = strsep(&options, ",")) != NULL) {
0728 int token;
0729
0730 if (!*p)
0731 continue;
0732
0733 token = match_token(p, tokens, args);
0734 switch (token) {
0735 case Opt_barrier:
0736 nilfs_set_opt(nilfs, BARRIER);
0737 break;
0738 case Opt_nobarrier:
0739 nilfs_clear_opt(nilfs, BARRIER);
0740 break;
0741 case Opt_order:
0742 if (strcmp(args[0].from, "relaxed") == 0)
0743
0744 nilfs_clear_opt(nilfs, STRICT_ORDER);
0745 else if (strcmp(args[0].from, "strict") == 0)
0746
0747 nilfs_set_opt(nilfs, STRICT_ORDER);
0748 else
0749 return 0;
0750 break;
0751 case Opt_err_panic:
0752 nilfs_write_opt(nilfs, ERROR_MODE, ERRORS_PANIC);
0753 break;
0754 case Opt_err_ro:
0755 nilfs_write_opt(nilfs, ERROR_MODE, ERRORS_RO);
0756 break;
0757 case Opt_err_cont:
0758 nilfs_write_opt(nilfs, ERROR_MODE, ERRORS_CONT);
0759 break;
0760 case Opt_snapshot:
0761 if (is_remount) {
0762 nilfs_err(sb,
0763 "\"%s\" option is invalid for remount",
0764 p);
0765 return 0;
0766 }
0767 break;
0768 case Opt_norecovery:
0769 nilfs_set_opt(nilfs, NORECOVERY);
0770 break;
0771 case Opt_discard:
0772 nilfs_set_opt(nilfs, DISCARD);
0773 break;
0774 case Opt_nodiscard:
0775 nilfs_clear_opt(nilfs, DISCARD);
0776 break;
0777 default:
0778 nilfs_err(sb, "unrecognized mount option \"%s\"", p);
0779 return 0;
0780 }
0781 }
0782 return 1;
0783 }
0784
0785 static inline void
0786 nilfs_set_default_options(struct super_block *sb,
0787 struct nilfs_super_block *sbp)
0788 {
0789 struct the_nilfs *nilfs = sb->s_fs_info;
0790
0791 nilfs->ns_mount_opt =
0792 NILFS_MOUNT_ERRORS_RO | NILFS_MOUNT_BARRIER;
0793 }
0794
0795 static int nilfs_setup_super(struct super_block *sb, int is_mount)
0796 {
0797 struct the_nilfs *nilfs = sb->s_fs_info;
0798 struct nilfs_super_block **sbp;
0799 int max_mnt_count;
0800 int mnt_count;
0801
0802
0803 sbp = nilfs_prepare_super(sb, 0);
0804 if (!sbp)
0805 return -EIO;
0806
0807 if (!is_mount)
0808 goto skip_mount_setup;
0809
0810 max_mnt_count = le16_to_cpu(sbp[0]->s_max_mnt_count);
0811 mnt_count = le16_to_cpu(sbp[0]->s_mnt_count);
0812
0813 if (nilfs->ns_mount_state & NILFS_ERROR_FS) {
0814 nilfs_warn(sb, "mounting fs with errors");
0815 #if 0
0816 } else if (max_mnt_count >= 0 && mnt_count >= max_mnt_count) {
0817 nilfs_warn(sb, "maximal mount count reached");
0818 #endif
0819 }
0820 if (!max_mnt_count)
0821 sbp[0]->s_max_mnt_count = cpu_to_le16(NILFS_DFL_MAX_MNT_COUNT);
0822
0823 sbp[0]->s_mnt_count = cpu_to_le16(mnt_count + 1);
0824 sbp[0]->s_mtime = cpu_to_le64(ktime_get_real_seconds());
0825
0826 skip_mount_setup:
0827 sbp[0]->s_state =
0828 cpu_to_le16(le16_to_cpu(sbp[0]->s_state) & ~NILFS_VALID_FS);
0829
0830 if (sbp[1])
0831 memcpy(sbp[1], sbp[0], nilfs->ns_sbsize);
0832 return nilfs_commit_super(sb, NILFS_SB_COMMIT_ALL);
0833 }
0834
0835 struct nilfs_super_block *nilfs_read_super_block(struct super_block *sb,
0836 u64 pos, int blocksize,
0837 struct buffer_head **pbh)
0838 {
0839 unsigned long long sb_index = pos;
0840 unsigned long offset;
0841
0842 offset = do_div(sb_index, blocksize);
0843 *pbh = sb_bread(sb, sb_index);
0844 if (!*pbh)
0845 return NULL;
0846 return (struct nilfs_super_block *)((char *)(*pbh)->b_data + offset);
0847 }
0848
0849 int nilfs_store_magic_and_option(struct super_block *sb,
0850 struct nilfs_super_block *sbp,
0851 char *data)
0852 {
0853 struct the_nilfs *nilfs = sb->s_fs_info;
0854
0855 sb->s_magic = le16_to_cpu(sbp->s_magic);
0856
0857
0858 #ifdef NILFS_ATIME_DISABLE
0859 sb->s_flags |= SB_NOATIME;
0860 #endif
0861
0862 nilfs_set_default_options(sb, sbp);
0863
0864 nilfs->ns_resuid = le16_to_cpu(sbp->s_def_resuid);
0865 nilfs->ns_resgid = le16_to_cpu(sbp->s_def_resgid);
0866 nilfs->ns_interval = le32_to_cpu(sbp->s_c_interval);
0867 nilfs->ns_watermark = le32_to_cpu(sbp->s_c_block_max);
0868
0869 return !parse_options(data, sb, 0) ? -EINVAL : 0;
0870 }
0871
0872 int nilfs_check_feature_compatibility(struct super_block *sb,
0873 struct nilfs_super_block *sbp)
0874 {
0875 __u64 features;
0876
0877 features = le64_to_cpu(sbp->s_feature_incompat) &
0878 ~NILFS_FEATURE_INCOMPAT_SUPP;
0879 if (features) {
0880 nilfs_err(sb,
0881 "couldn't mount because of unsupported optional features (%llx)",
0882 (unsigned long long)features);
0883 return -EINVAL;
0884 }
0885 features = le64_to_cpu(sbp->s_feature_compat_ro) &
0886 ~NILFS_FEATURE_COMPAT_RO_SUPP;
0887 if (!sb_rdonly(sb) && features) {
0888 nilfs_err(sb,
0889 "couldn't mount RDWR because of unsupported optional features (%llx)",
0890 (unsigned long long)features);
0891 return -EINVAL;
0892 }
0893 return 0;
0894 }
0895
0896 static int nilfs_get_root_dentry(struct super_block *sb,
0897 struct nilfs_root *root,
0898 struct dentry **root_dentry)
0899 {
0900 struct inode *inode;
0901 struct dentry *dentry;
0902 int ret = 0;
0903
0904 inode = nilfs_iget(sb, root, NILFS_ROOT_INO);
0905 if (IS_ERR(inode)) {
0906 ret = PTR_ERR(inode);
0907 nilfs_err(sb, "error %d getting root inode", ret);
0908 goto out;
0909 }
0910 if (!S_ISDIR(inode->i_mode) || !inode->i_blocks || !inode->i_size) {
0911 iput(inode);
0912 nilfs_err(sb, "corrupt root inode");
0913 ret = -EINVAL;
0914 goto out;
0915 }
0916
0917 if (root->cno == NILFS_CPTREE_CURRENT_CNO) {
0918 dentry = d_find_alias(inode);
0919 if (!dentry) {
0920 dentry = d_make_root(inode);
0921 if (!dentry) {
0922 ret = -ENOMEM;
0923 goto failed_dentry;
0924 }
0925 } else {
0926 iput(inode);
0927 }
0928 } else {
0929 dentry = d_obtain_root(inode);
0930 if (IS_ERR(dentry)) {
0931 ret = PTR_ERR(dentry);
0932 goto failed_dentry;
0933 }
0934 }
0935 *root_dentry = dentry;
0936 out:
0937 return ret;
0938
0939 failed_dentry:
0940 nilfs_err(sb, "error %d getting root dentry", ret);
0941 goto out;
0942 }
0943
0944 static int nilfs_attach_snapshot(struct super_block *s, __u64 cno,
0945 struct dentry **root_dentry)
0946 {
0947 struct the_nilfs *nilfs = s->s_fs_info;
0948 struct nilfs_root *root;
0949 int ret;
0950
0951 mutex_lock(&nilfs->ns_snapshot_mount_mutex);
0952
0953 down_read(&nilfs->ns_segctor_sem);
0954 ret = nilfs_cpfile_is_snapshot(nilfs->ns_cpfile, cno);
0955 up_read(&nilfs->ns_segctor_sem);
0956 if (ret < 0) {
0957 ret = (ret == -ENOENT) ? -EINVAL : ret;
0958 goto out;
0959 } else if (!ret) {
0960 nilfs_err(s,
0961 "The specified checkpoint is not a snapshot (checkpoint number=%llu)",
0962 (unsigned long long)cno);
0963 ret = -EINVAL;
0964 goto out;
0965 }
0966
0967 ret = nilfs_attach_checkpoint(s, cno, false, &root);
0968 if (ret) {
0969 nilfs_err(s,
0970 "error %d while loading snapshot (checkpoint number=%llu)",
0971 ret, (unsigned long long)cno);
0972 goto out;
0973 }
0974 ret = nilfs_get_root_dentry(s, root, root_dentry);
0975 nilfs_put_root(root);
0976 out:
0977 mutex_unlock(&nilfs->ns_snapshot_mount_mutex);
0978 return ret;
0979 }
0980
0981
0982
0983
0984
0985
0986
0987 static bool nilfs_tree_is_busy(struct dentry *root_dentry)
0988 {
0989 shrink_dcache_parent(root_dentry);
0990 return d_count(root_dentry) > 1;
0991 }
0992
0993 int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno)
0994 {
0995 struct the_nilfs *nilfs = sb->s_fs_info;
0996 struct nilfs_root *root;
0997 struct inode *inode;
0998 struct dentry *dentry;
0999 int ret;
1000
1001 if (cno > nilfs->ns_cno)
1002 return false;
1003
1004 if (cno >= nilfs_last_cno(nilfs))
1005 return true;
1006
1007 ret = false;
1008 root = nilfs_lookup_root(nilfs, cno);
1009 if (root) {
1010 inode = nilfs_ilookup(sb, root, NILFS_ROOT_INO);
1011 if (inode) {
1012 dentry = d_find_alias(inode);
1013 if (dentry) {
1014 ret = nilfs_tree_is_busy(dentry);
1015 dput(dentry);
1016 }
1017 iput(inode);
1018 }
1019 nilfs_put_root(root);
1020 }
1021 return ret;
1022 }
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033 static int
1034 nilfs_fill_super(struct super_block *sb, void *data, int silent)
1035 {
1036 struct the_nilfs *nilfs;
1037 struct nilfs_root *fsroot;
1038 __u64 cno;
1039 int err;
1040
1041 nilfs = alloc_nilfs(sb);
1042 if (!nilfs)
1043 return -ENOMEM;
1044
1045 sb->s_fs_info = nilfs;
1046
1047 err = init_nilfs(nilfs, sb, (char *)data);
1048 if (err)
1049 goto failed_nilfs;
1050
1051 sb->s_op = &nilfs_sops;
1052 sb->s_export_op = &nilfs_export_ops;
1053 sb->s_root = NULL;
1054 sb->s_time_gran = 1;
1055 sb->s_max_links = NILFS_LINK_MAX;
1056
1057 sb->s_bdi = bdi_get(sb->s_bdev->bd_disk->bdi);
1058
1059 err = load_nilfs(nilfs, sb);
1060 if (err)
1061 goto failed_nilfs;
1062
1063 cno = nilfs_last_cno(nilfs);
1064 err = nilfs_attach_checkpoint(sb, cno, true, &fsroot);
1065 if (err) {
1066 nilfs_err(sb,
1067 "error %d while loading last checkpoint (checkpoint number=%llu)",
1068 err, (unsigned long long)cno);
1069 goto failed_unload;
1070 }
1071
1072 if (!sb_rdonly(sb)) {
1073 err = nilfs_attach_log_writer(sb, fsroot);
1074 if (err)
1075 goto failed_checkpoint;
1076 }
1077
1078 err = nilfs_get_root_dentry(sb, fsroot, &sb->s_root);
1079 if (err)
1080 goto failed_segctor;
1081
1082 nilfs_put_root(fsroot);
1083
1084 if (!sb_rdonly(sb)) {
1085 down_write(&nilfs->ns_sem);
1086 nilfs_setup_super(sb, true);
1087 up_write(&nilfs->ns_sem);
1088 }
1089
1090 return 0;
1091
1092 failed_segctor:
1093 nilfs_detach_log_writer(sb);
1094
1095 failed_checkpoint:
1096 nilfs_put_root(fsroot);
1097
1098 failed_unload:
1099 iput(nilfs->ns_sufile);
1100 iput(nilfs->ns_cpfile);
1101 iput(nilfs->ns_dat);
1102
1103 failed_nilfs:
1104 destroy_nilfs(nilfs);
1105 return err;
1106 }
1107
1108 static int nilfs_remount(struct super_block *sb, int *flags, char *data)
1109 {
1110 struct the_nilfs *nilfs = sb->s_fs_info;
1111 unsigned long old_sb_flags;
1112 unsigned long old_mount_opt;
1113 int err;
1114
1115 sync_filesystem(sb);
1116 old_sb_flags = sb->s_flags;
1117 old_mount_opt = nilfs->ns_mount_opt;
1118
1119 if (!parse_options(data, sb, 1)) {
1120 err = -EINVAL;
1121 goto restore_opts;
1122 }
1123 sb->s_flags = (sb->s_flags & ~SB_POSIXACL);
1124
1125 err = -EINVAL;
1126
1127 if (!nilfs_valid_fs(nilfs)) {
1128 nilfs_warn(sb,
1129 "couldn't remount because the filesystem is in an incomplete recovery state");
1130 goto restore_opts;
1131 }
1132
1133 if ((bool)(*flags & SB_RDONLY) == sb_rdonly(sb))
1134 goto out;
1135 if (*flags & SB_RDONLY) {
1136
1137 nilfs_detach_log_writer(sb);
1138 sb->s_flags |= SB_RDONLY;
1139
1140
1141
1142
1143
1144 down_write(&nilfs->ns_sem);
1145 nilfs_cleanup_super(sb);
1146 up_write(&nilfs->ns_sem);
1147 } else {
1148 __u64 features;
1149 struct nilfs_root *root;
1150
1151
1152
1153
1154
1155
1156 down_read(&nilfs->ns_sem);
1157 features = le64_to_cpu(nilfs->ns_sbp[0]->s_feature_compat_ro) &
1158 ~NILFS_FEATURE_COMPAT_RO_SUPP;
1159 up_read(&nilfs->ns_sem);
1160 if (features) {
1161 nilfs_warn(sb,
1162 "couldn't remount RDWR because of unsupported optional features (%llx)",
1163 (unsigned long long)features);
1164 err = -EROFS;
1165 goto restore_opts;
1166 }
1167
1168 sb->s_flags &= ~SB_RDONLY;
1169
1170 root = NILFS_I(d_inode(sb->s_root))->i_root;
1171 err = nilfs_attach_log_writer(sb, root);
1172 if (err)
1173 goto restore_opts;
1174
1175 down_write(&nilfs->ns_sem);
1176 nilfs_setup_super(sb, true);
1177 up_write(&nilfs->ns_sem);
1178 }
1179 out:
1180 return 0;
1181
1182 restore_opts:
1183 sb->s_flags = old_sb_flags;
1184 nilfs->ns_mount_opt = old_mount_opt;
1185 return err;
1186 }
1187
1188 struct nilfs_super_data {
1189 struct block_device *bdev;
1190 __u64 cno;
1191 int flags;
1192 };
1193
1194 static int nilfs_parse_snapshot_option(const char *option,
1195 const substring_t *arg,
1196 struct nilfs_super_data *sd)
1197 {
1198 unsigned long long val;
1199 const char *msg = NULL;
1200 int err;
1201
1202 if (!(sd->flags & SB_RDONLY)) {
1203 msg = "read-only option is not specified";
1204 goto parse_error;
1205 }
1206
1207 err = kstrtoull(arg->from, 0, &val);
1208 if (err) {
1209 if (err == -ERANGE)
1210 msg = "too large checkpoint number";
1211 else
1212 msg = "malformed argument";
1213 goto parse_error;
1214 } else if (val == 0) {
1215 msg = "invalid checkpoint number 0";
1216 goto parse_error;
1217 }
1218 sd->cno = val;
1219 return 0;
1220
1221 parse_error:
1222 nilfs_err(NULL, "invalid option \"%s\": %s", option, msg);
1223 return 1;
1224 }
1225
1226
1227
1228
1229
1230
1231 static int nilfs_identify(char *data, struct nilfs_super_data *sd)
1232 {
1233 char *p, *options = data;
1234 substring_t args[MAX_OPT_ARGS];
1235 int token;
1236 int ret = 0;
1237
1238 do {
1239 p = strsep(&options, ",");
1240 if (p != NULL && *p) {
1241 token = match_token(p, tokens, args);
1242 if (token == Opt_snapshot)
1243 ret = nilfs_parse_snapshot_option(p, &args[0],
1244 sd);
1245 }
1246 if (!options)
1247 break;
1248 BUG_ON(options == data);
1249 *(options - 1) = ',';
1250 } while (!ret);
1251 return ret;
1252 }
1253
1254 static int nilfs_set_bdev_super(struct super_block *s, void *data)
1255 {
1256 s->s_bdev = data;
1257 s->s_dev = s->s_bdev->bd_dev;
1258 return 0;
1259 }
1260
1261 static int nilfs_test_bdev_super(struct super_block *s, void *data)
1262 {
1263 return (void *)s->s_bdev == data;
1264 }
1265
1266 static struct dentry *
1267 nilfs_mount(struct file_system_type *fs_type, int flags,
1268 const char *dev_name, void *data)
1269 {
1270 struct nilfs_super_data sd;
1271 struct super_block *s;
1272 fmode_t mode = FMODE_READ | FMODE_EXCL;
1273 struct dentry *root_dentry;
1274 int err, s_new = false;
1275
1276 if (!(flags & SB_RDONLY))
1277 mode |= FMODE_WRITE;
1278
1279 sd.bdev = blkdev_get_by_path(dev_name, mode, fs_type);
1280 if (IS_ERR(sd.bdev))
1281 return ERR_CAST(sd.bdev);
1282
1283 sd.cno = 0;
1284 sd.flags = flags;
1285 if (nilfs_identify((char *)data, &sd)) {
1286 err = -EINVAL;
1287 goto failed;
1288 }
1289
1290
1291
1292
1293
1294
1295 mutex_lock(&sd.bdev->bd_fsfreeze_mutex);
1296 if (sd.bdev->bd_fsfreeze_count > 0) {
1297 mutex_unlock(&sd.bdev->bd_fsfreeze_mutex);
1298 err = -EBUSY;
1299 goto failed;
1300 }
1301 s = sget(fs_type, nilfs_test_bdev_super, nilfs_set_bdev_super, flags,
1302 sd.bdev);
1303 mutex_unlock(&sd.bdev->bd_fsfreeze_mutex);
1304 if (IS_ERR(s)) {
1305 err = PTR_ERR(s);
1306 goto failed;
1307 }
1308
1309 if (!s->s_root) {
1310 s_new = true;
1311
1312
1313 s->s_mode = mode;
1314 snprintf(s->s_id, sizeof(s->s_id), "%pg", sd.bdev);
1315 sb_set_blocksize(s, block_size(sd.bdev));
1316
1317 err = nilfs_fill_super(s, data, flags & SB_SILENT ? 1 : 0);
1318 if (err)
1319 goto failed_super;
1320
1321 s->s_flags |= SB_ACTIVE;
1322 } else if (!sd.cno) {
1323 if (nilfs_tree_is_busy(s->s_root)) {
1324 if ((flags ^ s->s_flags) & SB_RDONLY) {
1325 nilfs_err(s,
1326 "the device already has a %s mount.",
1327 sb_rdonly(s) ? "read-only" : "read/write");
1328 err = -EBUSY;
1329 goto failed_super;
1330 }
1331 } else {
1332
1333
1334
1335
1336 err = nilfs_remount(s, &flags, data);
1337 if (err)
1338 goto failed_super;
1339 }
1340 }
1341
1342 if (sd.cno) {
1343 err = nilfs_attach_snapshot(s, sd.cno, &root_dentry);
1344 if (err)
1345 goto failed_super;
1346 } else {
1347 root_dentry = dget(s->s_root);
1348 }
1349
1350 if (!s_new)
1351 blkdev_put(sd.bdev, mode);
1352
1353 return root_dentry;
1354
1355 failed_super:
1356 deactivate_locked_super(s);
1357
1358 failed:
1359 if (!s_new)
1360 blkdev_put(sd.bdev, mode);
1361 return ERR_PTR(err);
1362 }
1363
1364 struct file_system_type nilfs_fs_type = {
1365 .owner = THIS_MODULE,
1366 .name = "nilfs2",
1367 .mount = nilfs_mount,
1368 .kill_sb = kill_block_super,
1369 .fs_flags = FS_REQUIRES_DEV,
1370 };
1371 MODULE_ALIAS_FS("nilfs2");
1372
1373 static void nilfs_inode_init_once(void *obj)
1374 {
1375 struct nilfs_inode_info *ii = obj;
1376
1377 INIT_LIST_HEAD(&ii->i_dirty);
1378 #ifdef CONFIG_NILFS_XATTR
1379 init_rwsem(&ii->xattr_sem);
1380 #endif
1381 inode_init_once(&ii->vfs_inode);
1382 }
1383
1384 static void nilfs_segbuf_init_once(void *obj)
1385 {
1386 memset(obj, 0, sizeof(struct nilfs_segment_buffer));
1387 }
1388
1389 static void nilfs_destroy_cachep(void)
1390 {
1391
1392
1393
1394
1395 rcu_barrier();
1396
1397 kmem_cache_destroy(nilfs_inode_cachep);
1398 kmem_cache_destroy(nilfs_transaction_cachep);
1399 kmem_cache_destroy(nilfs_segbuf_cachep);
1400 kmem_cache_destroy(nilfs_btree_path_cache);
1401 }
1402
1403 static int __init nilfs_init_cachep(void)
1404 {
1405 nilfs_inode_cachep = kmem_cache_create("nilfs2_inode_cache",
1406 sizeof(struct nilfs_inode_info), 0,
1407 SLAB_RECLAIM_ACCOUNT|SLAB_ACCOUNT,
1408 nilfs_inode_init_once);
1409 if (!nilfs_inode_cachep)
1410 goto fail;
1411
1412 nilfs_transaction_cachep = kmem_cache_create("nilfs2_transaction_cache",
1413 sizeof(struct nilfs_transaction_info), 0,
1414 SLAB_RECLAIM_ACCOUNT, NULL);
1415 if (!nilfs_transaction_cachep)
1416 goto fail;
1417
1418 nilfs_segbuf_cachep = kmem_cache_create("nilfs2_segbuf_cache",
1419 sizeof(struct nilfs_segment_buffer), 0,
1420 SLAB_RECLAIM_ACCOUNT, nilfs_segbuf_init_once);
1421 if (!nilfs_segbuf_cachep)
1422 goto fail;
1423
1424 nilfs_btree_path_cache = kmem_cache_create("nilfs2_btree_path_cache",
1425 sizeof(struct nilfs_btree_path) * NILFS_BTREE_LEVEL_MAX,
1426 0, 0, NULL);
1427 if (!nilfs_btree_path_cache)
1428 goto fail;
1429
1430 return 0;
1431
1432 fail:
1433 nilfs_destroy_cachep();
1434 return -ENOMEM;
1435 }
1436
1437 static int __init init_nilfs_fs(void)
1438 {
1439 int err;
1440
1441 err = nilfs_init_cachep();
1442 if (err)
1443 goto fail;
1444
1445 err = nilfs_sysfs_init();
1446 if (err)
1447 goto free_cachep;
1448
1449 err = register_filesystem(&nilfs_fs_type);
1450 if (err)
1451 goto deinit_sysfs_entry;
1452
1453 printk(KERN_INFO "NILFS version 2 loaded\n");
1454 return 0;
1455
1456 deinit_sysfs_entry:
1457 nilfs_sysfs_exit();
1458 free_cachep:
1459 nilfs_destroy_cachep();
1460 fail:
1461 return err;
1462 }
1463
1464 static void __exit exit_nilfs_fs(void)
1465 {
1466 nilfs_destroy_cachep();
1467 nilfs_sysfs_exit();
1468 unregister_filesystem(&nilfs_fs_type);
1469 }
1470
1471 module_init(init_nilfs_fs)
1472 module_exit(exit_nilfs_fs)