Commit 33a53883 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ryusuke/nilfs2:
  nilfs2: fix problem in setting checkpoint interval
  nilfs2: fix missing block address termination in btree node shrinking
  nilfs2: fix incorrect block address termination in node concatenation
parents 3c25fa74 071d73cf
...@@ -1346,6 +1346,11 @@ static void nilfs_btree_shrink(struct nilfs_bmap *btree, ...@@ -1346,6 +1346,11 @@ static void nilfs_btree_shrink(struct nilfs_bmap *btree,
path[level].bp_bh = NULL; path[level].bp_bh = NULL;
} }
static void nilfs_btree_nop(struct nilfs_bmap *btree,
struct nilfs_btree_path *path,
int level, __u64 *keyp, __u64 *ptrp)
{
}
static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
struct nilfs_btree_path *path, struct nilfs_btree_path *path,
...@@ -1356,20 +1361,19 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, ...@@ -1356,20 +1361,19 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
struct buffer_head *bh; struct buffer_head *bh;
struct nilfs_btree_node *node, *parent, *sib; struct nilfs_btree_node *node, *parent, *sib;
__u64 sibptr; __u64 sibptr;
int pindex, level, ncmin, ncmax, ncblk, ret; int pindex, dindex, level, ncmin, ncmax, ncblk, ret;
ret = 0; ret = 0;
stats->bs_nblocks = 0; stats->bs_nblocks = 0;
ncmin = NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree)); ncmin = NILFS_BTREE_NODE_NCHILDREN_MIN(nilfs_btree_node_size(btree));
ncblk = nilfs_btree_nchildren_per_block(btree); ncblk = nilfs_btree_nchildren_per_block(btree);
for (level = NILFS_BTREE_LEVEL_NODE_MIN; for (level = NILFS_BTREE_LEVEL_NODE_MIN, dindex = path[level].bp_index;
level < nilfs_btree_height(btree) - 1; level < nilfs_btree_height(btree) - 1;
level++) { level++) {
node = nilfs_btree_get_nonroot_node(path, level); node = nilfs_btree_get_nonroot_node(path, level);
path[level].bp_oldreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr =
nilfs_btree_node_get_ptr(node, path[level].bp_index, nilfs_btree_node_get_ptr(node, dindex, ncblk);
ncblk);
ret = nilfs_bmap_prepare_end_ptr(btree, ret = nilfs_bmap_prepare_end_ptr(btree,
&path[level].bp_oldreq, dat); &path[level].bp_oldreq, dat);
if (ret < 0) if (ret < 0)
...@@ -1383,6 +1387,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, ...@@ -1383,6 +1387,7 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax); parent = nilfs_btree_get_node(btree, path, level + 1, &ncmax);
pindex = path[level + 1].bp_index; pindex = path[level + 1].bp_index;
dindex = pindex;
if (pindex > 0) { if (pindex > 0) {
/* left sibling */ /* left sibling */
...@@ -1421,6 +1426,14 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, ...@@ -1421,6 +1426,14 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
path[level].bp_sib_bh = bh; path[level].bp_sib_bh = bh;
path[level].bp_op = nilfs_btree_concat_right; path[level].bp_op = nilfs_btree_concat_right;
stats->bs_nblocks++; stats->bs_nblocks++;
/*
* When merging right sibling node
* into the current node, pointer to
* the right sibling node must be
* terminated instead. The adjustment
* below is required for that.
*/
dindex = pindex + 1;
/* continue; */ /* continue; */
} }
} else { } else {
...@@ -1431,29 +1444,31 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree, ...@@ -1431,29 +1444,31 @@ static int nilfs_btree_prepare_delete(struct nilfs_bmap *btree,
NILFS_BTREE_ROOT_NCHILDREN_MAX) { NILFS_BTREE_ROOT_NCHILDREN_MAX) {
path[level].bp_op = nilfs_btree_shrink; path[level].bp_op = nilfs_btree_shrink;
stats->bs_nblocks += 2; stats->bs_nblocks += 2;
level++;
path[level].bp_op = nilfs_btree_nop;
goto shrink_root_child;
} else { } else {
path[level].bp_op = nilfs_btree_do_delete; path[level].bp_op = nilfs_btree_do_delete;
stats->bs_nblocks++; stats->bs_nblocks++;
}
goto out; goto out;
} }
} }
}
/* child of the root node is deleted */
path[level].bp_op = nilfs_btree_do_delete;
stats->bs_nblocks++;
shrink_root_child:
node = nilfs_btree_get_root(btree); node = nilfs_btree_get_root(btree);
path[level].bp_oldreq.bpr_ptr = path[level].bp_oldreq.bpr_ptr =
nilfs_btree_node_get_ptr(node, path[level].bp_index, nilfs_btree_node_get_ptr(node, dindex,
NILFS_BTREE_ROOT_NCHILDREN_MAX); NILFS_BTREE_ROOT_NCHILDREN_MAX);
ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat); ret = nilfs_bmap_prepare_end_ptr(btree, &path[level].bp_oldreq, dat);
if (ret < 0) if (ret < 0)
goto err_out_child_node; goto err_out_child_node;
/* child of the root node is deleted */
path[level].bp_op = nilfs_btree_do_delete;
stats->bs_nblocks++;
/* success */ /* success */
out: out:
*levelp = level; *levelp = level;
......
...@@ -2573,7 +2573,7 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb, ...@@ -2573,7 +2573,7 @@ static struct nilfs_sc_info *nilfs_segctor_new(struct super_block *sb,
sci->sc_watermark = NILFS_SC_DEFAULT_WATERMARK; sci->sc_watermark = NILFS_SC_DEFAULT_WATERMARK;
if (nilfs->ns_interval) if (nilfs->ns_interval)
sci->sc_interval = nilfs->ns_interval; sci->sc_interval = HZ * nilfs->ns_interval;
if (nilfs->ns_watermark) if (nilfs->ns_watermark)
sci->sc_watermark = nilfs->ns_watermark; sci->sc_watermark = nilfs->ns_watermark;
return sci; return sci;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment