cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

the_nilfs.c (20704B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/*
      3 * 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
     26static int nilfs_valid_sb(struct nilfs_super_block *sbp);
     27
     28void 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 */
     55struct 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 */
     85void 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
     96static 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
    150static 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
    156static 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 */
    171static 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_err(nilfs->ns_sb,
    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 instance 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 */
    204int 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_warn(sb, "mounting unchecked fs");
    214		if (s_flags & SB_RDONLY) {
    215			nilfs_info(sb,
    216				   "recovery required for readonly filesystem");
    217			nilfs_info(sb,
    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_warn(sb,
    234				   "unable to fall back to spare super block");
    235			goto scan_error;
    236		}
    237		nilfs_info(sb, "trying rollback from an earlier position");
    238
    239		/*
    240		 * restore super block with its spare and reconfigure
    241		 * relevant states of the nilfs object.
    242		 */
    243		memcpy(sbp[0], sbp[1], nilfs->ns_sbsize);
    244		nilfs->ns_crc_seed = le32_to_cpu(sbp[0]->s_crc_seed);
    245		nilfs->ns_sbwtime = le64_to_cpu(sbp[0]->s_wtime);
    246
    247		/* verify consistency between two super blocks */
    248		blocksize = BLOCK_SIZE << le32_to_cpu(sbp[0]->s_log_block_size);
    249		if (blocksize != nilfs->ns_blocksize) {
    250			nilfs_warn(sb,
    251				   "blocksize differs between two super blocks (%d != %d)",
    252				   blocksize, nilfs->ns_blocksize);
    253			goto scan_error;
    254		}
    255
    256		err = nilfs_store_log_cursor(nilfs, sbp[0]);
    257		if (err)
    258			goto scan_error;
    259
    260		/* drop clean flag to allow roll-forward and recovery */
    261		nilfs->ns_mount_state &= ~NILFS_VALID_FS;
    262		valid_fs = 0;
    263
    264		err = nilfs_search_super_root(nilfs, &ri);
    265		if (err)
    266			goto scan_error;
    267	}
    268
    269	err = nilfs_load_super_root(nilfs, sb, ri.ri_super_root);
    270	if (unlikely(err)) {
    271		nilfs_err(sb, "error %d while loading super root", err);
    272		goto failed;
    273	}
    274
    275	if (valid_fs)
    276		goto skip_recovery;
    277
    278	if (s_flags & SB_RDONLY) {
    279		__u64 features;
    280
    281		if (nilfs_test_opt(nilfs, NORECOVERY)) {
    282			nilfs_info(sb,
    283				   "norecovery option specified, skipping roll-forward recovery");
    284			goto skip_recovery;
    285		}
    286		features = le64_to_cpu(nilfs->ns_sbp[0]->s_feature_compat_ro) &
    287			~NILFS_FEATURE_COMPAT_RO_SUPP;
    288		if (features) {
    289			nilfs_err(sb,
    290				  "couldn't proceed with recovery because of unsupported optional features (%llx)",
    291				  (unsigned long long)features);
    292			err = -EROFS;
    293			goto failed_unload;
    294		}
    295		if (really_read_only) {
    296			nilfs_err(sb,
    297				  "write access unavailable, cannot proceed");
    298			err = -EROFS;
    299			goto failed_unload;
    300		}
    301		sb->s_flags &= ~SB_RDONLY;
    302	} else if (nilfs_test_opt(nilfs, NORECOVERY)) {
    303		nilfs_err(sb,
    304			  "recovery cancelled because norecovery option was specified for a read/write mount");
    305		err = -EINVAL;
    306		goto failed_unload;
    307	}
    308
    309	err = nilfs_salvage_orphan_logs(nilfs, sb, &ri);
    310	if (err)
    311		goto failed_unload;
    312
    313	down_write(&nilfs->ns_sem);
    314	nilfs->ns_mount_state |= NILFS_VALID_FS; /* set "clean" flag */
    315	err = nilfs_cleanup_super(sb);
    316	up_write(&nilfs->ns_sem);
    317
    318	if (err) {
    319		nilfs_err(sb,
    320			  "error %d updating super block. recovery unfinished.",
    321			  err);
    322		goto failed_unload;
    323	}
    324	nilfs_info(sb, "recovery complete");
    325
    326 skip_recovery:
    327	nilfs_clear_recovery_info(&ri);
    328	sb->s_flags = s_flags;
    329	return 0;
    330
    331 scan_error:
    332	nilfs_err(sb, "error %d while searching super root", err);
    333	goto failed;
    334
    335 failed_unload:
    336	iput(nilfs->ns_cpfile);
    337	iput(nilfs->ns_sufile);
    338	iput(nilfs->ns_dat);
    339
    340 failed:
    341	nilfs_clear_recovery_info(&ri);
    342	sb->s_flags = s_flags;
    343	return err;
    344}
    345
    346static unsigned long long nilfs_max_size(unsigned int blkbits)
    347{
    348	unsigned int max_bits;
    349	unsigned long long res = MAX_LFS_FILESIZE; /* page cache limit */
    350
    351	max_bits = blkbits + NILFS_BMAP_KEY_BIT; /* bmap size limit */
    352	if (max_bits < 64)
    353		res = min_t(unsigned long long, res, (1ULL << max_bits) - 1);
    354	return res;
    355}
    356
    357/**
    358 * nilfs_nrsvsegs - calculate the number of reserved segments
    359 * @nilfs: nilfs object
    360 * @nsegs: total number of segments
    361 */
    362unsigned long nilfs_nrsvsegs(struct the_nilfs *nilfs, unsigned long nsegs)
    363{
    364	return max_t(unsigned long, NILFS_MIN_NRSVSEGS,
    365		     DIV_ROUND_UP(nsegs * nilfs->ns_r_segments_percentage,
    366				  100));
    367}
    368
    369void nilfs_set_nsegments(struct the_nilfs *nilfs, unsigned long nsegs)
    370{
    371	nilfs->ns_nsegments = nsegs;
    372	nilfs->ns_nrsvsegs = nilfs_nrsvsegs(nilfs, nsegs);
    373}
    374
    375static int nilfs_store_disk_layout(struct the_nilfs *nilfs,
    376				   struct nilfs_super_block *sbp)
    377{
    378	if (le32_to_cpu(sbp->s_rev_level) < NILFS_MIN_SUPP_REV) {
    379		nilfs_err(nilfs->ns_sb,
    380			  "unsupported revision (superblock rev.=%d.%d, current rev.=%d.%d). Please check the version of mkfs.nilfs(2).",
    381			  le32_to_cpu(sbp->s_rev_level),
    382			  le16_to_cpu(sbp->s_minor_rev_level),
    383			  NILFS_CURRENT_REV, NILFS_MINOR_REV);
    384		return -EINVAL;
    385	}
    386	nilfs->ns_sbsize = le16_to_cpu(sbp->s_bytes);
    387	if (nilfs->ns_sbsize > BLOCK_SIZE)
    388		return -EINVAL;
    389
    390	nilfs->ns_inode_size = le16_to_cpu(sbp->s_inode_size);
    391	if (nilfs->ns_inode_size > nilfs->ns_blocksize) {
    392		nilfs_err(nilfs->ns_sb, "too large inode size: %d bytes",
    393			  nilfs->ns_inode_size);
    394		return -EINVAL;
    395	} else if (nilfs->ns_inode_size < NILFS_MIN_INODE_SIZE) {
    396		nilfs_err(nilfs->ns_sb, "too small inode size: %d bytes",
    397			  nilfs->ns_inode_size);
    398		return -EINVAL;
    399	}
    400
    401	nilfs->ns_first_ino = le32_to_cpu(sbp->s_first_ino);
    402
    403	nilfs->ns_blocks_per_segment = le32_to_cpu(sbp->s_blocks_per_segment);
    404	if (nilfs->ns_blocks_per_segment < NILFS_SEG_MIN_BLOCKS) {
    405		nilfs_err(nilfs->ns_sb, "too short segment: %lu blocks",
    406			  nilfs->ns_blocks_per_segment);
    407		return -EINVAL;
    408	}
    409
    410	nilfs->ns_first_data_block = le64_to_cpu(sbp->s_first_data_block);
    411	nilfs->ns_r_segments_percentage =
    412		le32_to_cpu(sbp->s_r_segments_percentage);
    413	if (nilfs->ns_r_segments_percentage < 1 ||
    414	    nilfs->ns_r_segments_percentage > 99) {
    415		nilfs_err(nilfs->ns_sb,
    416			  "invalid reserved segments percentage: %lu",
    417			  nilfs->ns_r_segments_percentage);
    418		return -EINVAL;
    419	}
    420
    421	nilfs_set_nsegments(nilfs, le64_to_cpu(sbp->s_nsegments));
    422	nilfs->ns_crc_seed = le32_to_cpu(sbp->s_crc_seed);
    423	return 0;
    424}
    425
    426static int nilfs_valid_sb(struct nilfs_super_block *sbp)
    427{
    428	static unsigned char sum[4];
    429	const int sumoff = offsetof(struct nilfs_super_block, s_sum);
    430	size_t bytes;
    431	u32 crc;
    432
    433	if (!sbp || le16_to_cpu(sbp->s_magic) != NILFS_SUPER_MAGIC)
    434		return 0;
    435	bytes = le16_to_cpu(sbp->s_bytes);
    436	if (bytes < sumoff + 4 || bytes > BLOCK_SIZE)
    437		return 0;
    438	crc = crc32_le(le32_to_cpu(sbp->s_crc_seed), (unsigned char *)sbp,
    439		       sumoff);
    440	crc = crc32_le(crc, sum, 4);
    441	crc = crc32_le(crc, (unsigned char *)sbp + sumoff + 4,
    442		       bytes - sumoff - 4);
    443	return crc == le32_to_cpu(sbp->s_sum);
    444}
    445
    446static int nilfs_sb2_bad_offset(struct nilfs_super_block *sbp, u64 offset)
    447{
    448	return offset < ((le64_to_cpu(sbp->s_nsegments) *
    449			  le32_to_cpu(sbp->s_blocks_per_segment)) <<
    450			 (le32_to_cpu(sbp->s_log_block_size) + 10));
    451}
    452
    453static void nilfs_release_super_block(struct the_nilfs *nilfs)
    454{
    455	int i;
    456
    457	for (i = 0; i < 2; i++) {
    458		if (nilfs->ns_sbp[i]) {
    459			brelse(nilfs->ns_sbh[i]);
    460			nilfs->ns_sbh[i] = NULL;
    461			nilfs->ns_sbp[i] = NULL;
    462		}
    463	}
    464}
    465
    466void nilfs_fall_back_super_block(struct the_nilfs *nilfs)
    467{
    468	brelse(nilfs->ns_sbh[0]);
    469	nilfs->ns_sbh[0] = nilfs->ns_sbh[1];
    470	nilfs->ns_sbp[0] = nilfs->ns_sbp[1];
    471	nilfs->ns_sbh[1] = NULL;
    472	nilfs->ns_sbp[1] = NULL;
    473}
    474
    475void nilfs_swap_super_block(struct the_nilfs *nilfs)
    476{
    477	struct buffer_head *tsbh = nilfs->ns_sbh[0];
    478	struct nilfs_super_block *tsbp = nilfs->ns_sbp[0];
    479
    480	nilfs->ns_sbh[0] = nilfs->ns_sbh[1];
    481	nilfs->ns_sbp[0] = nilfs->ns_sbp[1];
    482	nilfs->ns_sbh[1] = tsbh;
    483	nilfs->ns_sbp[1] = tsbp;
    484}
    485
    486static int nilfs_load_super_block(struct the_nilfs *nilfs,
    487				  struct super_block *sb, int blocksize,
    488				  struct nilfs_super_block **sbpp)
    489{
    490	struct nilfs_super_block **sbp = nilfs->ns_sbp;
    491	struct buffer_head **sbh = nilfs->ns_sbh;
    492	u64 sb2off = NILFS_SB2_OFFSET_BYTES(bdev_nr_bytes(nilfs->ns_bdev));
    493	int valid[2], swp = 0;
    494
    495	sbp[0] = nilfs_read_super_block(sb, NILFS_SB_OFFSET_BYTES, blocksize,
    496					&sbh[0]);
    497	sbp[1] = nilfs_read_super_block(sb, sb2off, blocksize, &sbh[1]);
    498
    499	if (!sbp[0]) {
    500		if (!sbp[1]) {
    501			nilfs_err(sb, "unable to read superblock");
    502			return -EIO;
    503		}
    504		nilfs_warn(sb,
    505			   "unable to read primary superblock (blocksize = %d)",
    506			   blocksize);
    507	} else if (!sbp[1]) {
    508		nilfs_warn(sb,
    509			   "unable to read secondary superblock (blocksize = %d)",
    510			   blocksize);
    511	}
    512
    513	/*
    514	 * Compare two super blocks and set 1 in swp if the secondary
    515	 * super block is valid and newer.  Otherwise, set 0 in swp.
    516	 */
    517	valid[0] = nilfs_valid_sb(sbp[0]);
    518	valid[1] = nilfs_valid_sb(sbp[1]);
    519	swp = valid[1] && (!valid[0] ||
    520			   le64_to_cpu(sbp[1]->s_last_cno) >
    521			   le64_to_cpu(sbp[0]->s_last_cno));
    522
    523	if (valid[swp] && nilfs_sb2_bad_offset(sbp[swp], sb2off)) {
    524		brelse(sbh[1]);
    525		sbh[1] = NULL;
    526		sbp[1] = NULL;
    527		valid[1] = 0;
    528		swp = 0;
    529	}
    530	if (!valid[swp]) {
    531		nilfs_release_super_block(nilfs);
    532		nilfs_err(sb, "couldn't find nilfs on the device");
    533		return -EINVAL;
    534	}
    535
    536	if (!valid[!swp])
    537		nilfs_warn(sb,
    538			   "broken superblock, retrying with spare superblock (blocksize = %d)",
    539			   blocksize);
    540	if (swp)
    541		nilfs_swap_super_block(nilfs);
    542
    543	nilfs->ns_sbwcount = 0;
    544	nilfs->ns_sbwtime = le64_to_cpu(sbp[0]->s_wtime);
    545	nilfs->ns_prot_seq = le64_to_cpu(sbp[valid[1] & !swp]->s_last_seq);
    546	*sbpp = sbp[0];
    547	return 0;
    548}
    549
    550/**
    551 * init_nilfs - initialize a NILFS instance.
    552 * @nilfs: the_nilfs structure
    553 * @sb: super block
    554 * @data: mount options
    555 *
    556 * init_nilfs() performs common initialization per block device (e.g.
    557 * reading the super block, getting disk layout information, initializing
    558 * shared fields in the_nilfs).
    559 *
    560 * Return Value: On success, 0 is returned. On error, a negative error
    561 * code is returned.
    562 */
    563int init_nilfs(struct the_nilfs *nilfs, struct super_block *sb, char *data)
    564{
    565	struct nilfs_super_block *sbp;
    566	int blocksize;
    567	int err;
    568
    569	down_write(&nilfs->ns_sem);
    570
    571	blocksize = sb_min_blocksize(sb, NILFS_MIN_BLOCK_SIZE);
    572	if (!blocksize) {
    573		nilfs_err(sb, "unable to set blocksize");
    574		err = -EINVAL;
    575		goto out;
    576	}
    577	err = nilfs_load_super_block(nilfs, sb, blocksize, &sbp);
    578	if (err)
    579		goto out;
    580
    581	err = nilfs_store_magic_and_option(sb, sbp, data);
    582	if (err)
    583		goto failed_sbh;
    584
    585	err = nilfs_check_feature_compatibility(sb, sbp);
    586	if (err)
    587		goto failed_sbh;
    588
    589	blocksize = BLOCK_SIZE << le32_to_cpu(sbp->s_log_block_size);
    590	if (blocksize < NILFS_MIN_BLOCK_SIZE ||
    591	    blocksize > NILFS_MAX_BLOCK_SIZE) {
    592		nilfs_err(sb,
    593			  "couldn't mount because of unsupported filesystem blocksize %d",
    594			  blocksize);
    595		err = -EINVAL;
    596		goto failed_sbh;
    597	}
    598	if (sb->s_blocksize != blocksize) {
    599		int hw_blocksize = bdev_logical_block_size(sb->s_bdev);
    600
    601		if (blocksize < hw_blocksize) {
    602			nilfs_err(sb,
    603				  "blocksize %d too small for device (sector-size = %d)",
    604				  blocksize, hw_blocksize);
    605			err = -EINVAL;
    606			goto failed_sbh;
    607		}
    608		nilfs_release_super_block(nilfs);
    609		sb_set_blocksize(sb, blocksize);
    610
    611		err = nilfs_load_super_block(nilfs, sb, blocksize, &sbp);
    612		if (err)
    613			goto out;
    614			/*
    615			 * Not to failed_sbh; sbh is released automatically
    616			 * when reloading fails.
    617			 */
    618	}
    619	nilfs->ns_blocksize_bits = sb->s_blocksize_bits;
    620	nilfs->ns_blocksize = blocksize;
    621
    622	get_random_bytes(&nilfs->ns_next_generation,
    623			 sizeof(nilfs->ns_next_generation));
    624
    625	err = nilfs_store_disk_layout(nilfs, sbp);
    626	if (err)
    627		goto failed_sbh;
    628
    629	sb->s_maxbytes = nilfs_max_size(sb->s_blocksize_bits);
    630
    631	nilfs->ns_mount_state = le16_to_cpu(sbp->s_state);
    632
    633	err = nilfs_store_log_cursor(nilfs, sbp);
    634	if (err)
    635		goto failed_sbh;
    636
    637	err = nilfs_sysfs_create_device_group(sb);
    638	if (err)
    639		goto failed_sbh;
    640
    641	set_nilfs_init(nilfs);
    642	err = 0;
    643 out:
    644	up_write(&nilfs->ns_sem);
    645	return err;
    646
    647 failed_sbh:
    648	nilfs_release_super_block(nilfs);
    649	goto out;
    650}
    651
    652int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump,
    653			    size_t nsegs)
    654{
    655	sector_t seg_start, seg_end;
    656	sector_t start = 0, nblocks = 0;
    657	unsigned int sects_per_block;
    658	__u64 *sn;
    659	int ret = 0;
    660
    661	sects_per_block = (1 << nilfs->ns_blocksize_bits) /
    662		bdev_logical_block_size(nilfs->ns_bdev);
    663	for (sn = segnump; sn < segnump + nsegs; sn++) {
    664		nilfs_get_segment_range(nilfs, *sn, &seg_start, &seg_end);
    665
    666		if (!nblocks) {
    667			start = seg_start;
    668			nblocks = seg_end - seg_start + 1;
    669		} else if (start + nblocks == seg_start) {
    670			nblocks += seg_end - seg_start + 1;
    671		} else {
    672			ret = blkdev_issue_discard(nilfs->ns_bdev,
    673						   start * sects_per_block,
    674						   nblocks * sects_per_block,
    675						   GFP_NOFS);
    676			if (ret < 0)
    677				return ret;
    678			nblocks = 0;
    679		}
    680	}
    681	if (nblocks)
    682		ret = blkdev_issue_discard(nilfs->ns_bdev,
    683					   start * sects_per_block,
    684					   nblocks * sects_per_block,
    685					   GFP_NOFS);
    686	return ret;
    687}
    688
    689int nilfs_count_free_blocks(struct the_nilfs *nilfs, sector_t *nblocks)
    690{
    691	unsigned long ncleansegs;
    692
    693	down_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
    694	ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile);
    695	up_read(&NILFS_MDT(nilfs->ns_dat)->mi_sem);
    696	*nblocks = (sector_t)ncleansegs * nilfs->ns_blocks_per_segment;
    697	return 0;
    698}
    699
    700int nilfs_near_disk_full(struct the_nilfs *nilfs)
    701{
    702	unsigned long ncleansegs, nincsegs;
    703
    704	ncleansegs = nilfs_sufile_get_ncleansegs(nilfs->ns_sufile);
    705	nincsegs = atomic_read(&nilfs->ns_ndirtyblks) /
    706		nilfs->ns_blocks_per_segment + 1;
    707
    708	return ncleansegs <= nilfs->ns_nrsvsegs + nincsegs;
    709}
    710
    711struct nilfs_root *nilfs_lookup_root(struct the_nilfs *nilfs, __u64 cno)
    712{
    713	struct rb_node *n;
    714	struct nilfs_root *root;
    715
    716	spin_lock(&nilfs->ns_cptree_lock);
    717	n = nilfs->ns_cptree.rb_node;
    718	while (n) {
    719		root = rb_entry(n, struct nilfs_root, rb_node);
    720
    721		if (cno < root->cno) {
    722			n = n->rb_left;
    723		} else if (cno > root->cno) {
    724			n = n->rb_right;
    725		} else {
    726			refcount_inc(&root->count);
    727			spin_unlock(&nilfs->ns_cptree_lock);
    728			return root;
    729		}
    730	}
    731	spin_unlock(&nilfs->ns_cptree_lock);
    732
    733	return NULL;
    734}
    735
    736struct nilfs_root *
    737nilfs_find_or_create_root(struct the_nilfs *nilfs, __u64 cno)
    738{
    739	struct rb_node **p, *parent;
    740	struct nilfs_root *root, *new;
    741	int err;
    742
    743	root = nilfs_lookup_root(nilfs, cno);
    744	if (root)
    745		return root;
    746
    747	new = kzalloc(sizeof(*root), GFP_KERNEL);
    748	if (!new)
    749		return NULL;
    750
    751	spin_lock(&nilfs->ns_cptree_lock);
    752
    753	p = &nilfs->ns_cptree.rb_node;
    754	parent = NULL;
    755
    756	while (*p) {
    757		parent = *p;
    758		root = rb_entry(parent, struct nilfs_root, rb_node);
    759
    760		if (cno < root->cno) {
    761			p = &(*p)->rb_left;
    762		} else if (cno > root->cno) {
    763			p = &(*p)->rb_right;
    764		} else {
    765			refcount_inc(&root->count);
    766			spin_unlock(&nilfs->ns_cptree_lock);
    767			kfree(new);
    768			return root;
    769		}
    770	}
    771
    772	new->cno = cno;
    773	new->ifile = NULL;
    774	new->nilfs = nilfs;
    775	refcount_set(&new->count, 1);
    776	atomic64_set(&new->inodes_count, 0);
    777	atomic64_set(&new->blocks_count, 0);
    778
    779	rb_link_node(&new->rb_node, parent, p);
    780	rb_insert_color(&new->rb_node, &nilfs->ns_cptree);
    781
    782	spin_unlock(&nilfs->ns_cptree_lock);
    783
    784	err = nilfs_sysfs_create_snapshot_group(new);
    785	if (err) {
    786		kfree(new);
    787		new = NULL;
    788	}
    789
    790	return new;
    791}
    792
    793void nilfs_put_root(struct nilfs_root *root)
    794{
    795	struct the_nilfs *nilfs = root->nilfs;
    796
    797	if (refcount_dec_and_lock(&root->count, &nilfs->ns_cptree_lock)) {
    798		rb_erase(&root->rb_node, &nilfs->ns_cptree);
    799		spin_unlock(&nilfs->ns_cptree_lock);
    800
    801		nilfs_sysfs_delete_snapshot_group(root);
    802		iput(root->ifile);
    803
    804		kfree(root);
    805	}
    806}