diff options
author | Srinivas Eeda <srinivas.eeda@oracle.com> | 2009-06-03 20:02:55 -0400 |
---|---|---|
committer | Joel Becker <joel.becker@oracle.com> | 2009-06-03 22:14:31 -0400 |
commit | 83273932fbefb6ceef9c0b82ac4d23900728f4d9 (patch) | |
tree | 7ece8471af3d2a22543542e990369aca47aa3d25 /fs/ocfs2/ocfs2.h | |
parent | edd45c08499a3e9d4c25431cd2b6a9ce5f692c92 (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.h | 10 |
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 | ||
154 | struct 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 | |||
154 | struct ocfs2_dlm_debug { | 162 | struct 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 | ||