[Ocfs2-devel] [PATCH 1/1] Ocfs2: Handle invalid lock_res in lockres_seq_start() for dlmdebug.c
Sunil Mushran
sunil.mushran at oracle.com
Thu Sep 9 09:59:01 PDT 2010
On 09/09/2010 02:16 AM, Tristan Ye wrote:
> In lockres_seq_start() of dlmdebug.c, when you looking at following
> piece of codes:
>
> list_for_each_entry(res, track_list, tracking) {
> if (&res->tracking ==&dlm->tracking_list)
> res = NULL;
> else
> dlm_lockres_get(res);
> break;
> }
>
> ...
>
> if (res) {
> spin_lock(&res->spinlock);
> dump_lockres(res, dl->dl_buf, dl->dl_len - 1);
> spin_unlock(&res->spinlock);
> } else
> dl = NULL;
>
> One thought can come to you that, in the case of 'an-empty-list', cursor 'res'
> here is not an INVALID pointer for real dlm_lock_resource object, it is nothing
> than a fake address figured out by arbitary 'container_of()' way, the patch tries
> to check track_list, and avoid accessing an invalid pointer if the list is empty,
> it fixes following oops:
>
> http://oss.oracle.com/bugzilla/show_bug.cgi?id=1287
>
> Signed-off-by: Tristan Ye<tristan.ye at oracle.com>
> ---
>
Such a detailed description is only required if the bug fix
is complicated. This is a simple fix. Just say that this handles
the case in which the dlm->tracking_list is empty and mention
the bz.
> fs/ocfs2/dlm/dlmdebug.c | 7 +++++++
> 1 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/fs/ocfs2/dlm/dlmdebug.c b/fs/ocfs2/dlm/dlmdebug.c
> index 5efdd37..06d668a 100644
> --- a/fs/ocfs2/dlm/dlmdebug.c
> +++ b/fs/ocfs2/dlm/dlmdebug.c
> @@ -639,6 +639,12 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos)
> else
> track_list =&dlm->tracking_list;
>
> + if (list_empty(track_list)) {
> + dl = NULL;
> + spin_unlock(&dlm->track_lock);
> + goto bail;
> + }
> +
>
You should add this check as part of the else block above so
that we check for empty list only at the start.
> list_for_each_entry(res, track_list, tracking) {
> if (&res->tracking ==&dlm->tracking_list)
> res = NULL;
> @@ -660,6 +666,7 @@ static void *lockres_seq_start(struct seq_file *m, loff_t *pos)
> } else
> dl = NULL;
>
> +bail:
> /* passed to seq_show */
> return dl;
> }
>
More information about the Ocfs2-devel
mailing list