diff options
author | Robert Peterson <rpeterso@redhat.com> | 2007-03-23 17:05:15 -0500 |
---|---|---|
committer | Steven Whitehouse <swhiteho@redhat.com> | 2007-05-01 09:10:55 +0100 |
commit | 04b933f27bc8e7f3f6423020cec58a4eab3bb7a7 (patch) | |
tree | 992d9dd401b81ccb0b1f166fabd3ca315806361e /fs/gfs2/glock.h | |
parent | 172e045a7fcc3ee647fa70dbd585a3c247b49cb2 (diff) | |
download | blackbird-op-linux-04b933f27bc8e7f3f6423020cec58a4eab3bb7a7.tar.gz blackbird-op-linux-04b933f27bc8e7f3f6423020cec58a4eab3bb7a7.zip |
[GFS2] Red Hat bz 228540: owner references
In Testing the previously posted and accepted patch for
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=228540
I uncovered some gfs2 badness. It turns out that the current
gfs2 code saves off a process pointer when glocks is taken
in both the glock and glock holder structures. Those
structures will persist in memory long after the process has
ended; pointers to poisoned memory.
This problem isn't caused by the 228540 fix; the new capability
introduced by the fix just uncovered the problem.
I wrote this patch that avoids saving process pointers
and instead saves off the process pid. Rather than
referencing the bad pointers, it now does process lookups.
There is special code that makes the output nicer for
printing holder information for processes that have ended.
This patch also adds a stub for the new "sprint_symbol"
function that exists in Andrew Morton's -mm patch set, but
won't go into the base kernel until 2.6.22, since it adds
functionality but doesn't fix a bug.
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/glock.h')
-rw-r--r-- | fs/gfs2/glock.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/gfs2/glock.h b/fs/gfs2/glock.h index 5e662eadc6f2..11477ca3a3c0 100644 --- a/fs/gfs2/glock.h +++ b/fs/gfs2/glock.h @@ -38,7 +38,7 @@ static inline int gfs2_glock_is_locked_by_me(struct gfs2_glock *gl) /* Look in glock's list of holders for one with current task as owner */ spin_lock(&gl->gl_spin); list_for_each_entry(gh, &gl->gl_holders, gh_list) { - if (gh->gh_owner == current) { + if (gh->gh_owner_pid == current->pid) { locked = 1; break; } |