summaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/dcache.h
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2009-01-12 23:20:31 +0100
committerMark Fasheh <mfasheh@suse.com>2009-02-02 23:20:16 +0100
commitea455f8ab68338ba69f5d3362b342c115bea8e13 (patch)
tree17c052011f821ff5897028a27a1f8cba96046b67 /fs/ocfs2/dcache.h
parentManually revert "mlock: downgrade mmap sem while populating mlocked regions" (diff)
downloadlinux-ea455f8ab68338ba69f5d3362b342c115bea8e13.tar.xz
linux-ea455f8ab68338ba69f5d3362b342c115bea8e13.zip
ocfs2: Push out dropping of dentry lock to ocfs2_wq
Dropping of last reference to dentry lock is a complicated operation involving dropping of reference to inode. This can get complicated and quota code in particular needs to obtain some quota locks which leads to potential deadlock. Thus we defer dropping of inode reference to ocfs2_wq. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2/dcache.h')
-rw-r--r--fs/ocfs2/dcache.h9
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/ocfs2/dcache.h b/fs/ocfs2/dcache.h
index c091c34d9883..d06e16c06640 100644
--- a/fs/ocfs2/dcache.h
+++ b/fs/ocfs2/dcache.h
@@ -29,8 +29,13 @@
extern struct dentry_operations ocfs2_dentry_ops;
struct ocfs2_dentry_lock {
+ /* Use count of dentry lock */
unsigned int dl_count;
- u64 dl_parent_blkno;
+ union {
+ /* Linked list of dentry locks to release */
+ struct ocfs2_dentry_lock *dl_next;
+ u64 dl_parent_blkno;
+ };
/*
* The ocfs2_dentry_lock keeps an inode reference until
@@ -47,6 +52,8 @@ int ocfs2_dentry_attach_lock(struct dentry *dentry, struct inode *inode,
void ocfs2_dentry_lock_put(struct ocfs2_super *osb,
struct ocfs2_dentry_lock *dl);
+void ocfs2_drop_dl_inodes(struct work_struct *work);
+
struct dentry *ocfs2_find_local_alias(struct inode *inode, u64 parent_blkno,
int skip_unhashed);