Commit 6dee60f6 authored by Jeff Layton's avatar Jeff Layton

locks: add new struct list_head to struct file_lock

...that we can use to queue file_locks to per-ctx list_heads. Go ahead
and convert locks_delete_lock and locks_dispose_list to use it instead
of the fl_block list.
Signed-off-by: default avatarJeff Layton <jlayton@primarydata.com>
Acked-by: default avatarChristoph Hellwig <hch@lst.de>
parent cb596708
...@@ -207,6 +207,7 @@ static struct kmem_cache *filelock_cache __read_mostly; ...@@ -207,6 +207,7 @@ static struct kmem_cache *filelock_cache __read_mostly;
static void locks_init_lock_heads(struct file_lock *fl) static void locks_init_lock_heads(struct file_lock *fl)
{ {
INIT_HLIST_NODE(&fl->fl_link); INIT_HLIST_NODE(&fl->fl_link);
INIT_LIST_HEAD(&fl->fl_list);
INIT_LIST_HEAD(&fl->fl_block); INIT_LIST_HEAD(&fl->fl_block);
init_waitqueue_head(&fl->fl_wait); init_waitqueue_head(&fl->fl_wait);
} }
...@@ -243,6 +244,7 @@ EXPORT_SYMBOL_GPL(locks_release_private); ...@@ -243,6 +244,7 @@ EXPORT_SYMBOL_GPL(locks_release_private);
void locks_free_lock(struct file_lock *fl) void locks_free_lock(struct file_lock *fl)
{ {
BUG_ON(waitqueue_active(&fl->fl_wait)); BUG_ON(waitqueue_active(&fl->fl_wait));
BUG_ON(!list_empty(&fl->fl_list));
BUG_ON(!list_empty(&fl->fl_block)); BUG_ON(!list_empty(&fl->fl_block));
BUG_ON(!hlist_unhashed(&fl->fl_link)); BUG_ON(!hlist_unhashed(&fl->fl_link));
...@@ -257,8 +259,8 @@ locks_dispose_list(struct list_head *dispose) ...@@ -257,8 +259,8 @@ locks_dispose_list(struct list_head *dispose)
struct file_lock *fl; struct file_lock *fl;
while (!list_empty(dispose)) { while (!list_empty(dispose)) {
fl = list_first_entry(dispose, struct file_lock, fl_block); fl = list_first_entry(dispose, struct file_lock, fl_list);
list_del_init(&fl->fl_block); list_del_init(&fl->fl_list);
locks_free_lock(fl); locks_free_lock(fl);
} }
} }
...@@ -691,7 +693,7 @@ static void locks_delete_lock(struct file_lock **thisfl_p, ...@@ -691,7 +693,7 @@ static void locks_delete_lock(struct file_lock **thisfl_p,
locks_unlink_lock(thisfl_p); locks_unlink_lock(thisfl_p);
if (dispose) if (dispose)
list_add(&fl->fl_block, dispose); list_add(&fl->fl_list, dispose);
else else
locks_free_lock(fl); locks_free_lock(fl);
} }
......
...@@ -934,6 +934,7 @@ int locks_in_grace(struct net *); ...@@ -934,6 +934,7 @@ int locks_in_grace(struct net *);
*/ */
struct file_lock { struct file_lock {
struct file_lock *fl_next; /* singly linked list for this inode */ struct file_lock *fl_next; /* singly linked list for this inode */
struct list_head fl_list; /* link into file_lock_context */
struct hlist_node fl_link; /* node in global lists */ struct hlist_node fl_link; /* node in global lists */
struct list_head fl_block; /* circular list of blocked processes */ struct list_head fl_block; /* circular list of blocked processes */
fl_owner_t fl_owner; fl_owner_t fl_owner;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment