diff options
author | Anand Avati <avati@redhat.com> | 2013-12-03 16:30:45 -0800 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2014-01-13 21:44:19 -0800 |
commit | aa3b01533efcd85fc1e654ac14a03ab8e1d5bbab (patch) | |
tree | ee2640323d45c3822ffba89685e9da42d253e6cd /xlators/features/locks/src/locks.h | |
parent | ce86c132347f0a788ab50ffbd6795a2eb982074e (diff) |
locks: various fixes
- implement ref/unref of entry locks (and fix bad pointer deref crashes)
- code cleanup and deleted various data types
- fix improper read/write lock conflict detection in entrylk
- fix indefinite hang of blocked locks on disconnect
- register locks in client_t synchronously, fix crashes in disconnect path
Change-Id: Id273690c9111b8052139d1847060d1fb5a711924
BUG: 849630
Signed-off-by: Anand Avati <avati@redhat.com>
Reviewed-on: http://review.gluster.org/6638
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Kaleb KEITHLEY <kkeithle@redhat.com>
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'xlators/features/locks/src/locks.h')
-rw-r--r-- | xlators/features/locks/src/locks.h | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/xlators/features/locks/src/locks.h b/xlators/features/locks/src/locks.h index 76fc941d74c..8c2a6f867ee 100644 --- a/xlators/features/locks/src/locks.h +++ b/xlators/features/locks/src/locks.h @@ -65,7 +65,7 @@ struct __pl_inode_lock { struct gf_flock user_flock; /* the flock supplied by the user */ xlator_t *this; /* required for blocked locks */ - fd_t *fd; + struct __pl_inode *pl_inode; call_frame_t *frame; @@ -80,6 +80,8 @@ struct __pl_inode_lock { pid_t client_pid; /* pid of client process */ char *connection_id; /* stores the client connection id */ + + struct list_head client_list; /* list of all locks from a client */ }; typedef struct __pl_inode_lock pl_inode_lock_t; @@ -103,9 +105,11 @@ typedef struct __pl_dom_list_t pl_dom_list_t; struct __entry_lock { struct list_head domain_list; /* list_head back to pl_dom_list_t */ struct list_head blocked_locks; /* list_head back to blocked_entrylks */ + int ref; call_frame_t *frame; xlator_t *this; + struct __pl_inode *pinode; const char *volume; @@ -115,11 +119,13 @@ struct __entry_lock { struct timeval blkd_time; /*time at which lock was queued into blkd list*/ struct timeval granted_time; /*time at which lock was queued into active list*/ - void *trans; + void *client; gf_lkowner_t owner; pid_t client_pid; /* pid of client process */ char *connection_id; /* stores the client connection id */ + + struct list_head client_list; /* list of all locks from a client */ }; typedef struct __entry_lock pl_entry_lock_t; @@ -144,12 +150,6 @@ struct __pl_inode { typedef struct __pl_inode pl_inode_t; -struct __pl_fd { - gf_boolean_t nonblocking; /* whether O_NONBLOCK has been set */ -}; -typedef struct __pl_fd pl_fd_t; - - typedef struct { gf_boolean_t mandatory; /* if mandatory locking is enabled */ gf_boolean_t trace; /* trace lock requests in and out */ @@ -178,15 +178,27 @@ typedef struct { } pl_fdctx_t; +struct _locker { + struct list_head lockers; + char *volume; + inode_t *inode; + gf_lkowner_t owner; +}; + typedef struct _locks_ctx { - gf_lock_t ltable_lock; /* only for replace, - ltable has its own internal - lock for operations */ - struct _lock_table *ltable; + pthread_mutex_t lock; + struct list_head inodelk_lockers; + struct list_head entrylk_lockers; } pl_ctx_t; pl_ctx_t * pl_ctx_get (client_t *client, xlator_t *xlator); +int +pl_inodelk_client_cleanup (xlator_t *this, pl_ctx_t *ctx); + +int +pl_entrylk_client_cleanup (xlator_t *this, pl_ctx_t *ctx); + #endif /* __POSIX_LOCKS_H__ */ |