Source-Changes-D archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: src/sys



On Mon May 04 2009 at 15:06:56 +0000, YAMAMOTO Takashi wrote:
> >> > Log Message:
> >> > when freeing cn_pnbuf, make it NULL if DIAGNOSTIC.
> >> 
> >> Even better if PNBUF_PUT() does it so that we catch all violations?
> 
> i don't like such a "magic" macro.

I don't like namei ;)

> these #ifdef indicate that cn_pnbuf == NULL is not a valid test for HASBUF.
> ie. this commit is not intended to modify the api.

Also, I think that HASBUF should be removed and we could use a NULL
pointer to signal "no buffer".  Since PNBUF_PUT() does not do anything to
HASBUF, currently it is impossible to determine if the buffer exists or
not after calling a VOP.  This is a real problem for libp2k.  I considered
using SAVESTART, but since that's not a sure way (cf. tmpfs ;) and likely
causes even more problems, I gave up.

I guess puffs now panics on DIAGNOSTIC kernels (see kern/38188).
I should've fixed it "a little" earlier, but somehow I didn't just have
the time.  I whipped up a patch, but due to the abovementioned issues
with HASBUF/cn_pnbuf I can't currently test it in userland.  And I
really really don't have time to play kernel games today (or tomorrow).
If someone can test it, please commit it.

Index: puffs_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/fs/puffs/puffs_vnops.c,v
retrieving revision 1.131
diff -p -u -r1.131 puffs_vnops.c
--- puffs_vnops.c       26 Nov 2008 20:17:33 -0000      1.131
+++ puffs_vnops.c       4 May 2009 15:29:10 -0000
@@ -581,6 +581,13 @@ puffs_vnop_lookup(void *v)
                cnp->cn_consume = MIN(lookup_msg->pvnr_cn.pkcn_consume,
                    strlen(cnp->cn_nameptr) - cnp->cn_namelen);
 
+       /*
+        * We need the name in remove and rmdir (well, rename too, but
+        * SAVESTART takes care of that)
+        */
+       if (cnp->cn_nameiop == DELETE)
+               cnp->cn_flags |= SAVENAME;
+
  out:
        if (cnp->cn_flags & ISDOTDOT)
                vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY);
@@ -1439,6 +1446,8 @@ puffs_vnop_remove(void *v)
        RELEPN_AND_VP(vp, pn);
 
        error = checkerr(pmp, error, __func__);
+       if (error || (cnp->cn_flags & SAVESTART) == 0)
+               PNBUF_PUT(cnp->cn_pnbuf);
        return error;
 }
 
@@ -1544,6 +1553,9 @@ puffs_vnop_rmdir(void *v)
        RELEPN_AND_VP(dvp, dpn);
        RELEPN_AND_VP(vp, pn);
 
+       if (error || (cnp->cn_flags & SAVESTART) == 0)
+               PNBUF_PUT(cnp->cn_pnbuf);
+
        return error;
 }
 


Home | Main Index | Thread Index | Old Index