nilfs2: use checkpoint tree for mount check of snapshots
This rewrites nilfs_checkpoint_is_mounted() function so that it
decides whether a checkpoint is mounted by whether the corresponding
root object is found in checkpoint tree.
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c
index f1d5992..89c7856 100644
--- a/fs/nilfs2/the_nilfs.c
+++ b/fs/nilfs2/the_nilfs.c
@@ -954,26 +954,20 @@
int nilfs_checkpoint_is_mounted(struct the_nilfs *nilfs, __u64 cno,
int snapshot_mount)
{
- struct nilfs_sb_info *sbi;
- int ret = 0;
+ struct nilfs_root *root;
+ int ret;
- down_read(&nilfs->ns_super_sem);
- if (cno == 0 || cno > nilfs->ns_cno)
- goto out_unlock;
+ if (cno < 0 || cno > nilfs->ns_cno)
+ return false;
- list_for_each_entry(sbi, &nilfs->ns_supers, s_list) {
- if (sbi->s_snapshot_cno == cno &&
- (!snapshot_mount || nilfs_test_opt(sbi, SNAPSHOT))) {
- /* exclude read-only mounts */
- ret++;
- break;
- }
- }
- /* for protecting recent checkpoints */
if (cno >= nilfs_last_cno(nilfs))
- ret++;
+ return true; /* protect recent checkpoints */
- out_unlock:
- up_read(&nilfs->ns_super_sem);
+ ret = false;
+ root = nilfs_lookup_root(nilfs, cno);
+ if (root) {
+ ret = true;
+ nilfs_put_root(root);
+ }
return ret;
}