diff options
Diffstat (limited to 'fs/gfs2/glock.c')
-rw-r--r-- | fs/gfs2/glock.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index c04159031538..2ef8accf1cbc 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c | |||
@@ -47,6 +47,7 @@ struct greedy { | |||
47 | typedef void (*glock_examiner) (struct gfs2_glock * gl); | 47 | typedef void (*glock_examiner) (struct gfs2_glock * gl); |
48 | 48 | ||
49 | static int gfs2_dump_lockstate(struct gfs2_sbd *sdp); | 49 | static int gfs2_dump_lockstate(struct gfs2_sbd *sdp); |
50 | static int dump_glock(struct gfs2_glock *gl); | ||
50 | 51 | ||
51 | /** | 52 | /** |
52 | * relaxed_state_ok - is a requested lock compatible with the current lock mode? | 53 | * relaxed_state_ok - is a requested lock compatible with the current lock mode? |
@@ -290,6 +291,8 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, uint64_t number, | |||
290 | spin_lock_init(&gl->gl_spin); | 291 | spin_lock_init(&gl->gl_spin); |
291 | 292 | ||
292 | gl->gl_state = LM_ST_UNLOCKED; | 293 | gl->gl_state = LM_ST_UNLOCKED; |
294 | gl->gl_owner = NULL; | ||
295 | gl->gl_ip = 0; | ||
293 | INIT_LIST_HEAD(&gl->gl_holders); | 296 | INIT_LIST_HEAD(&gl->gl_holders); |
294 | INIT_LIST_HEAD(&gl->gl_waiters1); | 297 | INIT_LIST_HEAD(&gl->gl_waiters1); |
295 | INIT_LIST_HEAD(&gl->gl_waiters2); | 298 | INIT_LIST_HEAD(&gl->gl_waiters2); |
@@ -661,8 +664,11 @@ void gfs2_glmutex_lock(struct gfs2_glock *gl) | |||
661 | spin_lock(&gl->gl_spin); | 664 | spin_lock(&gl->gl_spin); |
662 | if (test_and_set_bit(GLF_LOCK, &gl->gl_flags)) | 665 | if (test_and_set_bit(GLF_LOCK, &gl->gl_flags)) |
663 | list_add_tail(&gh.gh_list, &gl->gl_waiters1); | 666 | list_add_tail(&gh.gh_list, &gl->gl_waiters1); |
664 | else | 667 | else { |
668 | gl->gl_owner = current; | ||
669 | gl->gl_ip = (unsigned long)__builtin_return_address(0); | ||
665 | complete(&gh.gh_wait); | 670 | complete(&gh.gh_wait); |
671 | } | ||
666 | spin_unlock(&gl->gl_spin); | 672 | spin_unlock(&gl->gl_spin); |
667 | 673 | ||
668 | wait_for_completion(&gh.gh_wait); | 674 | wait_for_completion(&gh.gh_wait); |
@@ -683,6 +689,10 @@ static int gfs2_glmutex_trylock(struct gfs2_glock *gl) | |||
683 | spin_lock(&gl->gl_spin); | 689 | spin_lock(&gl->gl_spin); |
684 | if (test_and_set_bit(GLF_LOCK, &gl->gl_flags)) | 690 | if (test_and_set_bit(GLF_LOCK, &gl->gl_flags)) |
685 | acquired = 0; | 691 | acquired = 0; |
692 | else { | ||
693 | gl->gl_owner = current; | ||
694 | gl->gl_ip = (unsigned long)__builtin_return_address(0); | ||
695 | } | ||
686 | spin_unlock(&gl->gl_spin); | 696 | spin_unlock(&gl->gl_spin); |
687 | 697 | ||
688 | return acquired; | 698 | return acquired; |
@@ -698,6 +708,8 @@ void gfs2_glmutex_unlock(struct gfs2_glock *gl) | |||
698 | { | 708 | { |
699 | spin_lock(&gl->gl_spin); | 709 | spin_lock(&gl->gl_spin); |
700 | clear_bit(GLF_LOCK, &gl->gl_flags); | 710 | clear_bit(GLF_LOCK, &gl->gl_flags); |
711 | gl->gl_owner = NULL; | ||
712 | gl->gl_ip = 0; | ||
701 | run_queue(gl); | 713 | run_queue(gl); |
702 | BUG_ON(!spin_is_locked(&gl->gl_spin)); | 714 | BUG_ON(!spin_is_locked(&gl->gl_spin)); |
703 | spin_unlock(&gl->gl_spin); | 715 | spin_unlock(&gl->gl_spin); |
@@ -1173,7 +1185,7 @@ int gfs2_glock_nq(struct gfs2_holder *gh) | |||
1173 | struct gfs2_sbd *sdp = gl->gl_sbd; | 1185 | struct gfs2_sbd *sdp = gl->gl_sbd; |
1174 | int error = 0; | 1186 | int error = 0; |
1175 | 1187 | ||
1176 | restart: | 1188 | restart: |
1177 | if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) { | 1189 | if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) { |
1178 | set_bit(HIF_ABORTED, &gh->gh_iflags); | 1190 | set_bit(HIF_ABORTED, &gh->gh_iflags); |
1179 | return -EIO; | 1191 | return -EIO; |
@@ -1196,6 +1208,9 @@ int gfs2_glock_nq(struct gfs2_holder *gh) | |||
1196 | 1208 | ||
1197 | clear_bit(GLF_PREFETCH, &gl->gl_flags); | 1209 | clear_bit(GLF_PREFETCH, &gl->gl_flags); |
1198 | 1210 | ||
1211 | if (error == GLR_TRYFAILED && (gh->gh_flags & GL_DUMP)) | ||
1212 | dump_glock(gl); | ||
1213 | |||
1199 | return error; | 1214 | return error; |
1200 | } | 1215 | } |
1201 | 1216 | ||
@@ -2212,9 +2227,8 @@ static int dump_glock(struct gfs2_glock *gl) | |||
2212 | 2227 | ||
2213 | spin_lock(&gl->gl_spin); | 2228 | spin_lock(&gl->gl_spin); |
2214 | 2229 | ||
2215 | printk(KERN_INFO "Glock (%u, %llu)\n", | 2230 | printk(KERN_INFO "Glock (%u, %llu)\n", gl->gl_name.ln_type, |
2216 | gl->gl_name.ln_type, | 2231 | gl->gl_name.ln_number); |
2217 | gl->gl_name.ln_number); | ||
2218 | printk(KERN_INFO " gl_flags ="); | 2232 | printk(KERN_INFO " gl_flags ="); |
2219 | for (x = 0; x < 32; x++) | 2233 | for (x = 0; x < 32; x++) |
2220 | if (test_bit(x, &gl->gl_flags)) | 2234 | if (test_bit(x, &gl->gl_flags)) |
@@ -2222,6 +2236,8 @@ static int dump_glock(struct gfs2_glock *gl) | |||
2222 | printk(" \n"); | 2236 | printk(" \n"); |
2223 | printk(KERN_INFO " gl_ref = %d\n", atomic_read(&gl->gl_ref.refcount)); | 2237 | printk(KERN_INFO " gl_ref = %d\n", atomic_read(&gl->gl_ref.refcount)); |
2224 | printk(KERN_INFO " gl_state = %u\n", gl->gl_state); | 2238 | printk(KERN_INFO " gl_state = %u\n", gl->gl_state); |
2239 | printk(KERN_INFO " gl_owner = %s\n", gl->gl_owner->comm); | ||
2240 | print_symbol(KERN_INFO " gl_ip = %s\n", gl->gl_ip); | ||
2225 | printk(KERN_INFO " req_gh = %s\n", (gl->gl_req_gh) ? "yes" : "no"); | 2241 | printk(KERN_INFO " req_gh = %s\n", (gl->gl_req_gh) ? "yes" : "no"); |
2226 | printk(KERN_INFO " req_bh = %s\n", (gl->gl_req_bh) ? "yes" : "no"); | 2242 | printk(KERN_INFO " req_bh = %s\n", (gl->gl_req_bh) ? "yes" : "no"); |
2227 | printk(KERN_INFO " lvb_count = %d\n", atomic_read(&gl->gl_lvb_count)); | 2243 | printk(KERN_INFO " lvb_count = %d\n", atomic_read(&gl->gl_lvb_count)); |