*/
 int nilfs_cpfile_change_cpmode(struct inode *cpfile, __u64 cno, int mode)
 {
-       struct the_nilfs *nilfs;
        int ret;
 
-       nilfs = NILFS_MDT(cpfile)->mi_nilfs;
-
        switch (mode) {
        case NILFS_CHECKPOINT:
-               /*
-                * Check for protecting existing snapshot mounts:
-                * ns_mount_mutex is used to make this operation atomic and
-                * exclusive with a new mount job.  Though it doesn't cover
-                * umount, it's enough for the purpose.
-                */
-               if (nilfs_checkpoint_is_mounted(nilfs, cno, 1)) {
-                       /* Current implementation does not have to protect
-                          plain read-only mounts since they are exclusive
-                          with a read/write mount and are protected from the
-                          cleaner. */
+               if (nilfs_checkpoint_is_mounted(cpfile->i_sb, cno))
+                       /*
+                        * Current implementation does not have to protect
+                        * plain read-only mounts since they are exclusive
+                        * with a read/write mount and are protected from the
+                        * cleaner.
+                        */
                        ret = -EBUSY;
-               } else
+               else
                        ret = nilfs_cpfile_clear_snapshot(cpfile, cno);
                return ret;
        case NILFS_SNAPSHOT:
 
        return 0;
 }
 
+struct inode *nilfs_ilookup(struct super_block *sb, struct nilfs_root *root,
+                           unsigned long ino)
+{
+       struct nilfs_iget_args args = {
+               .ino = ino, .root = root, .cno = 0, .for_gc = 0
+       };
+
+       return ilookup5(sb, ino, nilfs_iget_test, &args);
+}
+
 struct inode *nilfs_iget_locked(struct super_block *sb, struct nilfs_root *root,
                                unsigned long ino)
 {
 
 extern void nilfs_set_inode_flags(struct inode *);
 extern int nilfs_read_inode_common(struct inode *, struct nilfs_inode *);
 extern void nilfs_write_inode_common(struct inode *, struct nilfs_inode *, int);
+struct inode *nilfs_ilookup(struct super_block *sb, struct nilfs_root *root,
+                           unsigned long ino);
 struct inode *nilfs_iget_locked(struct super_block *sb, struct nilfs_root *root,
                                unsigned long ino);
 struct inode *nilfs_iget(struct super_block *sb, struct nilfs_root *root,
 extern int nilfs_cleanup_super(struct nilfs_sb_info *);
 int nilfs_attach_checkpoint(struct nilfs_sb_info *sbi, __u64 cno, int curr_mnt,
                            struct nilfs_root **root);
+int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno);
 
 /* gcinode.c */
 int nilfs_gccache_submit_read_data(struct inode *, sector_t, sector_t, __u64,
 
        return nilfs_tree_was_touched(root_dentry);
 }
 
+int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno)
+{
+       struct the_nilfs *nilfs = NILFS_SB(sb)->s_nilfs;
+       struct nilfs_root *root;
+       struct inode *inode;
+       struct dentry *dentry;
+       int ret;
+
+       if (cno < 0 || cno > nilfs->ns_cno)
+               return false;
+
+       if (cno >= nilfs_last_cno(nilfs))
+               return true;    /* protect recent checkpoints */
+
+       ret = false;
+       root = nilfs_lookup_root(NILFS_SB(sb)->s_nilfs, cno);
+       if (root) {
+               inode = nilfs_ilookup(sb, root, NILFS_ROOT_INO);
+               if (inode) {
+                       dentry = d_find_alias(inode);
+                       if (dentry) {
+                               if (nilfs_tree_was_touched(dentry))
+                                       ret = nilfs_try_to_shrink_tree(dentry);
+                               dput(dentry);
+                       }
+                       iput(inode);
+               }
+               nilfs_put_root(root);
+       }
+       return ret;
+}
+
 /**
  * nilfs_fill_super() - initialize a super block instance
  * @sb: super_block
 
                kfree(root);
        }
 }
-
-int nilfs_checkpoint_is_mounted(struct the_nilfs *nilfs, __u64 cno,
-                               int snapshot_mount)
-{
-       struct nilfs_root *root;
-       int ret;
-
-       if (cno < 0 || cno > nilfs->ns_cno)
-               return false;
-
-       if (cno >= nilfs_last_cno(nilfs))
-               return true;    /* protect recent checkpoints */
-
-       ret = false;
-       root = nilfs_lookup_root(nilfs, cno);
-       if (root) {
-               ret = true;
-               nilfs_put_root(root);
-       }
-       return ret;
-}
 
                                             __u64 cno);
 void nilfs_put_root(struct nilfs_root *root);
 struct nilfs_sb_info *nilfs_find_sbinfo(struct the_nilfs *, int, __u64);
-int nilfs_checkpoint_is_mounted(struct the_nilfs *, __u64, int);
 int nilfs_near_disk_full(struct the_nilfs *);
 void nilfs_fall_back_super_block(struct the_nilfs *);
 void nilfs_swap_super_block(struct the_nilfs *);