aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/ocfs2.h
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/ocfs2.h
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/ocfs2.h')
-rw-r--r--fs/ocfs2/ocfs2.h10
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
index 1386281950d..1fde52c96d2 100644
--- a/fs/ocfs2/ocfs2.h
+++ b/fs/ocfs2/ocfs2.h
@@ -151,6 +151,14 @@ struct ocfs2_lock_res {
151#endif 151#endif
152}; 152};
153 153
154struct ocfs2_orphan_scan {
155 struct mutex os_lock;
156 struct ocfs2_super *os_osb;
157 struct ocfs2_lock_res os_lockres; /* lock to synchronize scans */
158 struct delayed_work os_orphan_scan_work;
159 u32 os_seqno; /* incremented on every scan */
160};
161
154struct ocfs2_dlm_debug { 162struct ocfs2_dlm_debug {
155 struct kref d_refcnt; 163 struct kref d_refcnt;
156 struct dentry *d_locking_state; 164 struct dentry *d_locking_state;
@@ -341,6 +349,8 @@ struct ocfs2_super
341 unsigned int *osb_orphan_wipes; 349 unsigned int *osb_orphan_wipes;
342 wait_queue_head_t osb_wipe_event; 350 wait_queue_head_t osb_wipe_event;
343 351
352 struct ocfs2_orphan_scan osb_orphan_scan;
353
344 /* used to protect metaecc calculation check of xattr. */ 354 /* used to protect metaecc calculation check of xattr. */
345 spinlock_t osb_xattr_lock; 355 spinlock_t osb_xattr_lock;
346 356