nilfs2: remove own inode hash used for GC
This uses inode hash function that vfs provides instead of the own hash table for caching gc inodes. This finally removes the own inode hash from nilfs. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
This commit is contained in:
@@ -333,7 +333,7 @@ static int nilfs_ioctl_move_inode_block(struct inode *inode,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs,
|
||||
static int nilfs_ioctl_move_blocks(struct super_block *sb,
|
||||
struct nilfs_argv *argv, void *buf)
|
||||
{
|
||||
size_t nmembs = argv->v_nmembs;
|
||||
@@ -348,7 +348,7 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs,
|
||||
for (i = 0, vdesc = buf; i < nmembs; ) {
|
||||
ino = vdesc->vd_ino;
|
||||
cno = vdesc->vd_cno;
|
||||
inode = nilfs_gc_iget(nilfs, ino, cno);
|
||||
inode = nilfs_iget_for_gc(sb, ino, cno);
|
||||
if (unlikely(inode == NULL)) {
|
||||
ret = -ENOMEM;
|
||||
goto failed;
|
||||
@@ -356,11 +356,15 @@ static int nilfs_ioctl_move_blocks(struct the_nilfs *nilfs,
|
||||
do {
|
||||
ret = nilfs_ioctl_move_inode_block(inode, vdesc,
|
||||
&buffers);
|
||||
if (unlikely(ret < 0))
|
||||
if (unlikely(ret < 0)) {
|
||||
iput(inode);
|
||||
goto failed;
|
||||
}
|
||||
vdesc++;
|
||||
} while (++i < nmembs &&
|
||||
vdesc->vd_ino == ino && vdesc->vd_cno == cno);
|
||||
|
||||
iput(inode); /* The inode still remains in GC inode list */
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(bh, n, &buffers, b_assoc_buffers) {
|
||||
@@ -566,7 +570,7 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp,
|
||||
}
|
||||
|
||||
/*
|
||||
* nilfs_ioctl_move_blocks() will call nilfs_gc_iget(),
|
||||
* nilfs_ioctl_move_blocks() will call nilfs_iget_for_gc(),
|
||||
* which will operates an inode list without blocking.
|
||||
* To protect the list from concurrent operations,
|
||||
* nilfs_ioctl_move_blocks should be atomic operation.
|
||||
@@ -576,15 +580,14 @@ static int nilfs_ioctl_clean_segments(struct inode *inode, struct file *filp,
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
ret = nilfs_ioctl_move_blocks(nilfs, &argv[0], kbufs[0]);
|
||||
ret = nilfs_ioctl_move_blocks(inode->i_sb, &argv[0], kbufs[0]);
|
||||
if (ret < 0)
|
||||
printk(KERN_ERR "NILFS: GC failed during preparation: "
|
||||
"cannot read source blocks: err=%d\n", ret);
|
||||
else
|
||||
ret = nilfs_clean_segments(inode->i_sb, argv, kbufs);
|
||||
|
||||
if (ret < 0)
|
||||
nilfs_remove_all_gcinode(nilfs);
|
||||
nilfs_remove_all_gcinodes(nilfs);
|
||||
clear_nilfs_gc_running(nilfs);
|
||||
|
||||
out_free:
|
||||
|
Reference in New Issue
Block a user