xfs
[Top] [All Lists]

page_buf question

To: linux-xfs@xxxxxxxxxxx
Subject: page_buf question
From: Daniel Moore <dxm@xxxxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 31 Jul 2000 17:08:55 +1000
Sender: owner-linux-xfs@xxxxxxxxxxx
I'm just checking out the "XFS with other blocksizes etc" work item,
and it looks pretty good, but I've come across a bug which looks like
another page_buf hiccup.

This chunk takes the list of pages and maps it into a contiguous block
and points pb_addr at it, right?

page_buf.c:601

        if (all_mapped) {
                pb->pb_flags |= _PBF_ALL_PAGES_MAPPED;
                /* A single page buffer is always mappable */
                if ((page_count == 1) && (flags & PBF_MAPPED)) {
                        pb->pb_addr =
                            (caddr_t) page_address(kp->maplist[0]) + kp->
offset;
                        pb->pb_flags |= PBF_MAPPED;
                } else if ((flags & PBF_MAPPED) && (kp->offset == 0)) {
                        pb->pb_addr = (caddr_t) remap_page_array(kp->maplist,
                            page_count);
                        if (pb->pb_addr) {
                                pb->pb_flags |= PBF_MAPPED |
                                    _PBF_ADDR_ALLOCATED;
                        }
                }
        }

I'm hitting a case where all_mapped is true, as is (flags & PBF_MAPPED),
but (kp->offset == 0) isn't. At the same time, pb_addr is NULL.

So when I get out of the block above, pb_addr is still NULL and it doesn't
look like it should be (NULL dereference later on).

Does this ring any bells, guys? I'll keep working on it tomorrow...

-----------------------------------------------------
 Daniel Moore                  dxm@xxxxxxx
 R&D Software Engineer         Phone: +61-3-98348209
 SGI Performance Tools Group   Fax:   +61-3-98132378
-----------------------------------------------------


<Prev in Thread] Current Thread [Next in Thread>