aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/super.c
diff options
context:
space:
mode:
authorSrinivas Eeda <srinivas.eeda@oracle.com>2009-06-03 20:02:55 -0400
committerJoel Becker <joel.becker@oracle.com>2009-06-03 22:14:31 -0400
commit83273932fbefb6ceef9c0b82ac4d23900728f4d9 (patch)
tree7ece8471af3d2a22543542e990369aca47aa3d25 /fs/ocfs2/super.c
parentedd45c08499a3e9d4c25431cd2b6a9ce5f692c92 (diff)
ocfs2: timer to queue scan of all orphan slots
When a dentry is unlinked, the unlinking node takes an EX on the dentry lock before moving the dentry to the orphan directory. Other nodes that have this dentry in cache have a PR on the same dentry lock. When the EX is requested, the other nodes flag the corresponding inode as MAYBE_ORPHANED during downconvert. The inode is finally deleted when the last node to iput the inode sees that i_nlink==0 and the MAYBE_ORPHANED flag is set. A problem arises if a node is forced to free dentry locks because of memory pressure. If this happens, the node will no longer get downconvert notifications for the dentries that have been unlinked on another node. If it also happens that node is actively using the corresponding inode and happens to be the one performing the last iput on that inode, it will fail to delete the inode as it will not have the MAYBE_ORPHANED flag set. This patch fixes this shortcoming by introducing a periodic scan of the orphan directories to delete such inodes. Care has been taken to distribute the workload across the cluster so that no one node has to perform the task all the time. Signed-off-by: Srinivas Eeda <srinivas.eeda@oracle.com> Signed-off-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs/ocfs2/super.c')
-rw-r--r--fs/ocfs2/super.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/ocfs2/super.c b/fs/ocfs2/super.c
index 79ff8d9d37e0..44ac27e2d1f5 100644
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1802,6 +1802,8 @@ static void ocfs2_dismount_volume(struct super_block *sb, int mnt_err)
1802 1802
1803 ocfs2_truncate_log_shutdown(osb); 1803 ocfs2_truncate_log_shutdown(osb);
1804 1804
1805 ocfs2_orphan_scan_stop(osb);
1806
1805 /* This will disable recovery and flush any recovery work. */ 1807 /* This will disable recovery and flush any recovery work. */
1806 ocfs2_recovery_exit(osb); 1808 ocfs2_recovery_exit(osb);
1807 1809
@@ -1957,6 +1959,13 @@ static int ocfs2_initialize_super(struct super_block *sb,
1957 goto bail; 1959 goto bail;
1958 } 1960 }
1959 1961
1962 status = ocfs2_orphan_scan_init(osb);
1963 if (status) {
1964 mlog(ML_ERROR, "Unable to initialize delayed orphan scan\n");
1965 mlog_errno(status);
1966 goto bail;
1967 }
1968
1960 init_waitqueue_head(&osb->checkpoint_event); 1969 init_waitqueue_head(&osb->checkpoint_event);
1961 atomic_set(&osb->needs_checkpoint, 0); 1970 atomic_set(&osb->needs_checkpoint, 0);
1962 1971