Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 458c5b08 authored by Ryusuke Konishi's avatar Ryusuke Konishi Committed by Linus Torvalds
Browse files

nilfs2: clean up sketch file



The sketch file is a file to mark checkpoints with user data.  It was
experimentally introduced in the original implementation, and now
obsolete.  The file was handled differently with regular files; the file
size got truncated when a checkpoint was created.

This stops the special treatment and will treat it as a regular file.
Most users are not affected because mkfs.nilfs2 no longer makes this file.

Signed-off-by: default avatarRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent e6268746
Loading
Loading
Loading
Loading
+0 −2
Original line number Original line Diff line number Diff line
@@ -161,8 +161,6 @@ the following meta data files:
 4) Data address translation file  -- Maps virtual block numbers to usual
 4) Data address translation file  -- Maps virtual block numbers to usual
    (DAT)                             block numbers.  This file serves to
    (DAT)                             block numbers.  This file serves to
                                      make on-disk blocks relocatable.
                                      make on-disk blocks relocatable.
 5) Sketch file (sketch)           -- Keeps read-only data which can be
                                      associated with checkpoints (optional)


The following figure shows a typical organization of the logs:
The following figure shows a typical organization of the logs:


+2 −33
Original line number Original line Diff line number Diff line
@@ -418,30 +418,6 @@ int nilfs_read_inode_common(struct inode *inode,
	return 0;
	return 0;
}
}


static int nilfs_read_sketch_inode(struct inode *inode)
{
	struct nilfs_sb_info *sbi = NILFS_SB(inode->i_sb);
	int err = 0;

	if (sbi->s_snapshot_cno) {
		struct the_nilfs *nilfs = sbi->s_nilfs;
		struct buffer_head *bh_cp;
		struct nilfs_checkpoint *raw_cp;

		err = nilfs_cpfile_get_checkpoint(
			nilfs->ns_cpfile, sbi->s_snapshot_cno, 0, &raw_cp,
			&bh_cp);
		if (likely(!err)) {
			if (!nilfs_checkpoint_sketch(raw_cp))
				inode->i_size = 0;
			nilfs_cpfile_put_checkpoint(
				nilfs->ns_cpfile, sbi->s_snapshot_cno, bh_cp);
		}
		inode->i_flags |= S_NOCMTIME;
	}
	return err;
}

static int __nilfs_read_inode(struct super_block *sb, unsigned long ino,
static int __nilfs_read_inode(struct super_block *sb, unsigned long ino,
			      struct inode *inode)
			      struct inode *inode)
{
{
@@ -469,11 +445,6 @@ static int __nilfs_read_inode(struct super_block *sb, unsigned long ino,
		inode->i_op = &nilfs_file_inode_operations;
		inode->i_op = &nilfs_file_inode_operations;
		inode->i_fop = &nilfs_file_operations;
		inode->i_fop = &nilfs_file_operations;
		inode->i_mapping->a_ops = &nilfs_aops;
		inode->i_mapping->a_ops = &nilfs_aops;
		if (unlikely(inode->i_ino == NILFS_SKETCH_INO)) {
			err = nilfs_read_sketch_inode(inode);
			if (unlikely(err))
				goto failed_unmap;
		}
	} else if (S_ISDIR(inode->i_mode)) {
	} else if (S_ISDIR(inode->i_mode)) {
		inode->i_op = &nilfs_dir_inode_operations;
		inode->i_op = &nilfs_dir_inode_operations;
		inode->i_fop = &nilfs_dir_operations;
		inode->i_fop = &nilfs_dir_operations;
@@ -742,8 +713,7 @@ int nilfs_set_file_dirty(struct nilfs_sb_info *sbi, struct inode *inode,


	atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks);
	atomic_add(nr_dirty, &sbi->s_nilfs->ns_ndirtyblks);


	if (test_and_set_bit(NILFS_I_DIRTY, &ii->i_state) ||
	if (test_and_set_bit(NILFS_I_DIRTY, &ii->i_state))
	    unlikely(inode->i_ino == NILFS_SKETCH_INO))
		return 0;
		return 0;


	spin_lock(&sbi->s_inode_lock);
	spin_lock(&sbi->s_inode_lock);
@@ -811,7 +781,6 @@ void nilfs_dirty_inode(struct inode *inode)
		return;
		return;
	}
	}
	nilfs_transaction_begin(inode->i_sb, &ti, 0);
	nilfs_transaction_begin(inode->i_sb, &ti, 0);
	if (likely(inode->i_ino != NILFS_SKETCH_INO))
	nilfs_mark_inode_dirty(inode);
	nilfs_mark_inode_dirty(inode);
	nilfs_transaction_commit(inode->i_sb); /* never fails */
	nilfs_transaction_commit(inode->i_sb); /* never fails */
}
}
+1 −48
Original line number Original line Diff line number Diff line
@@ -67,7 +67,6 @@ enum {
	NILFS_ST_INIT = 0,
	NILFS_ST_INIT = 0,
	NILFS_ST_GC,		/* Collecting dirty blocks for GC */
	NILFS_ST_GC,		/* Collecting dirty blocks for GC */
	NILFS_ST_FILE,
	NILFS_ST_FILE,
	NILFS_ST_SKETCH,
	NILFS_ST_IFILE,
	NILFS_ST_IFILE,
	NILFS_ST_CPFILE,
	NILFS_ST_CPFILE,
	NILFS_ST_SUFILE,
	NILFS_ST_SUFILE,
@@ -887,8 +886,7 @@ static int nilfs_segctor_fill_in_checkpoint(struct nilfs_sc_info *sci)
		cpu_to_le64(sci->sc_nblk_inc + sci->sc_nblk_this_inc);
		cpu_to_le64(sci->sc_nblk_inc + sci->sc_nblk_this_inc);
	raw_cp->cp_create = cpu_to_le64(sci->sc_seg_ctime);
	raw_cp->cp_create = cpu_to_le64(sci->sc_seg_ctime);
	raw_cp->cp_cno = cpu_to_le64(nilfs->ns_cno);
	raw_cp->cp_cno = cpu_to_le64(nilfs->ns_cno);
	if (sci->sc_sketch_inode && i_size_read(sci->sc_sketch_inode) > 0)

		nilfs_checkpoint_set_sketch(raw_cp);
	nilfs_write_inode_common(sbi->s_ifile, &raw_cp->cp_ifile_inode, 1);
	nilfs_write_inode_common(sbi->s_ifile, &raw_cp->cp_ifile_inode, 1);
	nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, nilfs->ns_cno, bh_cp);
	nilfs_cpfile_put_checkpoint(nilfs->ns_cpfile, nilfs->ns_cno, bh_cp);
	return 0;
	return 0;
@@ -923,11 +921,6 @@ static void nilfs_segctor_fill_in_file_bmap(struct nilfs_sc_info *sci,
		nilfs_fill_in_file_bmap(ifile, ii);
		nilfs_fill_in_file_bmap(ifile, ii);
		set_bit(NILFS_I_COLLECTED, &ii->i_state);
		set_bit(NILFS_I_COLLECTED, &ii->i_state);
	}
	}
	if (sci->sc_sketch_inode) {
		ii = NILFS_I(sci->sc_sketch_inode);
		if (test_bit(NILFS_I_DIRTY, &ii->i_state))
			nilfs_fill_in_file_bmap(ifile, ii);
	}
}
}


/*
/*
@@ -1228,26 +1221,6 @@ static int nilfs_segctor_collect_blocks(struct nilfs_sc_info *sci, int mode)
			sci->sc_stage.scnt = NILFS_ST_DONE;
			sci->sc_stage.scnt = NILFS_ST_DONE;
			return 0;
			return 0;
		}
		}
		sci->sc_stage.scnt++;  /* Fall through */
	case NILFS_ST_SKETCH:
		if (mode == SC_LSEG_SR && sci->sc_sketch_inode) {
			ii = NILFS_I(sci->sc_sketch_inode);
			if (test_bit(NILFS_I_DIRTY, &ii->i_state)) {
				sci->sc_sketch_inode->i_ctime.tv_sec
					= sci->sc_seg_ctime;
				sci->sc_sketch_inode->i_mtime.tv_sec
					= sci->sc_seg_ctime;
				err = nilfs_mark_inode_dirty(
					sci->sc_sketch_inode);
				if (unlikely(err))
					goto break_or_fail;
			}
			err = nilfs_segctor_scan_file(sci,
						      sci->sc_sketch_inode,
						      &nilfs_sc_file_ops);
			if (unlikely(err))
				goto break_or_fail;
		}
		sci->sc_stage.scnt++;
		sci->sc_stage.scnt++;
		sci->sc_stage.flags |= NILFS_CF_IFILE_STARTED;
		sci->sc_stage.flags |= NILFS_CF_IFILE_STARTED;
		/* Fall through */
		/* Fall through */
@@ -2385,13 +2358,6 @@ static int nilfs_segctor_do_construct(struct nilfs_sc_info *sci, int mode)


	} while (sci->sc_stage.scnt != NILFS_ST_DONE);
	} while (sci->sc_stage.scnt != NILFS_ST_DONE);


	/* Clearing sketch data */
	if (has_sr && sci->sc_sketch_inode) {
		if (i_size_read(sci->sc_sketch_inode) == 0)
			clear_bit(NILFS_I_DIRTY,
				  &NILFS_I(sci->sc_sketch_inode)->i_state);
		i_size_write(sci->sc_sketch_inode, 0);
	}
 out:
 out:
	nilfs_segctor_destroy_segment_buffers(sci);
	nilfs_segctor_destroy_segment_buffers(sci);
	nilfs_segctor_check_out_files(sci, sbi);
	nilfs_segctor_check_out_files(sci, sbi);
@@ -2971,11 +2937,6 @@ static int nilfs_segctor_init(struct nilfs_sc_info *sci,
			      struct nilfs_recovery_info *ri)
			      struct nilfs_recovery_info *ri)
{
{
	int err;
	int err;
	struct inode *inode = nilfs_iget(sci->sc_super, NILFS_SKETCH_INO);

	sci->sc_sketch_inode = IS_ERR(inode) ? NULL : inode;
	if (sci->sc_sketch_inode)
		i_size_write(sci->sc_sketch_inode, 0);


	sci->sc_seq_done = sci->sc_seq_request;
	sci->sc_seq_done = sci->sc_seq_request;
	if (ri)
	if (ri)
@@ -2987,10 +2948,6 @@ static int nilfs_segctor_init(struct nilfs_sc_info *sci,
		if (ri)
		if (ri)
			list_splice_init(&sci->sc_active_segments,
			list_splice_init(&sci->sc_active_segments,
					 ri->ri_used_segments.prev);
					 ri->ri_used_segments.prev);
		if (sci->sc_sketch_inode) {
			iput(sci->sc_sketch_inode);
			sci->sc_sketch_inode = NULL;
		}
	}
	}
	return err;
	return err;
}
}
@@ -3090,10 +3047,6 @@ static void nilfs_segctor_destroy(struct nilfs_sc_info *sci)


	WARN_ON(!list_empty(&sci->sc_segbufs));
	WARN_ON(!list_empty(&sci->sc_segbufs));


	if (sci->sc_sketch_inode) {
		iput(sci->sc_sketch_inode);
		sci->sc_sketch_inode = NULL;
	}
	down_write(&sbi->s_nilfs->ns_segctor_sem);
	down_write(&sbi->s_nilfs->ns_segctor_sem);


	kfree(sci);
	kfree(sci);
+0 −8
Original line number Original line Diff line number Diff line
@@ -108,7 +108,6 @@ struct nilfs_segsum_pointer {
 * @sc_nblk_this_inc: Number of blocks included in the current logical segment
 * @sc_nblk_this_inc: Number of blocks included in the current logical segment
 * @sc_seg_ctime: Creation time
 * @sc_seg_ctime: Creation time
 * @sc_flags: Internal flags
 * @sc_flags: Internal flags
 * @sc_sketch_inode: Inode of the sketch file
 * @sc_state_lock: spinlock for sc_state and so on
 * @sc_state_lock: spinlock for sc_state and so on
 * @sc_state: Segctord state flags
 * @sc_state: Segctord state flags
 * @sc_flush_request: inode bitmap of metadata files to be flushed
 * @sc_flush_request: inode bitmap of metadata files to be flushed
@@ -158,13 +157,6 @@ struct nilfs_sc_info {


	unsigned long		sc_flags;
	unsigned long		sc_flags;


	/*
	 * Pointer to an inode of the sketch.
	 * This pointer is kept only while it contains data.
	 * We protect it with a semaphore of the segment constructor.
	 */
	struct inode	       *sc_sketch_inode;

	spinlock_t		sc_state_lock;
	spinlock_t		sc_state_lock;
	unsigned long		sc_state;
	unsigned long		sc_state;
	unsigned long		sc_flush_request;
	unsigned long		sc_flush_request;
+0 −2
Original line number Original line Diff line number Diff line
@@ -494,7 +494,6 @@ nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \


NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot)
NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot)
NILFS_CHECKPOINT_FNS(INVALID, invalid)
NILFS_CHECKPOINT_FNS(INVALID, invalid)
NILFS_CHECKPOINT_FNS(SKETCH, sketch)


/**
/**
 * struct nilfs_cpinfo - checkpoint information
 * struct nilfs_cpinfo - checkpoint information
@@ -527,7 +526,6 @@ nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \


NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
NILFS_CPINFO_FNS(INVALID, invalid)
NILFS_CPINFO_FNS(INVALID, invalid)
NILFS_CPINFO_FNS(SKETCH, sketch)




/**
/**