aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nilfs2/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nilfs2/super.c')
-rw-r--r--fs/nilfs2/super.c26
1 files changed, 7 insertions, 19 deletions
diff --git a/fs/nilfs2/super.c b/fs/nilfs2/super.c
index af3ba0478cdf..7ac2a122ca1d 100644
--- a/fs/nilfs2/super.c
+++ b/fs/nilfs2/super.c
@@ -994,23 +994,16 @@ static int nilfs_attach_snapshot(struct super_block *s, __u64 cno,
994 return ret; 994 return ret;
995} 995}
996 996
997static int nilfs_tree_was_touched(struct dentry *root_dentry)
998{
999 return d_count(root_dentry) > 1;
1000}
1001
1002/** 997/**
1003 * nilfs_try_to_shrink_tree() - try to shrink dentries of a checkpoint 998 * nilfs_tree_is_busy() - try to shrink dentries of a checkpoint
1004 * @root_dentry: root dentry of the tree to be shrunk 999 * @root_dentry: root dentry of the tree to be shrunk
1005 * 1000 *
1006 * This function returns true if the tree was in-use. 1001 * This function returns true if the tree was in-use.
1007 */ 1002 */
1008static int nilfs_try_to_shrink_tree(struct dentry *root_dentry) 1003static bool nilfs_tree_is_busy(struct dentry *root_dentry)
1009{ 1004{
1010 if (have_submounts(root_dentry))
1011 return true;
1012 shrink_dcache_parent(root_dentry); 1005 shrink_dcache_parent(root_dentry);
1013 return nilfs_tree_was_touched(root_dentry); 1006 return d_count(root_dentry) > 1;
1014} 1007}
1015 1008
1016int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno) 1009int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno)
@@ -1034,8 +1027,7 @@ int nilfs_checkpoint_is_mounted(struct super_block *sb, __u64 cno)
1034 if (inode) { 1027 if (inode) {
1035 dentry = d_find_alias(inode); 1028 dentry = d_find_alias(inode);
1036 if (dentry) { 1029 if (dentry) {
1037 if (nilfs_tree_was_touched(dentry)) 1030 ret = nilfs_tree_is_busy(dentry);
1038 ret = nilfs_try_to_shrink_tree(dentry);
1039 dput(dentry); 1031 dput(dentry);
1040 } 1032 }
1041 iput(inode); 1033 iput(inode);
@@ -1331,11 +1323,8 @@ nilfs_mount(struct file_system_type *fs_type, int flags,
1331 1323
1332 s->s_flags |= MS_ACTIVE; 1324 s->s_flags |= MS_ACTIVE;
1333 } else if (!sd.cno) { 1325 } else if (!sd.cno) {
1334 int busy = false; 1326 if (nilfs_tree_is_busy(s->s_root)) {
1335 1327 if ((flags ^ s->s_flags) & MS_RDONLY) {
1336 if (nilfs_tree_was_touched(s->s_root)) {
1337 busy = nilfs_try_to_shrink_tree(s->s_root);
1338 if (busy && (flags ^ s->s_flags) & MS_RDONLY) {
1339 printk(KERN_ERR "NILFS: the device already " 1328 printk(KERN_ERR "NILFS: the device already "
1340 "has a %s mount.\n", 1329 "has a %s mount.\n",
1341 (s->s_flags & MS_RDONLY) ? 1330 (s->s_flags & MS_RDONLY) ?
@@ -1343,8 +1332,7 @@ nilfs_mount(struct file_system_type *fs_type, int flags,
1343 err = -EBUSY; 1332 err = -EBUSY;
1344 goto failed_super; 1333 goto failed_super;
1345 } 1334 }
1346 } 1335 } else {
1347 if (!busy) {
1348 /* 1336 /*
1349 * Try remount to setup mount states if the current 1337 * Try remount to setup mount states if the current
1350 * tree is not mounted and only snapshots use this sb. 1338 * tree is not mounted and only snapshots use this sb.