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

Commit af8cb8aa authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2: (21 commits)
  fs/Kconfig: move nilfs2 outside misc filesystems
  nilfs2: convert nilfs_bmap_lookup to an inline function
  nilfs2: allow btree code to directly call dat operations
  nilfs2: add update functions of virtual block address to dat
  nilfs2: remove individual gfp constants for each metadata file
  nilfs2: stop zero-fill of btree path just before free it
  nilfs2: remove unused btree argument from btree functions
  nilfs2: remove nilfs_dat_abort_start and nilfs_dat_abort_free
  nilfs2: shorten freeze period due to GC in write operation v3
  nilfs2: add more check routines in mount process
  nilfs2: An unassigned variable is assigned to a never used structure member
  nilfs2: use GFP_NOIO for bio_alloc instead of GFP_NOWAIT
  nilfs2: stop using periodic write_super callback
  nilfs2: clean up nilfs_write_super
  nilfs2: fix disorder of nilfs_write_super in nilfs_sync_fs
  nilfs2: remove redundant super block commit
  nilfs2: implement nilfs_show_options to display mount options in /proc/mounts
  nilfs2: always lookup disk block address before reading metadata block
  nilfs2: use semaphore to protect pointer to a writable FS-instance
  nilfs2: fix format string compile warning (ino_t)
  ...
parents 6cdb5930 41f4db0f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ source "fs/xfs/Kconfig"
source "fs/gfs2/Kconfig"
source "fs/ocfs2/Kconfig"
source "fs/btrfs/Kconfig"
source "fs/nilfs2/Kconfig"

endif # BLOCK

@@ -186,7 +187,6 @@ source "fs/romfs/Kconfig"
source "fs/sysv/Kconfig"
source "fs/ufs/Kconfig"
source "fs/exofs/Kconfig"
source "fs/nilfs2/Kconfig"

endif # MISC_FILESYSTEMS

+1 −1
Original line number Diff line number Diff line
config NILFS2_FS
	tristate "NILFS2 file system support (EXPERIMENTAL)"
	depends on BLOCK && EXPERIMENTAL
	depends on EXPERIMENTAL
	select CRC32
	help
	  NILFS2 is a log-structured file system (LFS) supporting continuous
+20 −131
Original line number Diff line number Diff line
@@ -36,6 +36,26 @@ struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap)
	return nilfs_dat_inode(NILFS_I_NILFS(bmap->b_inode));
}

/**
 * nilfs_bmap_lookup_at_level - find a data block or node block
 * @bmap: bmap
 * @key: key
 * @level: level
 * @ptrp: place to store the value associated to @key
 *
 * Description: nilfs_bmap_lookup_at_level() finds a record whose key
 * matches @key in the block at @level of the bmap.
 *
 * Return Value: On success, 0 is returned and the record associated with @key
 * is stored in the place pointed by @ptrp. On error, one of the following
 * negative error codes is returned.
 *
 * %-EIO - I/O error.
 *
 * %-ENOMEM - Insufficient amount of memory available.
 *
 * %-ENOENT - A record associated with @key does not exist.
 */
int nilfs_bmap_lookup_at_level(struct nilfs_bmap *bmap, __u64 key, int level,
			       __u64 *ptrp)
{
@@ -69,39 +89,6 @@ int nilfs_bmap_lookup_contig(struct nilfs_bmap *bmap, __u64 key, __u64 *ptrp,
	return ret;
}

/**
 * nilfs_bmap_lookup - find a record
 * @bmap: bmap
 * @key: key
 * @recp: pointer to record
 *
 * Description: nilfs_bmap_lookup() finds a record whose key matches @key in
 * @bmap.
 *
 * Return Value: On success, 0 is returned and the record associated with @key
 * is stored in the place pointed by @recp. On error, one of the following
 * negative error codes is returned.
 *
 * %-EIO - I/O error.
 *
 * %-ENOMEM - Insufficient amount of memory available.
 *
 * %-ENOENT - A record associated with @key does not exist.
 */
int nilfs_bmap_lookup(struct nilfs_bmap *bmap,
		      unsigned long key,
		      unsigned long *recp)
{
	__u64 ptr;
	int ret;

	/* XXX: use macro for level 1 */
	ret = nilfs_bmap_lookup_at_level(bmap, key, 1, &ptr);
	if (recp != NULL)
		*recp = ptr;
	return ret;
}

static int nilfs_bmap_do_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr)
{
	__u64 keys[NILFS_BMAP_SMALL_HIGH + 1];
@@ -469,104 +456,6 @@ __u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *bmap)
		(entries_per_group / NILFS_BMAP_GROUP_DIV);
}

int nilfs_bmap_prepare_alloc_v(struct nilfs_bmap *bmap,
				 union nilfs_bmap_ptr_req *req)
{
	return nilfs_dat_prepare_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req);
}

void nilfs_bmap_commit_alloc_v(struct nilfs_bmap *bmap,
				 union nilfs_bmap_ptr_req *req)
{
	nilfs_dat_commit_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req);
}

void nilfs_bmap_abort_alloc_v(struct nilfs_bmap *bmap,
			      union nilfs_bmap_ptr_req *req)
{
	nilfs_dat_abort_alloc(nilfs_bmap_get_dat(bmap), &req->bpr_req);
}

int nilfs_bmap_start_v(struct nilfs_bmap *bmap, union nilfs_bmap_ptr_req *req,
		       sector_t blocknr)
{
	struct inode *dat = nilfs_bmap_get_dat(bmap);
	int ret;

	ret = nilfs_dat_prepare_start(dat, &req->bpr_req);
	if (likely(!ret))
		nilfs_dat_commit_start(dat, &req->bpr_req, blocknr);
	return ret;
}

int nilfs_bmap_prepare_end_v(struct nilfs_bmap *bmap,
			     union nilfs_bmap_ptr_req *req)
{
	return nilfs_dat_prepare_end(nilfs_bmap_get_dat(bmap), &req->bpr_req);
}

void nilfs_bmap_commit_end_v(struct nilfs_bmap *bmap,
			     union nilfs_bmap_ptr_req *req)
{
	nilfs_dat_commit_end(nilfs_bmap_get_dat(bmap), &req->bpr_req,
			     bmap->b_ptr_type == NILFS_BMAP_PTR_VS);
}

void nilfs_bmap_abort_end_v(struct nilfs_bmap *bmap,
			    union nilfs_bmap_ptr_req *req)
{
	nilfs_dat_abort_end(nilfs_bmap_get_dat(bmap), &req->bpr_req);
}

int nilfs_bmap_move_v(const struct nilfs_bmap *bmap, __u64 vblocknr,
		      sector_t blocknr)
{
	return nilfs_dat_move(nilfs_bmap_get_dat(bmap), vblocknr, blocknr);
}

int nilfs_bmap_mark_dirty(const struct nilfs_bmap *bmap, __u64 vblocknr)
{
	return nilfs_dat_mark_dirty(nilfs_bmap_get_dat(bmap), vblocknr);
}

int nilfs_bmap_prepare_update_v(struct nilfs_bmap *bmap,
				union nilfs_bmap_ptr_req *oldreq,
				union nilfs_bmap_ptr_req *newreq)
{
	struct inode *dat = nilfs_bmap_get_dat(bmap);
	int ret;

	ret = nilfs_dat_prepare_end(dat, &oldreq->bpr_req);
	if (ret < 0)
		return ret;
	ret = nilfs_dat_prepare_alloc(dat, &newreq->bpr_req);
	if (ret < 0)
		nilfs_dat_abort_end(dat, &oldreq->bpr_req);

	return ret;
}

void nilfs_bmap_commit_update_v(struct nilfs_bmap *bmap,
				union nilfs_bmap_ptr_req *oldreq,
				union nilfs_bmap_ptr_req *newreq)
{
	struct inode *dat = nilfs_bmap_get_dat(bmap);

	nilfs_dat_commit_end(dat, &oldreq->bpr_req,
			     bmap->b_ptr_type == NILFS_BMAP_PTR_VS);
	nilfs_dat_commit_alloc(dat, &newreq->bpr_req);
}

void nilfs_bmap_abort_update_v(struct nilfs_bmap *bmap,
			       union nilfs_bmap_ptr_req *oldreq,
			       union nilfs_bmap_ptr_req *newreq)
{
	struct inode *dat = nilfs_bmap_get_dat(bmap);

	nilfs_dat_abort_end(dat, &oldreq->bpr_req);
	nilfs_dat_abort_alloc(dat, &newreq->bpr_req);
}

static struct lock_class_key nilfs_bmap_dat_lock_key;
static struct lock_class_key nilfs_bmap_mdt_lock_key;

+31 −45
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <linux/buffer_head.h>
#include <linux/nilfs2_fs.h>
#include "alloc.h"
#include "dat.h"

#define NILFS_BMAP_INVALID_PTR	0

@@ -141,7 +142,6 @@ struct nilfs_bmap {
int nilfs_bmap_test_and_clear_dirty(struct nilfs_bmap *);
int nilfs_bmap_read(struct nilfs_bmap *, struct nilfs_inode *);
void nilfs_bmap_write(struct nilfs_bmap *, struct nilfs_inode *);
int nilfs_bmap_lookup(struct nilfs_bmap *, unsigned long, unsigned long *);
int nilfs_bmap_lookup_contig(struct nilfs_bmap *, __u64, __u64 *, unsigned);
int nilfs_bmap_insert(struct nilfs_bmap *, unsigned long, unsigned long);
int nilfs_bmap_delete(struct nilfs_bmap *, unsigned long);
@@ -160,90 +160,76 @@ void nilfs_bmap_init_gcdat(struct nilfs_bmap *, struct nilfs_bmap *);
void nilfs_bmap_commit_gcdat(struct nilfs_bmap *, struct nilfs_bmap *);


static inline int nilfs_bmap_lookup(struct nilfs_bmap *bmap, __u64 key,
				    __u64 *ptr)
{
	return nilfs_bmap_lookup_at_level(bmap, key, 1, ptr);
}

/*
 * Internal use only
 */
struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *);
int nilfs_bmap_prepare_alloc_v(struct nilfs_bmap *,
			       union nilfs_bmap_ptr_req *);
void nilfs_bmap_commit_alloc_v(struct nilfs_bmap *,
			       union nilfs_bmap_ptr_req *);
void nilfs_bmap_abort_alloc_v(struct nilfs_bmap *,
			      union nilfs_bmap_ptr_req *);

static inline int nilfs_bmap_prepare_alloc_ptr(struct nilfs_bmap *bmap,
					       union nilfs_bmap_ptr_req *req)
					       union nilfs_bmap_ptr_req *req,
					       struct inode *dat)
{
	if (NILFS_BMAP_USE_VBN(bmap))
		return nilfs_bmap_prepare_alloc_v(bmap, req);
	if (dat)
		return nilfs_dat_prepare_alloc(dat, &req->bpr_req);
	/* ignore target ptr */
	req->bpr_ptr = bmap->b_last_allocated_ptr++;
	return 0;
}

static inline void nilfs_bmap_commit_alloc_ptr(struct nilfs_bmap *bmap,
					       union nilfs_bmap_ptr_req *req)
					       union nilfs_bmap_ptr_req *req,
					       struct inode *dat)
{
	if (NILFS_BMAP_USE_VBN(bmap))
		nilfs_bmap_commit_alloc_v(bmap, req);
	if (dat)
		nilfs_dat_commit_alloc(dat, &req->bpr_req);
}

static inline void nilfs_bmap_abort_alloc_ptr(struct nilfs_bmap *bmap,
					      union nilfs_bmap_ptr_req *req)
					      union nilfs_bmap_ptr_req *req,
					      struct inode *dat)
{
	if (NILFS_BMAP_USE_VBN(bmap))
		nilfs_bmap_abort_alloc_v(bmap, req);
	if (dat)
		nilfs_dat_abort_alloc(dat, &req->bpr_req);
	else
		bmap->b_last_allocated_ptr--;
}

int nilfs_bmap_prepare_end_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *);
void nilfs_bmap_commit_end_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *);
void nilfs_bmap_abort_end_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *);

static inline int nilfs_bmap_prepare_end_ptr(struct nilfs_bmap *bmap,
					     union nilfs_bmap_ptr_req *req)
					     union nilfs_bmap_ptr_req *req,
					     struct inode *dat)
{
	return NILFS_BMAP_USE_VBN(bmap) ?
		nilfs_bmap_prepare_end_v(bmap, req) : 0;
	return dat ? nilfs_dat_prepare_end(dat, &req->bpr_req) : 0;
}

static inline void nilfs_bmap_commit_end_ptr(struct nilfs_bmap *bmap,
					     union nilfs_bmap_ptr_req *req)
					     union nilfs_bmap_ptr_req *req,
					     struct inode *dat)
{
	if (NILFS_BMAP_USE_VBN(bmap))
		nilfs_bmap_commit_end_v(bmap, req);
	if (dat)
		nilfs_dat_commit_end(dat, &req->bpr_req,
				     bmap->b_ptr_type == NILFS_BMAP_PTR_VS);
}

static inline void nilfs_bmap_abort_end_ptr(struct nilfs_bmap *bmap,
					    union nilfs_bmap_ptr_req *req)
					    union nilfs_bmap_ptr_req *req,
					    struct inode *dat)
{
	if (NILFS_BMAP_USE_VBN(bmap))
		nilfs_bmap_abort_end_v(bmap, req);
	if (dat)
		nilfs_dat_abort_end(dat, &req->bpr_req);
}

int nilfs_bmap_start_v(struct nilfs_bmap *, union nilfs_bmap_ptr_req *,
		       sector_t);
int nilfs_bmap_move_v(const struct nilfs_bmap *, __u64, sector_t);
int nilfs_bmap_mark_dirty(const struct nilfs_bmap *, __u64);


__u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *,
			      const struct buffer_head *);

__u64 nilfs_bmap_find_target_seq(const struct nilfs_bmap *, __u64);
__u64 nilfs_bmap_find_target_in_group(const struct nilfs_bmap *);

int nilfs_bmap_prepare_update_v(struct nilfs_bmap *,
				union nilfs_bmap_ptr_req *,
				union nilfs_bmap_ptr_req *);
void nilfs_bmap_commit_update_v(struct nilfs_bmap *,
				union nilfs_bmap_ptr_req *,
				union nilfs_bmap_ptr_req *);
void nilfs_bmap_abort_update_v(struct nilfs_bmap *,
			       union nilfs_bmap_ptr_req *,
			       union nilfs_bmap_ptr_req *);

void nilfs_bmap_add_blocks(const struct nilfs_bmap *, int);
void nilfs_bmap_sub_blocks(const struct nilfs_bmap *, int);

+295 −330

File changed.

Preview size limit exceeded, changes collapsed.

Loading