1 /* 2 * the_nilfs.c - the_nilfs shared structure. 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 24 #include <linux/buffer_head.h> 25 #include <linux/slab.h> 26 #include <linux/blkdev.h> 27 #include <linux/backing-dev.h> 28 #include <linux/crc32.h> 29 #include "nilfs.h" 30 #include "segment.h" 31 #include "alloc.h" 32 #include "cpfile.h" 33 #include "sufile.h" 34 #include "dat.h" 35 #include "segbuf.h" 36 37 38 static LIST_HEAD(nilfs_objects); 39 static DEFINE_SPINLOCK(nilfs_lock); 40 41 void nilfs_set_last_segment(struct the_nilfs *nilfs, 42 sector_t start_blocknr, u64 seq, __u64 cno) 43 { 44 spin_lock(&nilfs->ns_last_segment_lock); 45 nilfs->ns_last_pseg = start_blocknr; 46 nilfs->ns_last_seq = seq; 47 nilfs->ns_last_cno = cno; 48 spin_unlock(&nilfs->ns_last_segment_lock); 49 } 50 51 /** 52 * alloc_nilfs - allocate the_nilfs structure 53 * @bdev: block device to which the_nilfs is related 54 * 55 * alloc_nilfs() allocates memory for the_nilfs and 56 * initializes its reference count and locks. 57 * 58 * Return Value: On success, pointer to the_nilfs is returned. 59 * On error, NULL is returned. 60 */ 61 static struct the_nilfs *alloc_nilfs(struct block_device *bdev) 62 { 63 struct the_nilfs *nilfs; 64 65 nilfs = kzalloc(sizeof(*nilfs), GFP_KERNEL); 66 if (!nilfs) 67 return NULL; 68 69 nilfs->ns_bdev = bdev; 70 atomic_set(&nilfs->ns_count, 1); 71 atomic_set(&nilfs->ns_ndirtyblks, 0); 72 init_rwsem(&nilfs->ns_sem); 73 init_rwsem(&nilfs->ns_super_sem); 74 mutex_init(&nilfs->ns_mount_mutex); 75 init_rwsem(&nilfs->ns_writer_sem); 76 INIT_LIST_HEAD(&nilfs->ns_list); 77 INIT_LIST_HEAD(&nilfs->ns_supers); 78 spin_lock_init(&nilfs->ns_last_segment_lock); 79 nilfs->ns_gc_inodes_h = NULL; 80 init_rwsem(&nilfs->ns_segctor_sem); 81 82 return nilfs; 83 } 84 85 /** 86 * find_or_create_nilfs - find or create nilfs object 87 * @bdev: block device to which the_nilfs is related 88 * 89 * find_nilfs() looks up an existent nilfs object created on the 90 * device and gets the reference count of the object. If no nilfs object 91 * is found on the device, a new nilfs object is allocated. 92 * 93 * Return Value: On success, pointer to the nilfs object is returned. 94 * On error, NULL is returned. 95 */ 96 struct the_nilfs *find_or_create_nilfs(struct block_device *bdev) 97 { 98 struct the_nilfs *nilfs, *new = NULL; 99 100 retry: 101 spin_lock(&nilfs_lock); 102 list_for_each_entry(nilfs, &nilfs_objects, ns_list) { 103 if (nilfs->ns_bdev == bdev) { 104 get_nilfs(nilfs); 105 spin_unlock(&nilfs_lock); 106 if (new) 107 put_nilfs(new); 108 return nilfs; /* existing object */ 109 } 110 } 111 if (new) { 112 list_add_tail(&new->ns_list, &nilfs_objects); 113 spin_unlock(&nilfs_lock); 114 return new; /* new object */ 115 } 116 spin_unlock(&nilfs_lock); 117 118 new = alloc_nilfs(bdev); 119 if (new) 120 goto retry; 121 return NULL; /* insufficient memory */ 122 } 123 124 /** 125 * put_nilfs - release a reference to the_nilfs 126 * @nilfs: the_nilfs structure to be released 127 * 128 * put_nilfs() decrements a reference counter of the_nilfs. 129 * If the reference count reaches zero, the_nilfs is freed. 130 */ 131 void put_nilfs(struct the_nilfs *nilfs) 132 { 133 spin_lock(&nilfs_lock); 134 if (!atomic_dec_and_test(&nilfs->ns_count)) { 135 spin_unlock(&nilfs_lock); 136 return; 137 } 138 list_del_init(&nilfs->ns_list); 139 spin_unlock(&nilfs_lock); 140 141 /* 142 * Increment of ns_count never occurs below because the caller 143 * of get_nilfs() holds at least one reference to the_nilfs. 144 * Thus its exclusion control is not required here. 145 */ 146 147 might_sleep(); 148 if (nilfs_loaded(nilfs)) { 149 nilfs_mdt_destroy(nilfs->ns_sufile); 150 nilfs_mdt_destroy(nilfs->ns_cpfile); 151 nilfs_mdt_destroy(nilfs->ns_dat); 152 nilfs_mdt_destroy(nilfs->ns_gc_dat); 153 } 154 if (nilfs_init(nilfs)) { 155 nilfs_destroy_gccache(nilfs); 156 brelse(nilfs->ns_sbh[0]); 157 brelse(nilfs->ns_sbh[1]); 158 } 159 kfree(nilfs); 160 } 161 162 static int nilfs_load_super_root(struct the_nilfs *nilfs, 163 struct nilfs_sb_info *sbi, sector_t sr_block) 164 { 165 struct buffer_head *bh_sr; 166 struct nilfs_super_root *raw_sr; 167 struct nilfs_super_block **sbp = nilfs->ns_sbp; 168 unsigned dat_entry_size, segment_usage_size, checkpoint_size; 169 unsigned inode_size; 170 int err; 171 172 err = nilfs_read_super_root_block(sbi->s_super, sr_block, &bh_sr, 1); 173 if (unlikely(err)) 174 return err; 175 176 down_read(&nilfs->ns_sem); 177 dat_entry_size = le16_to_cpu(sbp[0]->s_dat_entry_size); 178 checkpoint_size = le16_to_cpu(sbp[0]->s_checkpoint_size); 179 segment_usage_size = le16_to_cpu(sbp[0]->s_segment_usage_size); 180 up_read(&nilfs->ns_sem); 181 182 inode_size = nilfs->ns_inode_size; 183 184 err = -ENOMEM; 185 nilfs->ns_dat = nilfs_dat_new(nilfs, dat_entry_size); 186 if (unlikely(!nilfs->ns_dat)) 187 goto failed; 188 189 nilfs->ns_gc_dat = nilfs_dat_new(nilfs, dat_entry_size); 190 if (unlikely(!nilfs->ns_gc_dat)) 191 goto failed_dat; 192 193 nilfs->ns_cpfile = nilfs_cpfile_new(nilfs, checkpoint_size); 194 if (unlikely(!nilfs->ns_cpfile)) 195 goto failed_gc_dat; 196 197 nilfs->ns_sufile = nilfs_sufile_new(nilfs, segment_usage_size); 198 if (unlikely(!nilfs->ns_sufile)) 199 goto failed_cpfile; 200 201 nilfs_mdt_set_shadow(nilfs->ns_dat, nilfs->ns_gc_dat); 202 203 err = nilfs_dat_read(nilfs->ns_dat, (void *)bh_sr->b_data + 204 NILFS_SR_DAT_OFFSET(inode_size)); 205 if (unlikely(err)) 206 goto failed_sufile; 207 208 err = nilfs_cpfile_read(nilfs->ns_cpfile, (void *)bh_sr->b_data + 209 NILFS_SR_CPFILE_OFFSET(inode_size)); 210 if (unlikely(err)) 211 goto failed_sufile; 212 213 err = nilfs_sufile_read(nilfs->ns_sufile, (void *)bh_sr->b_data + 214 NILFS_SR_SUFILE_OFFSET(inode_size)); 215 if (unlikely(err)) 216 goto failed_sufile; 217 218 raw_sr = (struct nilfs_super_root *)bh_sr->b_data; 219 nilfs->ns_nongc_ctime = le64_to_cpu(raw_sr->sr_nongc_ctime); 220 221 failed: 222 brelse(bh_sr); 223 return err; 224 225 failed_sufile: 226 nilfs_mdt_destroy(nilfs->ns_sufile); 227 228 failed_cpfile: 229 nilfs_mdt_destroy(nilfs->ns_cpfile); 230 231 failed_gc_dat: 232 nilfs_mdt_destroy(nilfs->ns_gc_dat); 233 234 failed_dat: 235 nilfs_mdt_destroy(nilfs->ns_dat); 236 goto failed; 237 } 238 239 static void nilfs_init_recovery_info(struct nilfs_recovery_info *ri) 240 { 241 memset(ri, 0, sizeof(*ri)); 242 INIT_LIST_HEAD(&ri->ri_used_segments); 243 } 244 245 static void nilfs_clear_recovery_info(struct nilfs_recovery_info *ri) 246 { 247 nilfs_dispose_segment_list(&ri->ri_used_segments); 248 } 249 250 /** 251 * load_nilfs - load and recover the nilfs 252 * @nilfs: the_nilfs structure to be released 253 * @sbi: nilfs_sb_info used to recover past segment 254 * 255 * load_nilfs() searches and load the latest super root, 256 * attaches the last segment, and does recovery if needed. 257 * The caller must call this exclusively for simultaneous mounts. 258 */ 259 int load_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi) 260 { 261 struct nilfs_recovery_info ri; 262 unsigned int s_flags = sbi->s_super->s_flags; 263 int really_read_only = bdev_read_only(nilfs->ns_bdev); 264 int valid_fs = nilfs_valid_fs(nilfs); 265 int err; 266 267 if (nilfs_loaded(nilfs)) 268 return 0; 269 270 if (!valid_fs) { 271 printk(KERN_WARNING "NILFS warning: mounting unchecked fs\n"); 272 if (s_flags & MS_RDONLY) { 273 printk(KERN_INFO "NILFS: INFO: recovery " 274 "required for readonly filesystem.\n"); 275 printk(KERN_INFO "NILFS: write access will " 276 "be enabled during recovery.\n"); 277 } 278 } 279 280 nilfs_init_recovery_info(&ri); 281 282 err = nilfs_search_super_root(nilfs, sbi, &ri); 283 if (unlikely(err)) { 284 printk(KERN_ERR "NILFS: error searching super root.\n"); 285 goto failed; 286 } 287 288 err = nilfs_load_super_root(nilfs, sbi, ri.ri_super_root); 289 if (unlikely(err)) { 290 printk(KERN_ERR "NILFS: error loading super root.\n"); 291 goto failed; 292 } 293 294 if (valid_fs) 295 goto skip_recovery; 296 297 if (s_flags & MS_RDONLY) { 298 if (really_read_only) { 299 printk(KERN_ERR "NILFS: write access " 300 "unavailable, cannot proceed.\n"); 301 err = -EROFS; 302 goto failed_unload; 303 } 304 sbi->s_super->s_flags &= ~MS_RDONLY; 305 } 306 307 err = nilfs_recover_logical_segments(nilfs, sbi, &ri); 308 if (err) 309 goto failed_unload; 310 311 down_write(&nilfs->ns_sem); 312 nilfs->ns_mount_state |= NILFS_VALID_FS; 313 nilfs->ns_sbp[0]->s_state = cpu_to_le16(nilfs->ns_mount_state); 314 err = nilfs_commit_super(sbi, 1); 315 up_write(&nilfs->ns_sem); 316 317 if (err) { 318 printk(KERN_ERR "NILFS: failed to update super block. " 319 "recovery unfinished.\n"); 320 goto failed_unload; 321 } 322 printk(KERN_INFO "NILFS: recovery complete.\n"); 323 324 skip_recovery: 325 set_nilfs_loaded(nilfs); 326 nilfs_clear_recovery_info(&ri); 327 sbi->s_super->s_flags = s_flags; 328 return 0; 329 330 failed_unload: 331 nilfs_mdt_destroy(nilfs->ns_cpfile); 332 nilfs_mdt_destroy(nilfs->ns_sufile); 333 nilfs_mdt_destroy(nilfs->ns_dat); 334 335 failed: 336 nilfs_clear_recovery_info(&ri); 337 sbi->s_super->s_flags = s_flags; 338 return err; 339 } 340 341 static unsigned long long nilfs_max_size(unsigned int blkbits) 342 { 343 unsigned int max_bits; 344 unsigned long long res = MAX_LFS_FILESIZE; /* page cache limit */ 345 346 max_bits = blkbits + NILFS_BMAP_KEY_BIT; /* bmap size limit */ 347 if (max_bits < 64) 348 res = min_t(unsigned long long, res, (1ULL << max_bits) - 1); 349 return res; 350 } 351 352 static int nilfs_store_disk_layout(struct the_nilfs *nilfs, 353 struct nilfs_super_block *sbp) 354 { 355 if (le32_to_cpu(sbp->s_rev_level) != NILFS_CURRENT_REV) { 356 printk(KERN_ERR "NILFS: revision mismatch " 357 "(superblock rev.=%d.%d, current rev.=%d.%d). " 358 "Please check the version of mkfs.nilfs.\n", 359 le32_to_cpu(sbp->s_rev_level), 360 le16_to_cpu(sbp->s_minor_rev_level), 361 NILFS_CURRENT_REV, NILFS_MINOR_REV); 362 return -EINVAL; 363 } 364 nilfs->ns_sbsize = le16_to_cpu(sbp->s_bytes); 365 if (nilfs->ns_sbsize > BLOCK_SIZE) 366 return -EINVAL; 367 368 nilfs->ns_inode_size = le16_to_cpu(sbp->s_inode_size); 369 nilfs->ns_first_ino = le32_to_cpu(sbp->s_first_ino); 370 371 nilfs->ns_blocks_per_segment = le32_to_cpu(sbp->s_blocks_per_segment); 372 if (nilfs->ns_blocks_per_segment < NILFS_SEG_MIN_BLOCKS) { 373 printk(KERN_ERR "NILFS: too short segment. \n"); 374 return -EINVAL; 375 } 376 377 nilfs->ns_first_data_block = le64_to_cpu(sbp->s_first_data_block); 378 nilfs->ns_nsegments = le64_to_cpu(sbp->s_nsegments); 379 nilfs->ns_r_segments_percentage = 380 le32_to_cpu(sbp->s_r_segments_percentage); 381 nilfs->ns_nrsvsegs = 382 max_t(unsigned long, NILFS_MIN_NRSVSEGS, 383 DIV_ROUND_UP(nilfs->ns_nsegments * 384 nilfs->ns_r_segments_percentage, 100)); 385 nilfs->ns_crc_seed = le32_to_cpu(sbp->s_crc_seed); 386 return 0; 387 } 388 389 static int nilfs_valid_sb(struct nilfs_super_block *sbp) 390 { 391 static unsigned char sum[4]; 392 const int sumoff = offsetof(struct nilfs_super_block, s_sum); 393 size_t bytes; 394 u32 crc; 395 396 if (!sbp || le16_to_cpu(sbp->s_magic) != NILFS_SUPER_MAGIC) 397 return 0; 398 bytes = le16_to_cpu(sbp->s_bytes); 399 if (bytes > BLOCK_SIZE) 400 return 0; 401 crc = crc32_le(le32_to_cpu(sbp->s_crc_seed), (unsigned char *)sbp, 402 sumoff); 403 crc = crc32_le(crc, sum, 4); 404 crc = crc32_le(crc, (unsigned char *)sbp + sumoff + 4, 405 bytes - sumoff - 4); 406 return crc == le32_to_cpu(sbp->s_sum); 407 } 408 409 static int nilfs_sb2_bad_offset(struct nilfs_super_block *sbp, u64 offset) 410 { 411 return offset < ((le64_to_cpu(sbp->s_nsegments) * 412 le32_to_cpu(sbp->s_blocks_per_segment)) << 413 (le32_to_cpu(sbp->s_log_block_size) + 10)); 414 } 415 416 static void nilfs_release_super_block(struct the_nilfs *nilfs) 417 { 418 int i; 419 420 for (i = 0; i < 2; i++) { 421 if (nilfs->ns_sbp[i]) { 422 brelse(nilfs->ns_sbh[i]); 423 nilfs->ns_sbh[i] = NULL; 424 nilfs->ns_sbp[i] = NULL; 425 } 426 } 427 } 428 429 void nilfs_fall_back_super_block(struct the_nilfs *nilfs) 430 { 431 brelse(nilfs->ns_sbh[0]); 432 nilfs->ns_sbh[0] = nilfs->ns_sbh[1]; 433 nilfs->ns_sbp[0] = nilfs->ns_sbp[1]; 434 nilfs->ns_sbh[1] = NULL; 435 nilfs->ns_sbp[1] = NULL; 436 } 437 438 void nilfs_swap_super_block(struct the_nilfs *nilfs) 439 { 440 struct buffer_head *tsbh = nilfs->ns_sbh[0]; 441 struct nilfs_super_block *tsbp = nilfs->ns_sbp[0]; 442 443 nilfs->ns_sbh[0] = nilfs->ns_sbh[1]; 444 nilfs->ns_sbp[0] = nilfs->ns_sbp[1]; 445 nilfs->ns_sbh[1] = tsbh; 446 nilfs->ns_sbp[1] = tsbp; 447 } 448 449 static int nilfs_load_super_block(struct the_nilfs *nilfs, 450 struct super_block *sb, int blocksize, 451 struct nilfs_super_block **sbpp) 452 { 453 struct nilfs_super_block **sbp = nilfs->ns_sbp; 454 struct buffer_head **sbh = nilfs->ns_sbh; 455 u64 sb2off = NILFS_SB2_OFFSET_BYTES(nilfs->ns_bdev->bd_inode->i_size); 456 int valid[2], swp = 0; 457 458 sbp[0] = nilfs_read_super_block(sb, NILFS_SB_OFFSET_BYTES, blocksize, 459 &sbh[0]); 460 sbp[1] = nilfs_read_super_block(sb, sb2off, blocksize, &sbh[1]); 461 462 if (!sbp[0]) { 463 if (!sbp[1]) { 464 printk(KERN_ERR "NILFS: unable to read superblock\n"); 465 return -EIO; 466 } 467 printk(KERN_WARNING 468 "NILFS warning: unable to read primary superblock\n"); 469 } else if (!sbp[1]) 470 printk(KERN_WARNING 471 "NILFS warning: unable to read secondary superblock\n"); 472 473 valid[0] = nilfs_valid_sb(sbp[0]); 474 valid[1] = nilfs_valid_sb(sbp[1]); 475 swp = valid[1] && 476 (!valid[0] || 477 le64_to_cpu(sbp[1]->s_wtime) > le64_to_cpu(sbp[0]->s_wtime)); 478 479 if (valid[swp] && nilfs_sb2_bad_offset(sbp[swp], sb2off)) { 480 brelse(sbh[1]); 481 sbh[1] = NULL; 482 sbp[1] = NULL; 483 swp = 0; 484 } 485 if (!valid[swp]) { 486 nilfs_release_super_block(nilfs); 487 printk(KERN_ERR "NILFS: Can't find nilfs on dev %s.\n", 488 sb->s_id); 489 return -EINVAL; 490 } 491 492 if (swp) { 493 printk(KERN_WARNING "NILFS warning: broken superblock. " 494 "using spare superblock.\n"); 495 nilfs_swap_super_block(nilfs); 496 } 497 498 nilfs->ns_sbwtime[0] = le64_to_cpu(sbp[0]->s_wtime); 499 nilfs->ns_sbwtime[1] = valid[!swp] ? le64_to_cpu(sbp[1]->s_wtime) : 0; 500 nilfs->ns_prot_seq = le64_to_cpu(sbp[valid[1] & !swp]->s_last_seq); 501 *sbpp = sbp[0]; 502 return 0; 503 } 504 505 /** 506 * init_nilfs - initialize a NILFS instance. 507 * @nilfs: the_nilfs structure 508 * @sbi: nilfs_sb_info 509 * @sb: super block 510 * @data: mount options 511 * 512 * init_nilfs() performs common initialization per block device (e.g. 513 * reading the super block, getting disk layout information, initializing 514 * shared fields in the_nilfs). It takes on some portion of the jobs 515 * typically done by a fill_super() routine. This division arises from 516 * the nature that multiple NILFS instances may be simultaneously 517 * mounted on a device. 518 * For multiple mounts on the same device, only the first mount 519 * invokes these tasks. 520 * 521 * Return Value: On success, 0 is returned. On error, a negative error 522 * code is returned. 523 */ 524 int init_nilfs(struct the_nilfs *nilfs, struct nilfs_sb_info *sbi, char *data) 525 { 526 struct super_block *sb = sbi->s_super; 527 struct nilfs_super_block *sbp; 528 struct backing_dev_info *bdi; 529 int blocksize; 530 int err; 531 532 down_write(&nilfs->ns_sem); 533 if (nilfs_init(nilfs)) { 534 /* Load values from existing the_nilfs */ 535 sbp = nilfs->ns_sbp[0]; 536 err = nilfs_store_magic_and_option(sb, sbp, data); 537 if (err) 538 goto out; 539 540 blocksize = BLOCK_SIZE << le32_to_cpu(sbp->s_log_block_size); 541 if (sb->s_blocksize != blocksize && 542 !sb_set_blocksize(sb, blocksize)) { 543 printk(KERN_ERR "NILFS: blocksize %d unfit to device\n", 544 blocksize); 545 err = -EINVAL; 546 } 547 sb->s_maxbytes = nilfs_max_size(sb->s_blocksize_bits); 548 goto out; 549 } 550 551 blocksize = sb_min_blocksize(sb, BLOCK_SIZE); 552 if (!blocksize) { 553 printk(KERN_ERR "NILFS: unable to set blocksize\n"); 554 err = -EINVAL; 555 goto out; 556 } 557 err = nilfs_load_super_block(nilfs, sb, blocksize, &sbp); 558 if (err) 559 goto out; 560 561 err = nilfs_store_magic_and_option(sb, sbp, data); 562 if (err) 563 goto failed_sbh; 564 565 blocksize = BLOCK_SIZE << le32_to_cpu(sbp->s_log_block_size); 566 if (sb->s_blocksize != blocksize) { 567 int hw_blocksize = bdev_logical_block_size(sb->s_bdev); 568 569 if (blocksize < hw_blocksize) { 570 printk(KERN_ERR 571 "NILFS: blocksize %d too small for device " 572 "(sector-size = %d).\n", 573 blocksize, hw_blocksize); 574 err = -EINVAL; 575 goto failed_sbh; 576 } 577 nilfs_release_super_block(nilfs); 578 sb_set_blocksize(sb, blocksize); 579 580 err = nilfs_load_super_block(nilfs, sb, blocksize, &sbp); 581 if (err) 582 goto out; 583 /* not failed_sbh; sbh is released automatically 584 when reloading fails. */ 585 } 586 nilfs->ns_blocksize_bits = sb->s_blocksize_bits; 587 588 err = nilfs_store_disk_layout(nilfs, sbp); 589 if (err) 590 goto failed_sbh; 591 592 sb->s_maxbytes = nilfs_max_size(sb->s_blocksize_bits); 593 594 nilfs->ns_mount_state = le16_to_cpu(sbp->s_state); 595 596 bdi = nilfs->ns_bdev->bd_inode->i_mapping->backing_dev_info; 597 nilfs->ns_bdi = bdi ? : &default_backing_dev_info; 598 599 /* Finding last segment */ 600 nilfs->ns_last_pseg = le64_to_cpu(sbp->s_last_pseg); 601 nilfs->ns_last_cno = le64_to_cpu(sbp->s_last_cno); 602 nilfs->ns_last_seq = le64_to_cpu(sbp->s_last_seq); 603 604 nilfs->ns_seg_seq = nilfs->ns_last_seq; 605 nilfs->ns_segnum = 606 nilfs_get_segnum_of_block(nilfs, nilfs->ns_last_pseg); 607 nilfs->ns_cno = nilfs->ns_last_cno + 1; 608 if (nilfs->ns_segnum >= nilfs->ns_nsegments) { 609 printk(KERN_ERR "NILFS invalid last segment number.\n"); 610 err = -EINVAL; 611 goto failed_sbh; 612 } 613 /* Dummy values */ 614 nilfs->ns_free_segments_count = 615 nilfs->ns_nsegments - (nilfs->ns_segnum + 1); 616 617 /* Initialize gcinode cache */ 618 err = nilfs_init_gccache(nilfs); 619 if (err) 620 goto failed_sbh; 621 622 set_nilfs_init(nilfs); 623 err = 0; 624 out: 625 up_write(&nilfs->ns_sem); 626 return err; 627 628 failed_sbh: 629 nilfs_release_super_block(nilfs); 630 goto out; 631 } 632 633 int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks) 634 { 635 struct inode *dat = nilfs_dat_inode(nilfs); 636 unsigned long ncleansegs; 637 638 down_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ 639 ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile); 640 up_read(&NILFS_MDT(dat)->mi_sem); /* XXX */ 641 *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment; 642 return 0; 643 } 644 645 int nilfs_near_disk_full(struct the_nilfs *nilfs) 646 { 647 unsigned long ncleansegs, nincsegs; 648 649 ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile); 650 nincsegs = atomic_read(&nilfs->ns_ndirtyblks) / 651 nilfs->ns_blocks_per_segment + 1; 652 653 return ncleansegs <= nilfs->ns_nrsvsegs + nincsegs; 654 } 655 656 /** 657 * nilfs_find_sbinfo - find existing nilfs_sb_info structure 658 * @nilfs: nilfs object 659 * @rw_mount: mount type (non-zero value for read/write mount) 660 * @cno: checkpoint number (zero for read-only mount) 661 * 662 * nilfs_find_sbinfo() returns the nilfs_sb_info structure which 663 * @rw_mount and @cno (in case of snapshots) matched. If no instance 664 * was found, NULL is returned. Although the super block instance can 665 * be unmounted after this function returns, the nilfs_sb_info struct 666 * is kept on memory until nilfs_put_sbinfo() is called. 667 */ 668 struct nilfs_sb_info *nilfs_find_sbinfo(struct the_nilfs *nilfs, 669 int rw_mount, __u64 cno) 670 { 671 struct nilfs_sb_info *sbi; 672 673 down_read(&nilfs->ns_super_sem); 674 /* 675 * The SNAPSHOT flag and sb->s_flags are supposed to be 676 * protected with nilfs->ns_super_sem. 677 */ 678 sbi = nilfs->ns_current; 679 if (rw_mount) { 680 if (sbi && !(sbi->s_super->s_flags & MS_RDONLY)) 681 goto found; /* read/write mount */ 682 else 683 goto out; 684 } else if (cno == 0) { 685 if (sbi && (sbi->s_super->s_flags & MS_RDONLY)) 686 goto found; /* read-only mount */ 687 else 688 goto out; 689 } 690 691 list_for_each_entry(sbi, &nilfs->ns_supers, s_list) { 692 if (nilfs_test_opt(sbi, SNAPSHOT) && 693 sbi->s_snapshot_cno == cno) 694 goto found; /* snapshot mount */ 695 } 696 out: 697 up_read(&nilfs->ns_super_sem); 698 return NULL; 699 700 found: 701 atomic_inc(&sbi->s_count); 702 up_read(&nilfs->ns_super_sem); 703 return sbi; 704 } 705 706 int nilfs_checkpoint_is_mounted(struct the_nilfs *nilfs, __u64 cno, 707 int snapshot_mount) 708 { 709 struct nilfs_sb_info *sbi; 710 int ret = 0; 711 712 down_read(&nilfs->ns_super_sem); 713 if (cno == 0 || cno > nilfs->ns_cno) 714 goto out_unlock; 715 716 list_for_each_entry(sbi, &nilfs->ns_supers, s_list) { 717 if (sbi->s_snapshot_cno == cno && 718 (!snapshot_mount || nilfs_test_opt(sbi, SNAPSHOT))) { 719 /* exclude read-only mounts */ 720 ret++; 721 break; 722 } 723 } 724 /* for protecting recent checkpoints */ 725 if (cno >= nilfs_last_cno(nilfs)) 726 ret++; 727 728 out_unlock: 729 up_read(&nilfs->ns_super_sem); 730 return ret; 731 } 732