tech-kern archive

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

Re: VOP_CREATE hanging



On Tue Aug 12 2008 at 07:40:05 -0700, Adam Burkepile wrote:
> For my subfile project I am creating a directory and not attaching it  
> to a parent directory, but rather storing the inode number of the  
> directory and retrieving it using VGET. I'm having a problem when I  
> try to create files within this directory however, it seems to just  
> hang. Seems to be when I call VOP_CREATE so I was thinking I might  
> have some argument messed up but I've been at it for awhile and can't  
> seem to find the problem.
> 
> Here is a snipit of code from when I attempt to create the file:
> 
>                 printf("subfile not found, needs to be created\n");
>                 NDINIT(&sfnd, CREATE, TRYEMULROOT, UIO_USERSPACE,
>                         SCARG(uap, sub_path));
> 
>                 sfnd.ni_cnd.cn_nameiop = CREATE;
>                 sfnd.ni_cnd.cn_flags |= LOCKPARENT | LOCKLEAF;
>                 if ((SCARG(uap, flags) & O_EXCL) == 0 && ((SCARG(uap,  
> flags) & O_NOFOLLOW) == 0))
>                         sfnd.ni_cnd.cn_flags |= FOLLOW;
> 
>                 /* lock subfile directory */
>                 if(VOP_ISLOCKED(sdvp) == 0){
>                         printf("sdvp is unlocked, now locking\n");
>                         vn_lock(sdvp, LK_EXCLUSIVE | LK_RETRY);
>                 }

Please don't write code which does locking like this, it's just begging
for trouble.  Your code should always know if it has a node locked or not.

>                 /* set the attr of the new file */
>                 VATTR_NULL(&sfva);
>                 sfva.va_type = VREG;
>                 sfva.va_mode = ((bva.va_mode &~ cwdi->cwdi_cmask) &  
> ALLPERMS) &~ S_ISTXT;
>                 if (SCARG(uap, flags) & O_EXCL)
>                         sfva.va_vaflags |= VA_EXCLUSIVE;
> 
>                 error = VOP_CREATE(sdvp,&sfvp,&(sfnd.ni_cnd),&sfva);
>                 printf("VOP_CREATE error = %d\n",error);
> 
> Any advice on why it is hanging or even why it might be hanging this  
> would be greatly appreciated. I can post more info if that would help.

It is not legal to call VOP_CREATE() without calling namei (ultimately
VOP_LOOKUP()), since this call sets up a lot of state in the file system
to prepare for the actual creation operation.  I can see the problem if
you can't execute VOP_LOOKUP due to how you've attached the names ....

There has been some talk of modifying lookup so as to decouple it from
other operations (e.g. VOP_CREATE), but that's not something you can
depend on in the SoC timeframe.  You'll just have to come up with a
different approach.  Or, if you're working just with ffs, you could hack
lookup into pieces so you can call the parts involved with the necessary
setup for create.


Home | Main Index | Thread Index | Old Index