Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.34-rc2 1193 lines 30 kB view raw
1/* 2 * super.c - NILFS module and super block management. 3 * 4 * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 19 * 20 * Written by Ryusuke Konishi <ryusuke@osrg.net> 21 */ 22/* 23 * linux/fs/ext2/super.c 24 * 25 * Copyright (C) 1992, 1993, 1994, 1995 26 * Remy Card (card@masi.ibp.fr) 27 * Laboratoire MASI - Institut Blaise Pascal 28 * Universite Pierre et Marie Curie (Paris VI) 29 * 30 * from 31 * 32 * linux/fs/minix/inode.c 33 * 34 * Copyright (C) 1991, 1992 Linus Torvalds 35 * 36 * Big-endian to little-endian byte-swapping/bitmaps by 37 * David S. Miller (davem@caip.rutgers.edu), 1995 38 */ 39 40#include <linux/module.h> 41#include <linux/string.h> 42#include <linux/slab.h> 43#include <linux/init.h> 44#include <linux/blkdev.h> 45#include <linux/parser.h> 46#include <linux/random.h> 47#include <linux/crc32.h> 48#include <linux/smp_lock.h> 49#include <linux/vfs.h> 50#include <linux/writeback.h> 51#include <linux/kobject.h> 52#include <linux/exportfs.h> 53#include <linux/seq_file.h> 54#include <linux/mount.h> 55#include "nilfs.h" 56#include "mdt.h" 57#include "alloc.h" 58#include "page.h" 59#include "cpfile.h" 60#include "ifile.h" 61#include "dat.h" 62#include "segment.h" 63#include "segbuf.h" 64 65MODULE_AUTHOR("NTT Corp."); 66MODULE_DESCRIPTION("A New Implementation of the Log-structured Filesystem " 67 "(NILFS)"); 68MODULE_LICENSE("GPL"); 69 70static int nilfs_remount(struct super_block *sb, int *flags, char *data); 71 72/** 73 * nilfs_error() - report failure condition on a filesystem 74 * 75 * nilfs_error() sets an ERROR_FS flag on the superblock as well as 76 * reporting an error message. It should be called when NILFS detects 77 * incoherences or defects of meta data on disk. As for sustainable 78 * errors such as a single-shot I/O error, nilfs_warning() or the printk() 79 * function should be used instead. 80 * 81 * The segment constructor must not call this function because it can 82 * kill itself. 83 */ 84void nilfs_error(struct super_block *sb, const char *function, 85 const char *fmt, ...) 86{ 87 struct nilfs_sb_info *sbi = NILFS_SB(sb); 88 va_list args; 89 90 va_start(args, fmt); 91 printk(KERN_CRIT "NILFS error (device %s): %s: ", sb->s_id, function); 92 vprintk(fmt, args); 93 printk("\n"); 94 va_end(args); 95 96 if (!(sb->s_flags & MS_RDONLY)) { 97 struct the_nilfs *nilfs = sbi->s_nilfs; 98 99 down_write(&nilfs->ns_sem); 100 if (!(nilfs->ns_mount_state & NILFS_ERROR_FS)) { 101 nilfs->ns_mount_state |= NILFS_ERROR_FS; 102 nilfs->ns_sbp[0]->s_state |= 103 cpu_to_le16(NILFS_ERROR_FS); 104 nilfs_commit_super(sbi, 1); 105 } 106 up_write(&nilfs->ns_sem); 107 108 if (nilfs_test_opt(sbi, ERRORS_RO)) { 109 printk(KERN_CRIT "Remounting filesystem read-only\n"); 110 sb->s_flags |= MS_RDONLY; 111 } 112 } 113 114 if (nilfs_test_opt(sbi, ERRORS_PANIC)) 115 panic("NILFS (device %s): panic forced after error\n", 116 sb->s_id); 117} 118 119void nilfs_warning(struct super_block *sb, const char *function, 120 const char *fmt, ...) 121{ 122 va_list args; 123 124 va_start(args, fmt); 125 printk(KERN_WARNING "NILFS warning (device %s): %s: ", 126 sb->s_id, function); 127 vprintk(fmt, args); 128 printk("\n"); 129 va_end(args); 130} 131 132static struct kmem_cache *nilfs_inode_cachep; 133 134struct inode *nilfs_alloc_inode_common(struct the_nilfs *nilfs) 135{ 136 struct nilfs_inode_info *ii; 137 138 ii = kmem_cache_alloc(nilfs_inode_cachep, GFP_NOFS); 139 if (!ii) 140 return NULL; 141 ii->i_bh = NULL; 142 ii->i_state = 0; 143 ii->vfs_inode.i_version = 1; 144 nilfs_btnode_cache_init(&ii->i_btnode_cache, nilfs->ns_bdi); 145 return &ii->vfs_inode; 146} 147 148struct inode *nilfs_alloc_inode(struct super_block *sb) 149{ 150 return nilfs_alloc_inode_common(NILFS_SB(sb)->s_nilfs); 151} 152 153void nilfs_destroy_inode(struct inode *inode) 154{ 155 kmem_cache_free(nilfs_inode_cachep, NILFS_I(inode)); 156} 157 158static void init_once(void *obj) 159{ 160 struct nilfs_inode_info *ii = obj; 161 162 INIT_LIST_HEAD(&ii->i_dirty); 163#ifdef CONFIG_NILFS_XATTR 164 init_rwsem(&ii->xattr_sem); 165#endif 166 nilfs_btnode_cache_init_once(&ii->i_btnode_cache); 167 ii->i_bmap = (struct nilfs_bmap *)&ii->i_bmap_union; 168 inode_init_once(&ii->vfs_inode); 169} 170 171static int nilfs_init_inode_cache(void) 172{ 173 nilfs_inode_cachep = kmem_cache_create("nilfs2_inode_cache", 174 sizeof(struct nilfs_inode_info), 175 0, SLAB_RECLAIM_ACCOUNT, 176 init_once); 177 178 return (nilfs_inode_cachep == NULL) ? -ENOMEM : 0; 179} 180 181static inline void nilfs_destroy_inode_cache(void) 182{ 183 kmem_cache_destroy(nilfs_inode_cachep); 184} 185 186static void nilfs_clear_inode(struct inode *inode) 187{ 188 struct nilfs_inode_info *ii = NILFS_I(inode); 189 190 /* 191 * Free resources allocated in nilfs_read_inode(), here. 192 */ 193 BUG_ON(!list_empty(&ii->i_dirty)); 194 brelse(ii->i_bh); 195 ii->i_bh = NULL; 196 197 if (test_bit(NILFS_I_BMAP, &ii->i_state)) 198 nilfs_bmap_clear(ii->i_bmap); 199 200 nilfs_btnode_cache_clear(&ii->i_btnode_cache); 201} 202 203static int nilfs_sync_super(struct nilfs_sb_info *sbi, int dupsb) 204{ 205 struct the_nilfs *nilfs = sbi->s_nilfs; 206 int err; 207 int barrier_done = 0; 208 209 if (nilfs_test_opt(sbi, BARRIER)) { 210 set_buffer_ordered(nilfs->ns_sbh[0]); 211 barrier_done = 1; 212 } 213 retry: 214 set_buffer_dirty(nilfs->ns_sbh[0]); 215 err = sync_dirty_buffer(nilfs->ns_sbh[0]); 216 if (err == -EOPNOTSUPP && barrier_done) { 217 nilfs_warning(sbi->s_super, __func__, 218 "barrier-based sync failed. " 219 "disabling barriers\n"); 220 nilfs_clear_opt(sbi, BARRIER); 221 barrier_done = 0; 222 clear_buffer_ordered(nilfs->ns_sbh[0]); 223 goto retry; 224 } 225 if (unlikely(err)) { 226 printk(KERN_ERR 227 "NILFS: unable to write superblock (err=%d)\n", err); 228 if (err == -EIO && nilfs->ns_sbh[1]) { 229 nilfs_fall_back_super_block(nilfs); 230 goto retry; 231 } 232 } else { 233 struct nilfs_super_block *sbp = nilfs->ns_sbp[0]; 234 235 /* 236 * The latest segment becomes trailable from the position 237 * written in superblock. 238 */ 239 clear_nilfs_discontinued(nilfs); 240 241 /* update GC protection for recent segments */ 242 if (nilfs->ns_sbh[1]) { 243 sbp = NULL; 244 if (dupsb) { 245 set_buffer_dirty(nilfs->ns_sbh[1]); 246 if (!sync_dirty_buffer(nilfs->ns_sbh[1])) 247 sbp = nilfs->ns_sbp[1]; 248 } 249 } 250 if (sbp) { 251 spin_lock(&nilfs->ns_last_segment_lock); 252 nilfs->ns_prot_seq = le64_to_cpu(sbp->s_last_seq); 253 spin_unlock(&nilfs->ns_last_segment_lock); 254 } 255 } 256 257 return err; 258} 259 260int nilfs_commit_super(struct nilfs_sb_info *sbi, int dupsb) 261{ 262 struct the_nilfs *nilfs = sbi->s_nilfs; 263 struct nilfs_super_block **sbp = nilfs->ns_sbp; 264 sector_t nfreeblocks; 265 time_t t; 266 int err; 267 268 /* nilfs->sem must be locked by the caller. */ 269 if (sbp[0]->s_magic != NILFS_SUPER_MAGIC) { 270 if (sbp[1] && sbp[1]->s_magic == NILFS_SUPER_MAGIC) 271 nilfs_swap_super_block(nilfs); 272 else { 273 printk(KERN_CRIT "NILFS: superblock broke on dev %s\n", 274 sbi->s_super->s_id); 275 return -EIO; 276 } 277 } 278 err = nilfs_count_free_blocks(nilfs, &nfreeblocks); 279 if (unlikely(err)) { 280 printk(KERN_ERR "NILFS: failed to count free blocks\n"); 281 return err; 282 } 283 spin_lock(&nilfs->ns_last_segment_lock); 284 sbp[0]->s_last_seq = cpu_to_le64(nilfs->ns_last_seq); 285 sbp[0]->s_last_pseg = cpu_to_le64(nilfs->ns_last_pseg); 286 sbp[0]->s_last_cno = cpu_to_le64(nilfs->ns_last_cno); 287 spin_unlock(&nilfs->ns_last_segment_lock); 288 289 t = get_seconds(); 290 nilfs->ns_sbwtime[0] = t; 291 sbp[0]->s_free_blocks_count = cpu_to_le64(nfreeblocks); 292 sbp[0]->s_wtime = cpu_to_le64(t); 293 sbp[0]->s_sum = 0; 294 sbp[0]->s_sum = cpu_to_le32(crc32_le(nilfs->ns_crc_seed, 295 (unsigned char *)sbp[0], 296 nilfs->ns_sbsize)); 297 if (dupsb && sbp[1]) { 298 memcpy(sbp[1], sbp[0], nilfs->ns_sbsize); 299 nilfs->ns_sbwtime[1] = t; 300 } 301 clear_nilfs_sb_dirty(nilfs); 302 return nilfs_sync_super(sbi, dupsb); 303} 304 305static void nilfs_put_super(struct super_block *sb) 306{ 307 struct nilfs_sb_info *sbi = NILFS_SB(sb); 308 struct the_nilfs *nilfs = sbi->s_nilfs; 309 310 lock_kernel(); 311 312 nilfs_detach_segment_constructor(sbi); 313 314 if (!(sb->s_flags & MS_RDONLY)) { 315 down_write(&nilfs->ns_sem); 316 nilfs->ns_sbp[0]->s_state = cpu_to_le16(nilfs->ns_mount_state); 317 nilfs_commit_super(sbi, 1); 318 up_write(&nilfs->ns_sem); 319 } 320 down_write(&nilfs->ns_super_sem); 321 if (nilfs->ns_current == sbi) 322 nilfs->ns_current = NULL; 323 up_write(&nilfs->ns_super_sem); 324 325 nilfs_detach_checkpoint(sbi); 326 put_nilfs(sbi->s_nilfs); 327 sbi->s_super = NULL; 328 sb->s_fs_info = NULL; 329 nilfs_put_sbinfo(sbi); 330 331 unlock_kernel(); 332} 333 334static int nilfs_sync_fs(struct super_block *sb, int wait) 335{ 336 struct nilfs_sb_info *sbi = NILFS_SB(sb); 337 struct the_nilfs *nilfs = sbi->s_nilfs; 338 int err = 0; 339 340 /* This function is called when super block should be written back */ 341 if (wait) 342 err = nilfs_construct_segment(sb); 343 344 down_write(&nilfs->ns_sem); 345 if (nilfs_sb_dirty(nilfs)) 346 nilfs_commit_super(sbi, 1); 347 up_write(&nilfs->ns_sem); 348 349 return err; 350} 351 352int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno) 353{ 354 struct the_nilfs *nilfs = sbi->s_nilfs; 355 struct nilfs_checkpoint *raw_cp; 356 struct buffer_head *bh_cp; 357 int err; 358 359 down_write(&nilfs->ns_super_sem); 360 list_add(&sbi->s_list, &nilfs->ns_supers); 361 up_write(&nilfs->ns_super_sem); 362 363 sbi->s_ifile = nilfs_ifile_new(sbi, nilfs->ns_inode_size); 364 if (!sbi->s_ifile) 365 return -ENOMEM; 366 367 down_read(&nilfs->ns_segctor_sem); 368 err = nilfs_cpfile_get_checkpoint(nilfs->ns_cpfile, cno, 0, &raw_cp, 369 &bh_cp); 370 up_read(&nilfs->ns_segctor_sem); 371 if (unlikely(err)) { 372 if (err == -ENOENT || err == -EINVAL) { 373 printk(KERN_ERR 374 "NILFS: Invalid checkpoint " 375 "(checkpoint number=%llu)\n", 376 (unsigned long long)cno); 377 err = -EINVAL; 378 } 379 goto failed; 380 } 381 err = nilfs_read_inode_common(sbi->s_ifile, &raw_cp->cp_ifile_inode); 382 if (unlikely(err)) 383 goto failed_bh; 384 atomic_set(&sbi->s_inodes_count, le64_to_cpu(raw_cp->cp_inodes_count)); 385 atomic_set(&sbi->s_blocks_count, le64_to_cpu(raw_cp->cp_blocks_count)); 386 387 nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp); 388 return 0; 389 390 failed_bh: 391 nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, cno, bh_cp); 392 failed: 393 nilfs_mdt_destroy(sbi->s_ifile); 394 sbi->s_ifile = NULL; 395 396 down_write(&nilfs->ns_super_sem); 397 list_del_init(&sbi->s_list); 398 up_write(&nilfs->ns_super_sem); 399 400 return err; 401} 402 403void nilfs_detach_checkpoint(struct nilfs_sb_info *sbi) 404{ 405 struct the_nilfs *nilfs = sbi->s_nilfs; 406 407 nilfs_mdt_destroy(sbi->s_ifile); 408 sbi->s_ifile = NULL; 409 down_write(&nilfs->ns_super_sem); 410 list_del_init(&sbi->s_list); 411 up_write(&nilfs->ns_super_sem); 412} 413 414static int nilfs_statfs(struct dentry *dentry, struct kstatfs *buf) 415{ 416 struct super_block *sb = dentry->d_sb; 417 struct nilfs_sb_info *sbi = NILFS_SB(sb); 418 struct the_nilfs *nilfs = sbi->s_nilfs; 419 u64 id = huge_encode_dev(sb->s_bdev->bd_dev); 420 unsigned long long blocks; 421 unsigned long overhead; 422 unsigned long nrsvblocks; 423 sector_t nfreeblocks; 424 int err; 425 426 /* 427 * Compute all of the segment blocks 428 * 429 * The blocks before first segment and after last segment 430 * are excluded. 431 */ 432 blocks = nilfs->ns_blocks_per_segment * nilfs->ns_nsegments 433 - nilfs->ns_first_data_block; 434 nrsvblocks = nilfs->ns_nrsvsegs * nilfs->ns_blocks_per_segment; 435 436 /* 437 * Compute the overhead 438 * 439 * When distributing meta data blocks outside segment structure, 440 * We must count them as the overhead. 441 */ 442 overhead = 0; 443 444 err = nilfs_count_free_blocks(nilfs, &nfreeblocks); 445 if (unlikely(err)) 446 return err; 447 448 buf->f_type = NILFS_SUPER_MAGIC; 449 buf->f_bsize = sb->s_blocksize; 450 buf->f_blocks = blocks - overhead; 451 buf->f_bfree = nfreeblocks; 452 buf->f_bavail = (buf->f_bfree >= nrsvblocks) ? 453 (buf->f_bfree - nrsvblocks) : 0; 454 buf->f_files = atomic_read(&sbi->s_inodes_count); 455 buf->f_ffree = 0; /* nilfs_count_free_inodes(sb); */ 456 buf->f_namelen = NILFS_NAME_LEN; 457 buf->f_fsid.val[0] = (u32)id; 458 buf->f_fsid.val[1] = (u32)(id >> 32); 459 460 return 0; 461} 462 463static int nilfs_show_options(struct seq_file *seq, struct vfsmount *vfs) 464{ 465 struct super_block *sb = vfs->mnt_sb; 466 struct nilfs_sb_info *sbi = NILFS_SB(sb); 467 468 if (!nilfs_test_opt(sbi, BARRIER)) 469 seq_printf(seq, ",nobarrier"); 470 if (nilfs_test_opt(sbi, SNAPSHOT)) 471 seq_printf(seq, ",cp=%llu", 472 (unsigned long long int)sbi->s_snapshot_cno); 473 if (nilfs_test_opt(sbi, ERRORS_RO)) 474 seq_printf(seq, ",errors=remount-ro"); 475 if (nilfs_test_opt(sbi, ERRORS_PANIC)) 476 seq_printf(seq, ",errors=panic"); 477 if (nilfs_test_opt(sbi, STRICT_ORDER)) 478 seq_printf(seq, ",order=strict"); 479 if (nilfs_test_opt(sbi, NORECOVERY)) 480 seq_printf(seq, ",norecovery"); 481 if (nilfs_test_opt(sbi, DISCARD)) 482 seq_printf(seq, ",discard"); 483 484 return 0; 485} 486 487static const struct super_operations nilfs_sops = { 488 .alloc_inode = nilfs_alloc_inode, 489 .destroy_inode = nilfs_destroy_inode, 490 .dirty_inode = nilfs_dirty_inode, 491 /* .write_inode = nilfs_write_inode, */ 492 /* .put_inode = nilfs_put_inode, */ 493 /* .drop_inode = nilfs_drop_inode, */ 494 .delete_inode = nilfs_delete_inode, 495 .put_super = nilfs_put_super, 496 /* .write_super = nilfs_write_super, */ 497 .sync_fs = nilfs_sync_fs, 498 /* .write_super_lockfs */ 499 /* .unlockfs */ 500 .statfs = nilfs_statfs, 501 .remount_fs = nilfs_remount, 502 .clear_inode = nilfs_clear_inode, 503 /* .umount_begin */ 504 .show_options = nilfs_show_options 505}; 506 507static struct inode * 508nilfs_nfs_get_inode(struct super_block *sb, u64 ino, u32 generation) 509{ 510 struct inode *inode; 511 512 if (ino < NILFS_FIRST_INO(sb) && ino != NILFS_ROOT_INO && 513 ino != NILFS_SKETCH_INO) 514 return ERR_PTR(-ESTALE); 515 516 inode = nilfs_iget(sb, ino); 517 if (IS_ERR(inode)) 518 return ERR_CAST(inode); 519 if (generation && inode->i_generation != generation) { 520 iput(inode); 521 return ERR_PTR(-ESTALE); 522 } 523 524 return inode; 525} 526 527static struct dentry * 528nilfs_fh_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, 529 int fh_type) 530{ 531 return generic_fh_to_dentry(sb, fid, fh_len, fh_type, 532 nilfs_nfs_get_inode); 533} 534 535static struct dentry * 536nilfs_fh_to_parent(struct super_block *sb, struct fid *fid, int fh_len, 537 int fh_type) 538{ 539 return generic_fh_to_parent(sb, fid, fh_len, fh_type, 540 nilfs_nfs_get_inode); 541} 542 543static const struct export_operations nilfs_export_ops = { 544 .fh_to_dentry = nilfs_fh_to_dentry, 545 .fh_to_parent = nilfs_fh_to_parent, 546 .get_parent = nilfs_get_parent, 547}; 548 549enum { 550 Opt_err_cont, Opt_err_panic, Opt_err_ro, 551 Opt_nobarrier, Opt_snapshot, Opt_order, Opt_norecovery, 552 Opt_discard, Opt_err, 553}; 554 555static match_table_t tokens = { 556 {Opt_err_cont, "errors=continue"}, 557 {Opt_err_panic, "errors=panic"}, 558 {Opt_err_ro, "errors=remount-ro"}, 559 {Opt_nobarrier, "nobarrier"}, 560 {Opt_snapshot, "cp=%u"}, 561 {Opt_order, "order=%s"}, 562 {Opt_norecovery, "norecovery"}, 563 {Opt_discard, "discard"}, 564 {Opt_err, NULL} 565}; 566 567static int parse_options(char *options, struct super_block *sb) 568{ 569 struct nilfs_sb_info *sbi = NILFS_SB(sb); 570 char *p; 571 substring_t args[MAX_OPT_ARGS]; 572 int option; 573 574 if (!options) 575 return 1; 576 577 while ((p = strsep(&options, ",")) != NULL) { 578 int token; 579 if (!*p) 580 continue; 581 582 token = match_token(p, tokens, args); 583 switch (token) { 584 case Opt_nobarrier: 585 nilfs_clear_opt(sbi, BARRIER); 586 break; 587 case Opt_order: 588 if (strcmp(args[0].from, "relaxed") == 0) 589 /* Ordered data semantics */ 590 nilfs_clear_opt(sbi, STRICT_ORDER); 591 else if (strcmp(args[0].from, "strict") == 0) 592 /* Strict in-order semantics */ 593 nilfs_set_opt(sbi, STRICT_ORDER); 594 else 595 return 0; 596 break; 597 case Opt_err_panic: 598 nilfs_write_opt(sbi, ERROR_MODE, ERRORS_PANIC); 599 break; 600 case Opt_err_ro: 601 nilfs_write_opt(sbi, ERROR_MODE, ERRORS_RO); 602 break; 603 case Opt_err_cont: 604 nilfs_write_opt(sbi, ERROR_MODE, ERRORS_CONT); 605 break; 606 case Opt_snapshot: 607 if (match_int(&args[0], &option) || option <= 0) 608 return 0; 609 if (!(sb->s_flags & MS_RDONLY)) 610 return 0; 611 sbi->s_snapshot_cno = option; 612 nilfs_set_opt(sbi, SNAPSHOT); 613 break; 614 case Opt_norecovery: 615 nilfs_set_opt(sbi, NORECOVERY); 616 break; 617 case Opt_discard: 618 nilfs_set_opt(sbi, DISCARD); 619 break; 620 default: 621 printk(KERN_ERR 622 "NILFS: Unrecognized mount option \"%s\"\n", p); 623 return 0; 624 } 625 } 626 return 1; 627} 628 629static inline void 630nilfs_set_default_options(struct nilfs_sb_info *sbi, 631 struct nilfs_super_block *sbp) 632{ 633 sbi->s_mount_opt = 634 NILFS_MOUNT_ERRORS_CONT | NILFS_MOUNT_BARRIER; 635} 636 637static int nilfs_setup_super(struct nilfs_sb_info *sbi) 638{ 639 struct the_nilfs *nilfs = sbi->s_nilfs; 640 struct nilfs_super_block *sbp = nilfs->ns_sbp[0]; 641 int max_mnt_count = le16_to_cpu(sbp->s_max_mnt_count); 642 int mnt_count = le16_to_cpu(sbp->s_mnt_count); 643 644 /* nilfs->sem must be locked by the caller. */ 645 if (nilfs->ns_mount_state & NILFS_ERROR_FS) { 646 printk(KERN_WARNING 647 "NILFS warning: mounting fs with errors\n"); 648#if 0 649 } else if (max_mnt_count >= 0 && mnt_count >= max_mnt_count) { 650 printk(KERN_WARNING 651 "NILFS warning: maximal mount count reached\n"); 652#endif 653 } 654 if (!max_mnt_count) 655 sbp->s_max_mnt_count = cpu_to_le16(NILFS_DFL_MAX_MNT_COUNT); 656 657 sbp->s_mnt_count = cpu_to_le16(mnt_count + 1); 658 sbp->s_state = cpu_to_le16(le16_to_cpu(sbp->s_state) & ~NILFS_VALID_FS); 659 sbp->s_mtime = cpu_to_le64(get_seconds()); 660 return nilfs_commit_super(sbi, 1); 661} 662 663struct nilfs_super_block *nilfs_read_super_block(struct super_block *sb, 664 u64 pos, int blocksize, 665 struct buffer_head **pbh) 666{ 667 unsigned long long sb_index = pos; 668 unsigned long offset; 669 670 offset = do_div(sb_index, blocksize); 671 *pbh = sb_bread(sb, sb_index); 672 if (!*pbh) 673 return NULL; 674 return (struct nilfs_super_block *)((char *)(*pbh)->b_data + offset); 675} 676 677int nilfs_store_magic_and_option(struct super_block *sb, 678 struct nilfs_super_block *sbp, 679 char *data) 680{ 681 struct nilfs_sb_info *sbi = NILFS_SB(sb); 682 683 sb->s_magic = le16_to_cpu(sbp->s_magic); 684 685 /* FS independent flags */ 686#ifdef NILFS_ATIME_DISABLE 687 sb->s_flags |= MS_NOATIME; 688#endif 689 690 nilfs_set_default_options(sbi, sbp); 691 692 sbi->s_resuid = le16_to_cpu(sbp->s_def_resuid); 693 sbi->s_resgid = le16_to_cpu(sbp->s_def_resgid); 694 sbi->s_interval = le32_to_cpu(sbp->s_c_interval); 695 sbi->s_watermark = le32_to_cpu(sbp->s_c_block_max); 696 697 return !parse_options(data, sb) ? -EINVAL : 0 ; 698} 699 700/** 701 * nilfs_fill_super() - initialize a super block instance 702 * @sb: super_block 703 * @data: mount options 704 * @silent: silent mode flag 705 * @nilfs: the_nilfs struct 706 * 707 * This function is called exclusively by nilfs->ns_mount_mutex. 708 * So, the recovery process is protected from other simultaneous mounts. 709 */ 710static int 711nilfs_fill_super(struct super_block *sb, void *data, int silent, 712 struct the_nilfs *nilfs) 713{ 714 struct nilfs_sb_info *sbi; 715 struct inode *root; 716 __u64 cno; 717 int err; 718 719 sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); 720 if (!sbi) 721 return -ENOMEM; 722 723 sb->s_fs_info = sbi; 724 725 get_nilfs(nilfs); 726 sbi->s_nilfs = nilfs; 727 sbi->s_super = sb; 728 atomic_set(&sbi->s_count, 1); 729 730 err = init_nilfs(nilfs, sbi, (char *)data); 731 if (err) 732 goto failed_sbi; 733 734 spin_lock_init(&sbi->s_inode_lock); 735 INIT_LIST_HEAD(&sbi->s_dirty_files); 736 INIT_LIST_HEAD(&sbi->s_list); 737 738 /* 739 * Following initialization is overlapped because 740 * nilfs_sb_info structure has been cleared at the beginning. 741 * But we reserve them to keep our interest and make ready 742 * for the future change. 743 */ 744 get_random_bytes(&sbi->s_next_generation, 745 sizeof(sbi->s_next_generation)); 746 spin_lock_init(&sbi->s_next_gen_lock); 747 748 sb->s_op = &nilfs_sops; 749 sb->s_export_op = &nilfs_export_ops; 750 sb->s_root = NULL; 751 sb->s_time_gran = 1; 752 753 err = load_nilfs(nilfs, sbi); 754 if (err) 755 goto failed_sbi; 756 757 cno = nilfs_last_cno(nilfs); 758 759 if (sb->s_flags & MS_RDONLY) { 760 if (nilfs_test_opt(sbi, SNAPSHOT)) { 761 down_read(&nilfs->ns_segctor_sem); 762 err = nilfs_cpfile_is_snapshot(nilfs->ns_cpfile, 763 sbi->s_snapshot_cno); 764 up_read(&nilfs->ns_segctor_sem); 765 if (err < 0) { 766 if (err == -ENOENT) 767 err = -EINVAL; 768 goto failed_sbi; 769 } 770 if (!err) { 771 printk(KERN_ERR 772 "NILFS: The specified checkpoint is " 773 "not a snapshot " 774 "(checkpoint number=%llu).\n", 775 (unsigned long long)sbi->s_snapshot_cno); 776 err = -EINVAL; 777 goto failed_sbi; 778 } 779 cno = sbi->s_snapshot_cno; 780 } else 781 /* Read-only mount */ 782 sbi->s_snapshot_cno = cno; 783 } 784 785 err = nilfs_attach_checkpoint(sbi, cno); 786 if (err) { 787 printk(KERN_ERR "NILFS: error loading a checkpoint" 788 " (checkpoint number=%llu).\n", (unsigned long long)cno); 789 goto failed_sbi; 790 } 791 792 if (!(sb->s_flags & MS_RDONLY)) { 793 err = nilfs_attach_segment_constructor(sbi); 794 if (err) 795 goto failed_checkpoint; 796 } 797 798 root = nilfs_iget(sb, NILFS_ROOT_INO); 799 if (IS_ERR(root)) { 800 printk(KERN_ERR "NILFS: get root inode failed\n"); 801 err = PTR_ERR(root); 802 goto failed_segctor; 803 } 804 if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) { 805 iput(root); 806 printk(KERN_ERR "NILFS: corrupt root inode.\n"); 807 err = -EINVAL; 808 goto failed_segctor; 809 } 810 sb->s_root = d_alloc_root(root); 811 if (!sb->s_root) { 812 iput(root); 813 printk(KERN_ERR "NILFS: get root dentry failed\n"); 814 err = -ENOMEM; 815 goto failed_segctor; 816 } 817 818 if (!(sb->s_flags & MS_RDONLY)) { 819 down_write(&nilfs->ns_sem); 820 nilfs_setup_super(sbi); 821 up_write(&nilfs->ns_sem); 822 } 823 824 down_write(&nilfs->ns_super_sem); 825 if (!nilfs_test_opt(sbi, SNAPSHOT)) 826 nilfs->ns_current = sbi; 827 up_write(&nilfs->ns_super_sem); 828 829 return 0; 830 831 failed_segctor: 832 nilfs_detach_segment_constructor(sbi); 833 834 failed_checkpoint: 835 nilfs_detach_checkpoint(sbi); 836 837 failed_sbi: 838 put_nilfs(nilfs); 839 sb->s_fs_info = NULL; 840 nilfs_put_sbinfo(sbi); 841 return err; 842} 843 844static int nilfs_remount(struct super_block *sb, int *flags, char *data) 845{ 846 struct nilfs_sb_info *sbi = NILFS_SB(sb); 847 struct nilfs_super_block *sbp; 848 struct the_nilfs *nilfs = sbi->s_nilfs; 849 unsigned long old_sb_flags; 850 struct nilfs_mount_options old_opts; 851 int err; 852 853 lock_kernel(); 854 855 down_write(&nilfs->ns_super_sem); 856 old_sb_flags = sb->s_flags; 857 old_opts.mount_opt = sbi->s_mount_opt; 858 old_opts.snapshot_cno = sbi->s_snapshot_cno; 859 860 if (!parse_options(data, sb)) { 861 err = -EINVAL; 862 goto restore_opts; 863 } 864 sb->s_flags = (sb->s_flags & ~MS_POSIXACL); 865 866 if ((*flags & MS_RDONLY) && 867 sbi->s_snapshot_cno != old_opts.snapshot_cno) { 868 printk(KERN_WARNING "NILFS (device %s): couldn't " 869 "remount to a different snapshot.\n", 870 sb->s_id); 871 err = -EINVAL; 872 goto restore_opts; 873 } 874 875 if (!nilfs_valid_fs(nilfs)) { 876 printk(KERN_WARNING "NILFS (device %s): couldn't " 877 "remount because the filesystem is in an " 878 "incomplete recovery state.\n", sb->s_id); 879 err = -EINVAL; 880 goto restore_opts; 881 } 882 883 if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) 884 goto out; 885 if (*flags & MS_RDONLY) { 886 /* Shutting down the segment constructor */ 887 nilfs_detach_segment_constructor(sbi); 888 sb->s_flags |= MS_RDONLY; 889 890 sbi->s_snapshot_cno = nilfs_last_cno(nilfs); 891 /* nilfs_set_opt(sbi, SNAPSHOT); */ 892 893 /* 894 * Remounting a valid RW partition RDONLY, so set 895 * the RDONLY flag and then mark the partition as valid again. 896 */ 897 down_write(&nilfs->ns_sem); 898 sbp = nilfs->ns_sbp[0]; 899 if (!(sbp->s_state & le16_to_cpu(NILFS_VALID_FS)) && 900 (nilfs->ns_mount_state & NILFS_VALID_FS)) 901 sbp->s_state = cpu_to_le16(nilfs->ns_mount_state); 902 sbp->s_mtime = cpu_to_le64(get_seconds()); 903 nilfs_commit_super(sbi, 1); 904 up_write(&nilfs->ns_sem); 905 } else { 906 /* 907 * Mounting a RDONLY partition read-write, so reread and 908 * store the current valid flag. (It may have been changed 909 * by fsck since we originally mounted the partition.) 910 */ 911 if (nilfs->ns_current && nilfs->ns_current != sbi) { 912 printk(KERN_WARNING "NILFS (device %s): couldn't " 913 "remount because an RW-mount exists.\n", 914 sb->s_id); 915 err = -EBUSY; 916 goto restore_opts; 917 } 918 if (sbi->s_snapshot_cno != nilfs_last_cno(nilfs)) { 919 printk(KERN_WARNING "NILFS (device %s): couldn't " 920 "remount because the current RO-mount is not " 921 "the latest one.\n", 922 sb->s_id); 923 err = -EINVAL; 924 goto restore_opts; 925 } 926 sb->s_flags &= ~MS_RDONLY; 927 nilfs_clear_opt(sbi, SNAPSHOT); 928 sbi->s_snapshot_cno = 0; 929 930 err = nilfs_attach_segment_constructor(sbi); 931 if (err) 932 goto restore_opts; 933 934 down_write(&nilfs->ns_sem); 935 nilfs_setup_super(sbi); 936 up_write(&nilfs->ns_sem); 937 938 nilfs->ns_current = sbi; 939 } 940 out: 941 up_write(&nilfs->ns_super_sem); 942 unlock_kernel(); 943 return 0; 944 945 restore_opts: 946 sb->s_flags = old_sb_flags; 947 sbi->s_mount_opt = old_opts.mount_opt; 948 sbi->s_snapshot_cno = old_opts.snapshot_cno; 949 up_write(&nilfs->ns_super_sem); 950 unlock_kernel(); 951 return err; 952} 953 954struct nilfs_super_data { 955 struct block_device *bdev; 956 struct nilfs_sb_info *sbi; 957 __u64 cno; 958 int flags; 959}; 960 961/** 962 * nilfs_identify - pre-read mount options needed to identify mount instance 963 * @data: mount options 964 * @sd: nilfs_super_data 965 */ 966static int nilfs_identify(char *data, struct nilfs_super_data *sd) 967{ 968 char *p, *options = data; 969 substring_t args[MAX_OPT_ARGS]; 970 int option, token; 971 int ret = 0; 972 973 do { 974 p = strsep(&options, ","); 975 if (p != NULL && *p) { 976 token = match_token(p, tokens, args); 977 if (token == Opt_snapshot) { 978 if (!(sd->flags & MS_RDONLY)) 979 ret++; 980 else { 981 ret = match_int(&args[0], &option); 982 if (!ret) { 983 if (option > 0) 984 sd->cno = option; 985 else 986 ret++; 987 } 988 } 989 } 990 if (ret) 991 printk(KERN_ERR 992 "NILFS: invalid mount option: %s\n", p); 993 } 994 if (!options) 995 break; 996 BUG_ON(options == data); 997 *(options - 1) = ','; 998 } while (!ret); 999 return ret; 1000} 1001 1002static int nilfs_set_bdev_super(struct super_block *s, void *data) 1003{ 1004 struct nilfs_super_data *sd = data; 1005 1006 s->s_bdev = sd->bdev; 1007 s->s_dev = s->s_bdev->bd_dev; 1008 return 0; 1009} 1010 1011static int nilfs_test_bdev_super(struct super_block *s, void *data) 1012{ 1013 struct nilfs_super_data *sd = data; 1014 1015 return sd->sbi && s->s_fs_info == (void *)sd->sbi; 1016} 1017 1018static int 1019nilfs_get_sb(struct file_system_type *fs_type, int flags, 1020 const char *dev_name, void *data, struct vfsmount *mnt) 1021{ 1022 struct nilfs_super_data sd; 1023 struct super_block *s; 1024 struct the_nilfs *nilfs; 1025 int err, need_to_close = 1; 1026 1027 sd.bdev = open_bdev_exclusive(dev_name, flags, fs_type); 1028 if (IS_ERR(sd.bdev)) 1029 return PTR_ERR(sd.bdev); 1030 1031 /* 1032 * To get mount instance using sget() vfs-routine, NILFS needs 1033 * much more information than normal filesystems to identify mount 1034 * instance. For snapshot mounts, not only a mount type (ro-mount 1035 * or rw-mount) but also a checkpoint number is required. 1036 */ 1037 sd.cno = 0; 1038 sd.flags = flags; 1039 if (nilfs_identify((char *)data, &sd)) { 1040 err = -EINVAL; 1041 goto failed; 1042 } 1043 1044 nilfs = find_or_create_nilfs(sd.bdev); 1045 if (!nilfs) { 1046 err = -ENOMEM; 1047 goto failed; 1048 } 1049 1050 mutex_lock(&nilfs->ns_mount_mutex); 1051 1052 if (!sd.cno) { 1053 /* 1054 * Check if an exclusive mount exists or not. 1055 * Snapshot mounts coexist with a current mount 1056 * (i.e. rw-mount or ro-mount), whereas rw-mount and 1057 * ro-mount are mutually exclusive. 1058 */ 1059 down_read(&nilfs->ns_super_sem); 1060 if (nilfs->ns_current && 1061 ((nilfs->ns_current->s_super->s_flags ^ flags) 1062 & MS_RDONLY)) { 1063 up_read(&nilfs->ns_super_sem); 1064 err = -EBUSY; 1065 goto failed_unlock; 1066 } 1067 up_read(&nilfs->ns_super_sem); 1068 } 1069 1070 /* 1071 * Find existing nilfs_sb_info struct 1072 */ 1073 sd.sbi = nilfs_find_sbinfo(nilfs, !(flags & MS_RDONLY), sd.cno); 1074 1075 /* 1076 * Get super block instance holding the nilfs_sb_info struct. 1077 * A new instance is allocated if no existing mount is present or 1078 * existing instance has been unmounted. 1079 */ 1080 s = sget(fs_type, nilfs_test_bdev_super, nilfs_set_bdev_super, &sd); 1081 if (sd.sbi) 1082 nilfs_put_sbinfo(sd.sbi); 1083 1084 if (IS_ERR(s)) { 1085 err = PTR_ERR(s); 1086 goto failed_unlock; 1087 } 1088 1089 if (!s->s_root) { 1090 char b[BDEVNAME_SIZE]; 1091 1092 /* New superblock instance created */ 1093 s->s_flags = flags; 1094 strlcpy(s->s_id, bdevname(sd.bdev, b), sizeof(s->s_id)); 1095 sb_set_blocksize(s, block_size(sd.bdev)); 1096 1097 err = nilfs_fill_super(s, data, flags & MS_VERBOSE, nilfs); 1098 if (err) 1099 goto cancel_new; 1100 1101 s->s_flags |= MS_ACTIVE; 1102 need_to_close = 0; 1103 } 1104 1105 mutex_unlock(&nilfs->ns_mount_mutex); 1106 put_nilfs(nilfs); 1107 if (need_to_close) 1108 close_bdev_exclusive(sd.bdev, flags); 1109 simple_set_mnt(mnt, s); 1110 return 0; 1111 1112 failed_unlock: 1113 mutex_unlock(&nilfs->ns_mount_mutex); 1114 put_nilfs(nilfs); 1115 failed: 1116 close_bdev_exclusive(sd.bdev, flags); 1117 1118 return err; 1119 1120 cancel_new: 1121 /* Abandoning the newly allocated superblock */ 1122 mutex_unlock(&nilfs->ns_mount_mutex); 1123 put_nilfs(nilfs); 1124 deactivate_locked_super(s); 1125 /* 1126 * deactivate_super() invokes close_bdev_exclusive(). 1127 * We must finish all post-cleaning before this call; 1128 * put_nilfs() needs the block device. 1129 */ 1130 return err; 1131} 1132 1133struct file_system_type nilfs_fs_type = { 1134 .owner = THIS_MODULE, 1135 .name = "nilfs2", 1136 .get_sb = nilfs_get_sb, 1137 .kill_sb = kill_block_super, 1138 .fs_flags = FS_REQUIRES_DEV, 1139}; 1140 1141static int __init init_nilfs_fs(void) 1142{ 1143 int err; 1144 1145 err = nilfs_init_inode_cache(); 1146 if (err) 1147 goto failed; 1148 1149 err = nilfs_init_transaction_cache(); 1150 if (err) 1151 goto failed_inode_cache; 1152 1153 err = nilfs_init_segbuf_cache(); 1154 if (err) 1155 goto failed_transaction_cache; 1156 1157 err = nilfs_btree_path_cache_init(); 1158 if (err) 1159 goto failed_segbuf_cache; 1160 1161 err = register_filesystem(&nilfs_fs_type); 1162 if (err) 1163 goto failed_btree_path_cache; 1164 1165 return 0; 1166 1167 failed_btree_path_cache: 1168 nilfs_btree_path_cache_destroy(); 1169 1170 failed_segbuf_cache: 1171 nilfs_destroy_segbuf_cache(); 1172 1173 failed_transaction_cache: 1174 nilfs_destroy_transaction_cache(); 1175 1176 failed_inode_cache: 1177 nilfs_destroy_inode_cache(); 1178 1179 failed: 1180 return err; 1181} 1182 1183static void __exit exit_nilfs_fs(void) 1184{ 1185 nilfs_destroy_segbuf_cache(); 1186 nilfs_destroy_transaction_cache(); 1187 nilfs_destroy_inode_cache(); 1188 nilfs_btree_path_cache_destroy(); 1189 unregister_filesystem(&nilfs_fs_type); 1190} 1191 1192module_init(init_nilfs_fs) 1193module_exit(exit_nilfs_fs)