diff options
author | Steven Whitehouse <swhiteho@redhat.com> | 2008-05-21 12:03:22 -0400 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2008-06-27 04:39:22 -0400 |
commit | 6802e3400ff4549525930ee744030c36fce9cc73 (patch) | |
tree | db889bf5337c1d3bb12ebbf571c3c1cad1040496 /fs/gfs2/glock.h | |
parent | 543cf4cb3fe6f6cae3651ba918b9c56200b257d0 (diff) |
[GFS2] Clean up the glock core
This patch implements a number of cleanups to the core of the
GFS2 glock code. As a result a lot of code is removed. It looks
like a really big change, but actually a large part of this patch
is either removing or moving existing code.
There are some new bits too though, such as the new run_queue()
function which is considerably streamlined. Highlights of this
patch include:
o Fixes a cluster coherency bug during SH -> EX lock conversions
o Removes the "glmutex" code in favour of a single bit lock
o Removes the ->go_xmote_bh() for inodes since it was duplicating
->go_lock()
o We now only use the ->lm_lock() function for both locks and
unlocks (i.e. unlock is a lock with target mode LM_ST_UNLOCKED)
o The fast path is considerably shortly, giving performance gains
especially with lock_nolock
o The glock_workqueue is now used for all the callbacks from the DLM
which allows us to simplify the lock_dlm module (see following patch)
o The way is now open to make further changes such as eliminating the two
threads (gfs2_glockd and gfs2_scand) in favour of a more efficient
scheme.
This patch has undergone extensive testing with various test suites
so it should be pretty stable by now.
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Cc: Bob Peterson <rpeterso@redhat.com>
Diffstat (limited to 'fs/gfs2/glock.h')
-rw-r--r-- | fs/gfs2/glock.h | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h index cdad3e6f8150..7389f8ef0a31 100644 --- a/fs/gfs2/glock.h +++ b/fs/gfs2/glock.h | |||
@@ -26,11 +26,8 @@ | |||
26 | #define GL_SKIP 0x00000100 | 26 | #define GL_SKIP 0x00000100 |
27 | #define GL_ATIME 0x00000200 | 27 | #define GL_ATIME 0x00000200 |
28 | #define GL_NOCACHE 0x00000400 | 28 | #define GL_NOCACHE 0x00000400 |
29 | #define GL_FLOCK 0x00000800 | ||
30 | #define GL_NOCANCEL 0x00001000 | ||
31 | 29 | ||
32 | #define GLR_TRYFAILED 13 | 30 | #define GLR_TRYFAILED 13 |
33 | #define GLR_CANCELED 14 | ||
34 | 31 | ||
35 | static inline struct gfs2_holder *gfs2_glock_is_locked_by_me(struct gfs2_glock *gl) | 32 | static inline struct gfs2_holder *gfs2_glock_is_locked_by_me(struct gfs2_glock *gl) |
36 | { | 33 | { |
@@ -41,6 +38,8 @@ static inline struct gfs2_holder *gfs2_glock_is_locked_by_me(struct gfs2_glock * | |||
41 | spin_lock(&gl->gl_spin); | 38 | spin_lock(&gl->gl_spin); |
42 | pid = task_pid(current); | 39 | pid = task_pid(current); |
43 | list_for_each_entry(gh, &gl->gl_holders, gh_list) { | 40 | list_for_each_entry(gh, &gl->gl_holders, gh_list) { |
41 | if (!test_bit(HIF_HOLDER, &gh->gh_iflags)) | ||
42 | break; | ||
44 | if (gh->gh_owner_pid == pid) | 43 | if (gh->gh_owner_pid == pid) |
45 | goto out; | 44 | goto out; |
46 | } | 45 | } |
@@ -70,7 +69,7 @@ static inline int gfs2_glock_is_blocking(struct gfs2_glock *gl) | |||
70 | { | 69 | { |
71 | int ret; | 70 | int ret; |
72 | spin_lock(&gl->gl_spin); | 71 | spin_lock(&gl->gl_spin); |
73 | ret = test_bit(GLF_DEMOTE, &gl->gl_flags) || !list_empty(&gl->gl_waiters3); | 72 | ret = test_bit(GLF_DEMOTE, &gl->gl_flags); |
74 | spin_unlock(&gl->gl_spin); | 73 | spin_unlock(&gl->gl_spin); |
75 | return ret; | 74 | return ret; |
76 | } | 75 | } |
@@ -98,6 +97,7 @@ int gfs2_glock_nq_num(struct gfs2_sbd *sdp, | |||
98 | int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs); | 97 | int gfs2_glock_nq_m(unsigned int num_gh, struct gfs2_holder *ghs); |
99 | void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs); | 98 | void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs); |
100 | void gfs2_glock_dq_uninit_m(unsigned int num_gh, struct gfs2_holder *ghs); | 99 | void gfs2_glock_dq_uninit_m(unsigned int num_gh, struct gfs2_holder *ghs); |
100 | void gfs2_print_dbg(struct seq_file *seq, const char *fmt, ...); | ||
101 | 101 | ||
102 | /** | 102 | /** |
103 | * gfs2_glock_nq_init - intialize a holder and enqueue it on a glock | 103 | * gfs2_glock_nq_init - intialize a holder and enqueue it on a glock |
@@ -130,7 +130,6 @@ int gfs2_lvb_hold(struct gfs2_glock *gl); | |||
130 | void gfs2_lvb_unhold(struct gfs2_glock *gl); | 130 | void gfs2_lvb_unhold(struct gfs2_glock *gl); |
131 | 131 | ||
132 | void gfs2_glock_cb(void *cb_data, unsigned int type, void *data); | 132 | void gfs2_glock_cb(void *cb_data, unsigned int type, void *data); |
133 | |||
134 | void gfs2_glock_schedule_for_reclaim(struct gfs2_glock *gl); | 133 | void gfs2_glock_schedule_for_reclaim(struct gfs2_glock *gl); |
135 | void gfs2_reclaim_glock(struct gfs2_sbd *sdp); | 134 | void gfs2_reclaim_glock(struct gfs2_sbd *sdp); |
136 | void gfs2_gl_hash_clear(struct gfs2_sbd *sdp, int wait); | 135 | void gfs2_gl_hash_clear(struct gfs2_sbd *sdp, int wait); |