root/fs/nilfs2/the_nilfs.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. nilfs_set_last_segment
  2. alloc_nilfs
  3. destroy_nilfs
  4. nilfs_load_super_root
  5. nilfs_init_recovery_info
  6. nilfs_clear_recovery_info
  7. nilfs_store_log_cursor
  8. load_nilfs
  9. nilfs_max_size
  10. nilfs_nrsvsegs
  11. nilfs_set_nsegments
  12. nilfs_store_disk_layout
  13. nilfs_valid_sb
  14. nilfs_sb2_bad_offset
  15. nilfs_release_super_block
  16. nilfs_fall_back_super_block
  17. nilfs_swap_super_block
  18. nilfs_load_super_block
  19. init_nilfs
  20. nilfs_discard_segments
  21. nilfs_count_free_blocks
  22. nilfs_near_disk_full
  23. nilfs_lookup_root
  24. nilfs_find_or_create_root
  25. nilfs_put_root

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * the_nilfs.c - the_nilfs shared structure.
   4  *
   5  * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
   6  *
   7  * Written by Ryusuke Konishi.
   8  *
   9  */
  10 
  11 #include <linux/buffer_head.h>
  12 #include <linux/slab.h>
  13 #include <linux/blkdev.h>
  14 #include <linux/backing-dev.h>
  15 #include <linux/random.h>
  16 #include <linux/crc32.h>
  17 #include "nilfs.h"
  18 #include "segment.h"
  19 #include "alloc.h"
  20 #include "cpfile.h"
  21 #include "sufile.h"
  22 #include "dat.h"
  23 #include "segbuf.h"
  24 
  25 
  26 static int nilfs_valid_sb(struct nilfs_super_block *sbp);
  27 
  28 void nilfs_set_last_segment(struct the_nilfs *nilfs,
  29                             sector_t start_blocknr, u64 seq, __u64 cno)
  30 {
  31         spin_lock(&nilfs->ns_last_segment_lock);
  32         nilfs->ns_last_pseg = start_blocknr;
  33         nilfs->ns_last_seq = seq;
  34         nilfs->ns_last_cno = cno;
  35 
  36         if (!nilfs_sb_dirty(nilfs)) {
  37                 if (nilfs->ns_prev_seq == nilfs->ns_last_seq)
  38                         goto stay_cursor;
  39 
  40                 set_nilfs_sb_dirty(nilfs);
  41         }
  42         nilfs->ns_prev_seq = nilfs->ns_last_seq;
  43 
  44  stay_cursor:
  45         spin_unlock(&nilfs->ns_last_segment_lock);
  46 }
  47 
  48 /**
  49  * alloc_nilfs - allocate a nilfs object
  50  * @sb: super block instance
  51  *
  52  * Return Value: On success, pointer to the_nilfs is returned.
  53  * On error, NULL is returned.
  54  */
  55 struct the_nilfs *alloc_nilfs(struct super_block *sb)
  56 {
  57         struct the_nilfs *nilfs;
  58 
  59         nilfs = kzalloc(sizeof(*nilfs), GFP_KERNEL);
  60         if (!nilfs)
  61                 return NULL;
  62 
  63         nilfs->ns_sb = sb;
  64         nilfs->ns_bdev = sb->s_bdev;
  65         atomic_set(&nilfs->ns_ndirtyblks, 0);
  66         init_rwsem(&nilfs->ns_sem);
  67         mutex_init(&nilfs->ns_snapshot_mount_mutex);
  68         INIT_LIST_HEAD(&nilfs->ns_dirty_files);
  69         INIT_LIST_HEAD(&nilfs->ns_gc_inodes);
  70         spin_lock_init(&nilfs->ns_inode_lock);
  71         spin_lock_init(&nilfs->ns_next_gen_lock);
  72         spin_lock_init(&nilfs->ns_last_segment_lock);
  73         nilfs->ns_cptree = RB_ROOT;
  74         spin_lock_init(&nilfs->ns_cptree_lock);
  75         init_rwsem(&nilfs->ns_segctor_sem);
  76         nilfs->ns_sb_update_freq = NILFS_SB_FREQ;
  77 
  78         return nilfs;
  79 }
  80 
  81 /**
  82  * destroy_nilfs - destroy nilfs object
  83  * @nilfs: nilfs object to be released
  84  */
  85 void destroy_nilfs(struct the_nilfs *nilfs)
  86 {
  87         might_sleep();
  88         if (nilfs_init(nilfs)) {
  89                 nilfs_sysfs_delete_device_group(nilfs);
  90                 brelse(nilfs->ns_sbh[0]);
  91                 brelse(nilfs->ns_sbh[1]);
  92         }
  93         kfree(nilfs);
  94 }
  95 
  96 static int nilfs_load_super_root(struct the_nilfs *nilfs,
  97                                  struct super_block *sb, sector_t sr_block)
  98 {
  99         struct buffer_head *bh_sr;
 100         struct nilfs_super_root *raw_sr;
 101         struct nilfs_super_block **sbp = nilfs->ns_sbp;
 102         struct nilfs_inode *rawi;
 103         unsigned int dat_entry_size, segment_usage_size, checkpoint_size;
 104         unsigned int inode_size;
 105         int err;
 106 
 107         err = nilfs_read_super_root_block(nilfs, sr_block, &bh_sr, 1);
 108         if (unlikely(err))
 109                 return err;
 110 
 111         down_read(&nilfs->ns_sem);
 112         dat_entry_size = le16_to_cpu(sbp[0]->s_dat_entry_size);
 113         checkpoint_size = le16_to_cpu(sbp[0]->s_checkpoint_size);
 114         segment_usage_size = le16_to_cpu(sbp[0]->s_segment_usage_size);
 115         up_read(&nilfs->ns_sem);
 116 
 117         inode_size = nilfs->ns_inode_size;
 118 
 119         rawi = (void *)bh_sr->b_data + NILFS_SR_DAT_OFFSET(inode_size);
 120         err = nilfs_dat_read(sb, dat_entry_size, rawi, &nilfs->ns_dat);
 121         if (err)
 122                 goto failed;
 123 
 124         rawi = (void *)bh_sr->b_data + NILFS_SR_CPFILE_OFFSET(inode_size);
 125         err = nilfs_cpfile_read(sb, checkpoint_size, rawi, &nilfs->ns_cpfile);
 126         if (err)
 127                 goto failed_dat;
 128 
 129         rawi = (void *)bh_sr->b_data + NILFS_SR_SUFILE_OFFSET(inode_size);
 130         err = nilfs_sufile_read(sb, segment_usage_size, rawi,
 131                                 &nilfs->ns_sufile);
 132         if (err)
 133                 goto failed_cpfile;
 134 
 135         raw_sr = (struct nilfs_super_root *)bh_sr->b_data;
 136         nilfs->ns_nongc_ctime = le64_to_cpu(raw_sr->sr_nongc_ctime);
 137 
 138  failed:
 139         brelse(bh_sr);
 140         return err;
 141 
 142  failed_cpfile:
 143         iput(nilfs->ns_cpfile);
 144 
 145  failed_dat:
 146         iput(nilfs->ns_dat);
 147         goto failed;
 148 }
 149 
 150 static void nilfs_init_recovery_info(struct nilfs_recovery_info *ri)
 151 {
 152         memset(ri, 0, sizeof(*ri));
 153         INIT_LIST_HEAD(&ri->ri_used_segments);
 154 }
 155 
 156 static void nilfs_clear_recovery_info(struct nilfs_recovery_info *ri)
 157 {
 158         nilfs_dispose_segment_list(&ri->ri_used_segments);
 159 }
 160 
 161 /**
 162  * nilfs_store_log_cursor - load log cursor from a super block
 163  * @nilfs: nilfs object
 164  * @sbp: buffer storing super block to be read
 165  *
 166  * nilfs_store_log_cursor() reads the last position of the log
 167  * containing a super root from a given super block, and initializes
 168  * relevant information on the nilfs object preparatory for log
 169  * scanning and recovery.
 170  */
 171 static int nilfs_store_log_cursor(struct the_nilfs *nilfs,
 172                                   struct nilfs_super_block *sbp)
 173 {
 174         int ret = 0;
 175 
 176         nilfs->ns_last_pseg = le64_to_cpu(sbp->s_last_pseg);
 177         nilfs->ns_last_cno = le64_to_cpu(sbp->s_last_cno);
 178         nilfs->ns_last_seq = le64_to_cpu(sbp->s_last_seq);
 179 
 180         nilfs->ns_prev_seq = nilfs->ns_last_seq;
 181         nilfs->ns_seg_seq = nilfs->ns_last_seq;
 182         nilfs->ns_segnum =
 183                 nilfs_get_segnum_of_block(nilfs, nilfs->ns_last_pseg);
 184         nilfs->ns_cno = nilfs->ns_last_cno + 1;
 185         if (nilfs->ns_segnum >= nilfs->ns_nsegments) {
 186                 nilfs_msg(nilfs->ns_sb, KERN_ERR,
 187                           "pointed segment number is out of range: segnum=%llu, nsegments=%lu",
 188                           (unsigned long long)nilfs->ns_segnum,
 189                           nilfs->ns_nsegments);
 190                 ret = -EINVAL;
 191         }
 192         return ret;
 193 }
 194 
 195 /**
 196  * load_nilfs - load and recover the nilfs
 197  * @nilfs: the_nilfs structure to be released
 198  * @sb: super block isntance used to recover past segment
 199  *
 200  * load_nilfs() searches and load the latest super root,
 201  * attaches the last segment, and does recovery if needed.
 202  * The caller must call this exclusively for simultaneous mounts.
 203  */
 204 int load_nilfs(struct the_nilfs *nilfs, struct super_block *sb)
 205 {
 206         struct nilfs_recovery_info ri;
 207         unsigned int s_flags = sb->s_flags;
 208         int really_read_only = bdev_read_only(nilfs->ns_bdev);
 209         int valid_fs = nilfs_valid_fs(nilfs);
 210         int err;
 211 
 212         if (!valid_fs) {
 213                 nilfs_msg(sb, KERN_WARNING, "mounting unchecked fs");
 214                 if (s_flags & SB_RDONLY) {
 215                         nilfs_msg(sb, KERN_INFO,
 216                                   "recovery required for readonly filesystem");
 217                         nilfs_msg(sb, KERN_INFO,
 218                                   "write access will be enabled during recovery");
 219                 }
 220         }
 221 
 222         nilfs_init_recovery_info(&ri);
 223 
 224         err = nilfs_search_super_root(nilfs, &ri);
 225         if (unlikely(err)) {
 226                 struct nilfs_super_block **sbp = nilfs->ns_sbp;
 227                 int blocksize;
 228 
 229                 if (err != -EINVAL)
 230                         goto scan_error;
 231 
 232                 if (!nilfs_valid_sb(sbp[1])) {
 233                         nilfs_msg(sb, KERN_WARNING,
 234                                   "unable to fall back to spare super block");
 235                         goto scan_error;
 236                 }
 237                 nilfs_msg(sb, KERN_INFO,
 238                           "trying rollback from an earlier position");
 239 
 240                 /*
 241                  * restore super block with its spare and reconfigure
 242                  * relevant states of the nilfs object.
 243                  */
 244                 memcpy(sbp[0], sbp[1], nilfs->ns_sbsize);
 245                 nilfs->ns_crc_seed = le32_to_cpu(sbp[0]->s_crc_seed);
 246                 nilfs->ns_sbwtime = le64_to_cpu(sbp[0]->s_wtime);
 247 
 248                 /* verify consistency between two super blocks */
 249                 blocksize = BLOCK_SIZE << le32_to_cpu(sbp[0]->s_log_block_size);
 250                 if (blocksize != nilfs->ns_blocksize) {
 251                         nilfs_msg(sb, KERN_WARNING,
 252                                   "blocksize differs between two super blocks (%d != %d)",
 253                                   blocksize, nilfs->ns_blocksize);
 254                         goto scan_error;
 255                 }
 256 
 257                 err = nilfs_store_log_cursor(nilfs, sbp[0]);
 258                 if (err)
 259                         goto scan_error;
 260 
 261                 /* drop clean flag to allow roll-forward and recovery */
 262                 nilfs->ns_mount_state &= ~NILFS_VALID_FS;
 263                 valid_fs = 0;
 264 
 265                 err = nilfs_search_super_root(nilfs, &ri);
 266                 if (err)
 267                         goto scan_error;
 268         }
 269 
 270         err = nilfs_load_super_root(nilfs, sb, ri.ri_super_root);
 271         if (unlikely(err)) {
 272                 nilfs_msg(sb, KERN_ERR, "error %d while loading super root",
 273                           err);
 274                 goto failed;
 275         }
 276 
 277         if (valid_fs)
 278                 goto skip_recovery;
 279 
 280         if (s_flags & SB_RDONLY) {
 281                 __u64 features;
 282 
 283                 if (nilfs_test_opt(nilfs, NORECOVERY)) {
 284                         nilfs_msg(sb, KERN_INFO,
 285                                   "norecovery option specified, skipping roll-forward recovery");
 286                         goto skip_recovery;
 287                 }
 288                 features = le64_to_cpu(nilfs->ns_sbp[0]->s_feature_compat_ro) &
 289                         ~NILFS_FEATURE_COMPAT_RO_SUPP;
 290                 if (features) {
 291                         nilfs_msg(sb, KERN_ERR,
 292                                   "couldn't proceed with recovery because of unsupported optional features (%llx)",
 293                                   (unsigned long long)features);
 294                         err = -EROFS;
 295                         goto failed_unload;
 296                 }
 297                 if (really_read_only) {
 298                         nilfs_msg(sb, KERN_ERR,
 299                                   "write access unavailable, cannot proceed");
 300                         err = -EROFS;
 301                         goto failed_unload;
 302                 }
 303                 sb->s_flags &= ~SB_RDONLY;
 304         } else if (nilfs_test_opt(nilfs, NORECOVERY)) {
 305                 nilfs_msg(sb, KERN_ERR,
 306                           "recovery cancelled because norecovery option was specified for a read/write mount");
 307                 err = -EINVAL;
 308                 goto failed_unload;
 309         }
 310 
 311         err = nilfs_salvage_orphan_logs(nilfs, sb, &ri);
 312         if (err)
 313                 goto failed_unload;
 314 
 315         down_write(&nilfs->ns_sem);
 316         nilfs->ns_mount_state |= NILFS_VALID_FS; /* set "clean" flag */
 317         err = nilfs_cleanup_super(sb);
 318         up_write(&nilfs->ns_sem);
 319 
 320         if (err) {
 321                 nilfs_msg(sb, KERN_ERR,
 322                           "error %d updating super block. recovery unfinished.",
 323                           err);
 324                 goto failed_unload;
 325         }
 326         nilfs_msg(sb, KERN_INFO, "recovery complete");
 327 
 328  skip_recovery:
 329         nilfs_clear_recovery_info(&ri);
 330         sb->s_flags = s_flags;
 331         return 0;
 332 
 333  scan_error:
 334         nilfs_msg(sb, KERN_ERR, "error %d while searching super root", err);
 335         goto failed;
 336 
 337  failed_unload:
 338         iput(nilfs->ns_cpfile);
 339         iput(nilfs->ns_sufile);
 340         iput(nilfs->ns_dat);
 341 
 342  failed:
 343         nilfs_clear_recovery_info(&ri);
 344         sb->s_flags = s_flags;
 345         return err;
 346 }
 347 
 348 static unsigned long long nilfs_max_size(unsigned int blkbits)
 349 {
 350         unsigned int max_bits;
 351         unsigned long long res = MAX_LFS_FILESIZE; /* page cache limit */
 352 
 353         max_bits = blkbits + NILFS_BMAP_KEY_BIT; /* bmap size limit */
 354         if (max_bits < 64)
 355                 res = min_t(unsigned long long, res, (1ULL << max_bits) - 1);
 356         return res;
 357 }
 358 
 359 /**
 360  * nilfs_nrsvsegs - calculate the number of reserved segments
 361  * @nilfs: nilfs object
 362  * @nsegs: total number of segments
 363  */
 364 unsigned long nilfs_nrsvsegs(struct the_nilfs *nilfs, unsigned long nsegs)
 365 {
 366         return max_t(unsigned long, NILFS_MIN_NRSVSEGS,
 367                      DIV_ROUND_UP(nsegs * nilfs->ns_r_segments_percentage,
 368                                   100));
 369 }
 370 
 371 void nilfs_set_nsegments(struct the_nilfs *nilfs, unsigned long nsegs)
 372 {
 373         nilfs->ns_nsegments = nsegs;
 374         nilfs->ns_nrsvsegs = nilfs_nrsvsegs(nilfs, nsegs);
 375 }
 376 
 377 static int nilfs_store_disk_layout(struct the_nilfs *nilfs,
 378                                    struct nilfs_super_block *sbp)
 379 {
 380         if (le32_to_cpu(sbp->s_rev_level) < NILFS_MIN_SUPP_REV) {
 381                 nilfs_msg(nilfs->ns_sb, KERN_ERR,
 382                           "unsupported revision (superblock rev.=%d.%d, current rev.=%d.%d). Please check the version of mkfs.nilfs(2).",
 383                           le32_to_cpu(sbp->s_rev_level),
 384                           le16_to_cpu(sbp->s_minor_rev_level),
 385                           NILFS_CURRENT_REV, NILFS_MINOR_REV);
 386                 return -EINVAL;
 387         }
 388         nilfs->ns_sbsize = le16_to_cpu(sbp->s_bytes);
 389         if (nilfs->ns_sbsize > BLOCK_SIZE)
 390                 return -EINVAL;
 391 
 392         nilfs->ns_inode_size = le16_to_cpu(sbp->s_inode_size);
 393         if (nilfs->ns_inode_size > nilfs->ns_blocksize) {
 394                 nilfs_msg(nilfs->ns_sb, KERN_ERR,
 395                           "too large inode size: %d bytes",
 396                           nilfs->ns_inode_size);
 397                 return -EINVAL;
 398         } else if (nilfs->ns_inode_size < NILFS_MIN_INODE_SIZE) {
 399                 nilfs_msg(nilfs->ns_sb, KERN_ERR,
 400                           "too small inode size: %d bytes",
 401                           nilfs->ns_inode_size);
 402                 return -EINVAL;
 403         }
 404 
 405         nilfs->ns_first_ino = le32_to_cpu(sbp->s_first_ino);
 406 
 407         nilfs->ns_blocks_per_segment = le32_to_cpu(sbp->s_blocks_per_segment);
 408         if (nilfs->ns_blocks_per_segment < NILFS_SEG_MIN_BLOCKS) {
 409                 nilfs_msg(nilfs->ns_sb, KERN_ERR,
 410                           "too short segment: %lu blocks",
 411                           nilfs->ns_blocks_per_segment);
 412                 return -EINVAL;
 413         }
 414 
 415         nilfs->ns_first_data_block = le64_to_cpu(sbp->s_first_data_block);
 416         nilfs->ns_r_segments_percentage =
 417                 le32_to_cpu(sbp->s_r_segments_percentage);
 418         if (nilfs->ns_r_segments_percentage < 1 ||
 419             nilfs->ns_r_segments_percentage > 99) {
 420                 nilfs_msg(nilfs->ns_sb, KERN_ERR,
 421                           "invalid reserved segments percentage: %lu",
 422                           nilfs->ns_r_segments_percentage);
 423                 return -EINVAL;
 424         }
 425 
 426         nilfs_set_nsegments(nilfs, le64_to_cpu(sbp->s_nsegments));
 427         nilfs->ns_crc_seed = le32_to_cpu(sbp->s_crc_seed);
 428         return 0;
 429 }
 430 
 431 static int nilfs_valid_sb(struct nilfs_super_block *sbp)
 432 {
 433         static unsigned char sum[4];
 434         const int sumoff = offsetof(struct nilfs_super_block, s_sum);
 435         size_t bytes;
 436         u32 crc;
 437 
 438         if (!sbp || le16_to_cpu(sbp->s_magic) != NILFS_SUPER_MAGIC)
 439                 return 0;
 440         bytes = le16_to_cpu(sbp->s_bytes);
 441         if (bytes < sumoff + 4 || bytes > BLOCK_SIZE)
 442                 return 0;
 443         crc = crc32_le(le32_to_cpu(sbp->s_crc_seed), (unsigned char *)sbp,
 444                        sumoff);
 445         crc = crc32_le(crc, sum, 4);
 446         crc = crc32_le(crc, (unsigned char *)sbp + sumoff + 4,
 447                        bytes - sumoff - 4);
 448         return crc == le32_to_cpu(sbp->s_sum);
 449 }
 450 
 451 static int nilfs_sb2_bad_offset(struct nilfs_super_block *sbp, u64 offset)
 452 {
 453         return offset < ((le64_to_cpu(sbp->s_nsegments) *
 454                           le32_to_cpu(sbp->s_blocks_per_segment)) <<
 455                          (le32_to_cpu(sbp->s_log_block_size) + 10));
 456 }
 457 
 458 static void nilfs_release_super_block(struct the_nilfs *nilfs)
 459 {
 460         int i;
 461 
 462         for (i = 0; i < 2; i++) {
 463                 if (nilfs->ns_sbp[i]) {
 464                         brelse(nilfs->ns_sbh[i]);
 465                         nilfs->ns_sbh[i] = NULL;
 466                         nilfs->ns_sbp[i] = NULL;
 467                 }
 468         }
 469 }
 470 
 471 void nilfs_fall_back_super_block(struct the_nilfs *nilfs)
 472 {
 473         brelse(nilfs->ns_sbh[0]);
 474         nilfs->ns_sbh[0] = nilfs->ns_sbh[1];
 475         nilfs->ns_sbp[0] = nilfs->ns_sbp[1];
 476         nilfs->ns_sbh[1] = NULL;
 477         nilfs->ns_sbp[1] = NULL;
 478 }
 479 
 480 void nilfs_swap_super_block(struct the_nilfs *nilfs)
 481 {
 482         struct buffer_head *tsbh = nilfs->ns_sbh[0];
 483         struct nilfs_super_block *tsbp = nilfs->ns_sbp[0];
 484 
 485         nilfs->ns_sbh[0] = nilfs->ns_sbh[1];
 486         nilfs->ns_sbp[0] = nilfs->ns_sbp[1];
 487         nilfs->ns_sbh[1] = tsbh;
 488         nilfs->ns_sbp[1] = tsbp;
 489 }
 490 
 491 static int nilfs_load_super_block(struct the_nilfs *nilfs,
 492                                   struct super_block *sb, int blocksize,
 493                                   struct nilfs_super_block **sbpp)
 494 {
 495         struct nilfs_super_block **sbp = nilfs->ns_sbp;
 496         struct buffer_head **sbh = nilfs->ns_sbh;
 497         u64 sb2off = NILFS_SB2_OFFSET_BYTES(nilfs->ns_bdev->bd_inode->i_size);
 498         int valid[2], swp = 0;
 499 
 500         sbp[0] = nilfs_read_super_block(sb, NILFS_SB_OFFSET_BYTES, blocksize,
 501                                         &sbh[0]);
 502         sbp[1] = nilfs_read_super_block(sb, sb2off, blocksize, &sbh[1]);
 503 
 504         if (!sbp[0]) {
 505                 if (!sbp[1]) {
 506                         nilfs_msg(sb, KERN_ERR, "unable to read superblock");
 507                         return -EIO;
 508                 }
 509                 nilfs_msg(sb, KERN_WARNING,
 510                           "unable to read primary superblock (blocksize = %d)",
 511                           blocksize);
 512         } else if (!sbp[1]) {
 513                 nilfs_msg(sb, KERN_WARNING,
 514                           "unable to read secondary superblock (blocksize = %d)",
 515                           blocksize);
 516         }
 517 
 518         /*
 519          * Compare two super blocks and set 1 in swp if the secondary
 520          * super block is valid and newer.  Otherwise, set 0 in swp.
 521          */
 522         valid[0] = nilfs_valid_sb(sbp[0]);
 523         valid[1] = nilfs_valid_sb(sbp[1]);
 524         swp = valid[1] && (!valid[0] ||
 525                            le64_to_cpu(sbp[1]->s_last_cno) >
 526                            le64_to_cpu(sbp[0]->s_last_cno));
 527 
 528         if (valid[swp] && nilfs_sb2_bad_offset(sbp[swp], sb2off)) {
 529                 brelse(sbh[1]);
 530                 sbh[1] = NULL;
 531                 sbp[1] = NULL;
 532                 valid[1] = 0;
 533                 swp = 0;
 534         }
 535         if (!valid[swp]) {
 536                 nilfs_release_super_block(nilfs);
 537                 nilfs_msg(sb, KERN_ERR, "couldn't find nilfs on the device");
 538                 return -EINVAL;
 539         }
 540 
 541         if (!valid[!swp])
 542                 nilfs_msg(sb, KERN_WARNING,
 543                           "broken superblock, retrying with spare superblock (blocksize = %d)",
 544                           blocksize);
 545         if (swp)
 546                 nilfs_swap_super_block(nilfs);
 547 
 548         nilfs->ns_sbwcount = 0;
 549         nilfs->ns_sbwtime = le64_to_cpu(sbp[0]->s_wtime);
 550         nilfs->ns_prot_seq = le64_to_cpu(sbp[valid[1] & !swp]->s_last_seq);
 551         *sbpp = sbp[0];
 552         return 0;
 553 }
 554 
 555 /**
 556  * init_nilfs - initialize a NILFS instance.
 557  * @nilfs: the_nilfs structure
 558  * @sb: super block
 559  * @data: mount options
 560  *
 561  * init_nilfs() performs common initialization per block device (e.g.
 562  * reading the super block, getting disk layout information, initializing
 563  * shared fields in the_nilfs).
 564  *
 565  * Return Value: On success, 0 is returned. On error, a negative error
 566  * code is returned.
 567  */
 568 int init_nilfs(struct the_nilfs *nilfs, struct super_block *sb, char *data)
 569 {
 570         struct nilfs_super_block *sbp;
 571         int blocksize;
 572         int err;
 573 
 574         down_write(&nilfs->ns_sem);
 575 
 576         blocksize = sb_min_blocksize(sb, NILFS_MIN_BLOCK_SIZE);
 577         if (!blocksize) {
 578                 nilfs_msg(sb, KERN_ERR, "unable to set blocksize");
 579                 err = -EINVAL;
 580                 goto out;
 581         }
 582         err = nilfs_load_super_block(nilfs, sb, blocksize, &sbp);
 583         if (err)
 584                 goto out;
 585 
 586         err = nilfs_store_magic_and_option(sb, sbp, data);
 587         if (err)
 588                 goto failed_sbh;
 589 
 590         err = nilfs_check_feature_compatibility(sb, sbp);
 591         if (err)
 592                 goto failed_sbh;
 593 
 594         blocksize = BLOCK_SIZE << le32_to_cpu(sbp->s_log_block_size);
 595         if (blocksize < NILFS_MIN_BLOCK_SIZE ||
 596             blocksize > NILFS_MAX_BLOCK_SIZE) {
 597                 nilfs_msg(sb, KERN_ERR,
 598                           "couldn't mount because of unsupported filesystem blocksize %d",
 599                           blocksize);
 600                 err = -EINVAL;
 601                 goto failed_sbh;
 602         }
 603         if (sb->s_blocksize != blocksize) {
 604                 int hw_blocksize = bdev_logical_block_size(sb->s_bdev);
 605 
 606                 if (blocksize < hw_blocksize) {
 607                         nilfs_msg(sb, KERN_ERR,
 608                                   "blocksize %d too small for device (sector-size = %d)",
 609                                   blocksize, hw_blocksize);
 610                         err = -EINVAL;
 611                         goto failed_sbh;
 612                 }
 613                 nilfs_release_super_block(nilfs);
 614                 sb_set_blocksize(sb, blocksize);
 615 
 616                 err = nilfs_load_super_block(nilfs, sb, blocksize, &sbp);
 617                 if (err)
 618                         goto out;
 619                         /*
 620                          * Not to failed_sbh; sbh is released automatically
 621                          * when reloading fails.
 622                          */
 623         }
 624         nilfs->ns_blocksize_bits = sb->s_blocksize_bits;
 625         nilfs->ns_blocksize = blocksize;
 626 
 627         get_random_bytes(&nilfs->ns_next_generation,
 628                          sizeof(nilfs->ns_next_generation));
 629 
 630         err = nilfs_store_disk_layout(nilfs, sbp);
 631         if (err)
 632                 goto failed_sbh;
 633 
 634         sb->s_maxbytes = nilfs_max_size(sb->s_blocksize_bits);
 635 
 636         nilfs->ns_mount_state = le16_to_cpu(sbp->s_state);
 637 
 638         err = nilfs_store_log_cursor(nilfs, sbp);
 639         if (err)
 640                 goto failed_sbh;
 641 
 642         err = nilfs_sysfs_create_device_group(sb);
 643         if (err)
 644                 goto failed_sbh;
 645 
 646         set_nilfs_init(nilfs);
 647         err = 0;
 648  out:
 649         up_write(&nilfs->ns_sem);
 650         return err;
 651 
 652  failed_sbh:
 653         nilfs_release_super_block(nilfs);
 654         goto out;
 655 }
 656 
 657 int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump,
 658                             size_t nsegs)
 659 {
 660         sector_t seg_start, seg_end;
 661         sector_t start = 0, nblocks = 0;
 662         unsigned int sects_per_block;
 663         __u64 *sn;
 664         int ret = 0;
 665 
 666         sects_per_block = (1 << nilfs->ns_blocksize_bits) /
 667                 bdev_logical_block_size(nilfs->ns_bdev);
 668         for (sn = segnump; sn < segnump + nsegs; sn++) {
 669                 nilfs_get_segment_range(nilfs, *sn, &seg_start, &seg_end);
 670 
 671                 if (!nblocks) {
 672                         start = seg_start;
 673                         nblocks = seg_end - seg_start + 1;
 674                 } else if (start + nblocks == seg_start) {
 675                         nblocks += seg_end - seg_start + 1;
 676                 } else {
 677                         ret = blkdev_issue_discard(nilfs->ns_bdev,
 678                                                    start * sects_per_block,
 679                                                    nblocks * sects_per_block,
 680                                                    GFP_NOFS, 0);
 681                         if (ret < 0)
 682                                 return ret;
 683                         nblocks = 0;
 684                 }
 685         }
 686         if (nblocks)
 687                 ret = blkdev_issue_discard(nilfs->ns_bdev,
 688                                            start * sects_per_block,
 689                                            nblocks * sects_per_block,
 690                                            GFP_NOFS, 0);
 691         return ret;
 692 }
 693 
 694 int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks)
 695 {
 696         unsigned long ncleansegs;
 697 
 698         down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
 699         ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile);
 700         up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
 701         *nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment;
 702         return 0;
 703 }
 704 
 705 int nilfs_near_disk_full(struct the_nilfs *nilfs)
 706 {
 707         unsigned long ncleansegs, nincsegs;
 708 
 709         ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile);
 710         nincsegs = atomic_read(&nilfs->ns_ndirtyblks) /
 711                 nilfs->ns_blocks_per_segment + 1;
 712 
 713         return ncleansegs <= nilfs->ns_nrsvsegs + nincsegs;
 714 }
 715 
 716 struct nilfs_root *nilfs_lookup_root(struct the_nilfs *nilfs, __u64 cno)
 717 {
 718         struct rb_node *n;
 719         struct nilfs_root *root;
 720 
 721         spin_lock(&nilfs->ns_cptree_lock);
 722         n = nilfs->ns_cptree.rb_node;
 723         while (n) {
 724                 root = rb_entry(n, struct nilfs_root, rb_node);
 725 
 726                 if (cno < root->cno) {
 727                         n = n->rb_left;
 728                 } else if (cno > root->cno) {
 729                         n = n->rb_right;
 730                 } else {
 731                         refcount_inc(&root->count);
 732                         spin_unlock(&nilfs->ns_cptree_lock);
 733                         return root;
 734                 }
 735         }
 736         spin_unlock(&nilfs->ns_cptree_lock);
 737 
 738         return NULL;
 739 }
 740 
 741 struct nilfs_root *
 742 nilfs_find_or_create_root(struct the_nilfs *nilfs, __u64 cno)
 743 {
 744         struct rb_node **p, *parent;
 745         struct nilfs_root *root, *new;
 746         int err;
 747 
 748         root = nilfs_lookup_root(nilfs, cno);
 749         if (root)
 750                 return root;
 751 
 752         new = kzalloc(sizeof(*root), GFP_KERNEL);
 753         if (!new)
 754                 return NULL;
 755 
 756         spin_lock(&nilfs->ns_cptree_lock);
 757 
 758         p = &nilfs->ns_cptree.rb_node;
 759         parent = NULL;
 760 
 761         while (*p) {
 762                 parent = *p;
 763                 root = rb_entry(parent, struct nilfs_root, rb_node);
 764 
 765                 if (cno < root->cno) {
 766                         p = &(*p)->rb_left;
 767                 } else if (cno > root->cno) {
 768                         p = &(*p)->rb_right;
 769                 } else {
 770                         refcount_inc(&root->count);
 771                         spin_unlock(&nilfs->ns_cptree_lock);
 772                         kfree(new);
 773                         return root;
 774                 }
 775         }
 776 
 777         new->cno = cno;
 778         new->ifile = NULL;
 779         new->nilfs = nilfs;
 780         refcount_set(&new->count, 1);
 781         atomic64_set(&new->inodes_count, 0);
 782         atomic64_set(&new->blocks_count, 0);
 783 
 784         rb_link_node(&new->rb_node, parent, p);
 785         rb_insert_color(&new->rb_node, &nilfs->ns_cptree);
 786 
 787         spin_unlock(&nilfs->ns_cptree_lock);
 788 
 789         err = nilfs_sysfs_create_snapshot_group(new);
 790         if (err) {
 791                 kfree(new);
 792                 new = NULL;
 793         }
 794 
 795         return new;
 796 }
 797 
 798 void nilfs_put_root(struct nilfs_root *root)
 799 {
 800         if (refcount_dec_and_test(&root->count)) {
 801                 struct the_nilfs *nilfs = root->nilfs;
 802 
 803                 nilfs_sysfs_delete_snapshot_group(root);
 804 
 805                 spin_lock(&nilfs->ns_cptree_lock);
 806                 rb_erase(&root->rb_node, &nilfs->ns_cptree);
 807                 spin_unlock(&nilfs->ns_cptree_lock);
 808                 iput(root->ifile);
 809 
 810                 kfree(root);
 811         }
 812 }

/* [<][>][^][v][top][bottom][index][help] */