diff --git a/sys/fs/devfs/devfs_devs.pas b/sys/fs/devfs/devfs_devs.pas index 19779660..8ba5e784 100644 --- a/sys/fs/devfs/devfs_devs.pas +++ b/sys/fs/devfs/devfs_devs.pas @@ -324,7 +324,9 @@ begin begin dd:=devfs_parent_dirent(de); if (dd<>nil) then + begin DEVFS_DE_HOLD(dd); + end; if (de^.de_flags and DE_USER)<>0 then begin Assert(dd<>nil,'devfs_delete: nil dd'); @@ -345,7 +347,7 @@ begin sx_unlock(@dm^.dm_lock); if ((flags and DEVFS_DEL_VNLOCKED)=0) then - vn_lock(vp, LK_EXCLUSIVE or LK_INTERLOCK or LK_RETRY) + vn_lock(vp, LK_EXCLUSIVE or LK_INTERLOCK or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}) else VI_UNLOCK(vp); diff --git a/sys/fs/devfs/devfs_vnops.pas b/sys/fs/devfs/devfs_vnops.pas index fc2344f1..1638b08d 100644 --- a/sys/fs/devfs/devfs_vnops.pas +++ b/sys/fs/devfs/devfs_vnops.pas @@ -345,7 +345,7 @@ begin devfs_populate(dmp); sx_xunlock(@dmp^.dm_lock); - vn_lock(vp, locked or LK_RETRY); + vn_lock(vp, locked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); sx_xlock(@dmp^.dm_lock); if DEVFS_DMP_DROP(dmp) then @@ -655,7 +655,7 @@ loop: vp^.v_type:=VBAD; end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY or LK_NOWITNESS); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY or LK_NOWITNESS,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); //VN_LOCK_ASHARE(vp); mtx_lock(devfs_de_interlock); @@ -802,7 +802,7 @@ begin Assert(dev^.si_refcount > 0,'devfs_close() on un-referenced struct cdev'); error:=dsw^.d_close(dev, ap^.a_fflag, S_IFCHR); dev_relthread(dev, ref); - vn_lock(vp, vp_locked or LK_RETRY); + vn_lock(vp, vp_locked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); vdrop(vp); Exit(error); end; @@ -1146,7 +1146,7 @@ begin error:=devfs_allocv(de, dvp^.v_mount, cnp^.cn_lkflags and LK_TYPE_MASK, vpp); dm_unlock^:=False; - vn_lock(dvp, dvplocked or LK_RETRY); + vn_lock(dvp, dvplocked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(error); end; @@ -1397,7 +1397,7 @@ begin td^.td_fpop:=fpop; - vn_lock(vp, vlocked or LK_RETRY); + vn_lock(vp, vlocked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); dev_relthread(dev, ref); if (error<>0) then begin @@ -1708,10 +1708,10 @@ begin sx_xunlock(@dmp^.dm_lock); if (dvp<>vp) then begin - vn_lock(dvp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(dvp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end else begin de^.de_flags:=de^.de_flags or DE_WHITEOUT; @@ -1802,7 +1802,7 @@ begin dev_unlock(); end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(0); end; @@ -1813,7 +1813,7 @@ var error:Integer; begin vp:=ap^.a_vp; - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if ((vp^.v_iflag and VI_DOOMED)<>0) then begin VOP_UNLOCK(vp, 0); diff --git a/sys/fs/fdescfs/fdesc_vnops.pas b/sys/fs/fdescfs/fdesc_vnops.pas index 521c9bba..09f7ac90 100644 --- a/sys/fs/fdescfs/fdesc_vnops.pas +++ b/sys/fs/fdescfs/fdesc_vnops.pas @@ -210,7 +210,7 @@ loop: Exit(error); end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); vp^.v_data :=fd; fd^.fd_vnode:=vp; @@ -367,7 +367,7 @@ begin fdrop(fp); { Re-aquire the lock afterwards. } - vn_lock(dvp, LK_RETRY or LK_EXCLUSIVE); + vn_lock(dvp, LK_RETRY or LK_EXCLUSIVE,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); vdrop(dvp); fvp:=dvp; end else @@ -387,7 +387,7 @@ begin { * The root vnode must be locked last to prevent deadlock condition. } - vn_lock(dvp, LK_RETRY or LK_EXCLUSIVE); + vn_lock(dvp, LK_RETRY or LK_EXCLUSIVE,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); vdrop(dvp); end; @@ -519,7 +519,7 @@ begin error:=vn_start_write(vp, @mp, V_WAIT or PCATCH); if (error=0) then begin - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=VOP_SETATTR(vp, ap^.a_vap); VOP_UNLOCK(vp, 0); vn_finished_write(mp); diff --git a/sys/fs/nullfs/null_subr.pas b/sys/fs/nullfs/null_subr.pas index 28fe4a1b..8828ba63 100644 --- a/sys/fs/nullfs/null_subr.pas +++ b/sys/fs/nullfs/null_subr.pas @@ -8,6 +8,7 @@ interface uses vmount, vnode, + vfs_default, nullfs; { @@ -216,8 +217,7 @@ end; procedure null_destroy_proto(vp:p_vnode;xp:Pointer); begin - mtx_lock(vp^.v_lock); - //lockmgr(@vp^.v_lock, LK_EXCLUSIVE, nil); + lockmgr(@vp^.v_lock, LK_EXCLUSIVE, nil); VI_LOCK(vp); vp^.v_data :=nil; vp^.v_vnlock:=@vp^.v_lock; @@ -273,7 +273,7 @@ begin if (VOP_ISLOCKED(lowervp)<>LK_EXCLUSIVE) then begin Assert((MOUNTTONULLMOUNT(mp)^.nullm_flags and NULLM_CACHE)<>0,'lowervp %p is not excl locked and cache is disabled'); - vn_lock(lowervp, LK_UPGRADE or LK_RETRY); + vn_lock(lowervp, LK_UPGRADE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if ((lowervp^.v_iflag and VI_DOOMED)<>0) then begin vput(lowervp); diff --git a/sys/fs/nullfs/null_vfsops.pas b/sys/fs/nullfs/null_vfsops.pas index afb0ab55..c62e9061 100644 --- a/sys/fs/nullfs/null_vfsops.pas +++ b/sys/fs/nullfs/null_vfsops.pas @@ -151,7 +151,9 @@ begin * XXXKIB This is deadlock-prone as well. } if (isvnunlocked<>0) then - vn_lock(mp^.mnt_vnodecovered, LK_EXCLUSIVE or LK_RETRY); + begin + vn_lock(mp^.mnt_vnodecovered, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); + end; if (error<>0) then Exit(error); @@ -318,7 +320,7 @@ begin VREF(vp); //ASSERT_VOP_UNLOCKED(vp, 'root vnode is locked'); - vn_lock(vp, flags or LK_RETRY); + vn_lock(vp, flags or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); vpp^:=vp; Exit(0); end; diff --git a/sys/fs/nullfs/null_vnops.pas b/sys/fs/nullfs/null_vnops.pas index 7b729a0e..44fc9737 100644 --- a/sys/fs/nullfs/null_vnops.pas +++ b/sys/fs/nullfs/null_vnops.pas @@ -790,8 +790,7 @@ begin * Use the interlock to protect the clearing of v_data to * prevent faults in null_lock(). } - mtx_lock(vp^.v_lock); - //lockmgr(@vp^.v_lock, LK_EXCLUSIVE, nil); + lockmgr(@vp^.v_lock, LK_EXCLUSIVE, nil); VI_LOCK(vp); vp^.v_data:=nil; @@ -897,7 +896,7 @@ begin vdrop(lvp); if (error<>0) then begin - vn_lock(vp, locked or LK_RETRY); + vn_lock(vp, locked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(ENOENT); end; @@ -905,11 +904,11 @@ begin * Exclusive lock is required by insmntque1 call in * null_nodeget() } - error:=vn_lock(ldvp, LK_EXCLUSIVE); + error:=vn_lock(ldvp, LK_EXCLUSIVE,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (error<>0) then begin vrele(ldvp); - vn_lock(vp, locked or LK_RETRY); + vn_lock(vp, locked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(ENOENT); end; vref(ldvp); @@ -918,7 +917,7 @@ begin begin VOP_UNLOCK(dvp^, 0); { keep reference on *dvp } end; - vn_lock(vp, locked or LK_RETRY); + vn_lock(vp, locked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(error); end; diff --git a/sys/fs/ufs/ufs.pas b/sys/fs/ufs/ufs.pas index 1200d06d..80e45c05 100644 --- a/sys/fs/ufs/ufs.pas +++ b/sys/fs/ufs/ufs.pas @@ -254,6 +254,7 @@ var begin Result:=nil; if (vp=nil) then Exit; + VI_LOCK(vp); de:=System.InterlockedExchange(vp^.v_data,nil); if (de<>nil) then begin @@ -264,6 +265,7 @@ begin Result:=de; end; end; + VI_UNLOCK(vp); end; function ufs_allocv(de:p_ufs_dirent;mp:p_mount;lockmode:Integer;vpp:pp_vnode):Integer; @@ -326,6 +328,7 @@ loop: vpp^:=vp; Exit(0); end; + mtx_unlock(ufs_interlock); error:=getnewvnode('ufs', mp, dmp^.ufs_vnops, @vp); @@ -337,8 +340,9 @@ loop: vp^.v_type:=iftovt_tab[de^.ufs_dirent^.d_type]; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY or LK_NOWITNESS); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY or LK_NOWITNESS,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); //VN_LOCK_ASHARE(vp); + mtx_lock(ufs_interlock); System.InterlockedIncrement(de^.ufs_vref); @@ -379,7 +383,7 @@ begin dmp:=VFSTOUFS(mp); sx_xlock(@dmp^.ufs_lock); - error:=ufs_allocv(dmp^.ufs_rootdir, mp, LK_EXCLUSIVE, @vp); + error:=ufs_allocv(dmp^.ufs_rootdir, mp, LK_EXCLUSIVE, @vp); //sx_xunlock if (error<>0) then begin Exit(error); diff --git a/sys/fs/ufs/ufs_vnops.pas b/sys/fs/ufs/ufs_vnops.pas index 54b3f370..a56969dc 100644 --- a/sys/fs/ufs/ufs_vnops.pas +++ b/sys/fs/ufs/ufs_vnops.pas @@ -188,19 +188,23 @@ begin sx_unlock(@dm^.ufs_lock); if ((flags and UFS_DEL_VNLOCKED)=0) then - vn_lock(vp, LK_EXCLUSIVE or LK_INTERLOCK or LK_RETRY) + vn_lock(vp, LK_EXCLUSIVE or LK_INTERLOCK or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}) else VI_UNLOCK(vp); vgone(vp); if ((flags and UFS_DEL_VNLOCKED)=0) then + begin VOP_UNLOCK(vp, 0); + end; vdrop(vp); sx_xlock(@dm^.ufs_lock); end else + begin mtx_unlock(ufs_interlock); + end; if (de^.ufs_symlink<>nil) then begin @@ -495,10 +499,10 @@ begin dvplocked:=VOP_ISLOCKED(dvp); VOP_UNLOCK(dvp, 0); - error:=ufs_allocv(de, dvp^.v_mount, cnp^.cn_lkflags and LK_TYPE_MASK, vpp); + error:=ufs_allocv(de, dvp^.v_mount, cnp^.cn_lkflags and LK_TYPE_MASK, vpp); //sx_xunlock dm_unlock^:=false; - vn_lock(dvp, dvplocked or LK_RETRY); + vn_lock(dvp, dvplocked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(error); end; @@ -539,7 +543,7 @@ begin end; end; - error:=ufs_allocv(de, dvp^.v_mount, cnp^.cn_lkflags and LK_TYPE_MASK, vpp); + error:=ufs_allocv(de, dvp^.v_mount, cnp^.cn_lkflags and LK_TYPE_MASK, vpp); //sx_xunlock dm_unlock^:=false; Exit(error); @@ -925,10 +929,10 @@ begin if (dvp<>vp) then begin - vn_lock(dvp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(dvp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(0); end; @@ -970,10 +974,10 @@ begin if (dvp<>vp) then begin - vn_lock(dvp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(dvp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(0); end; diff --git a/sys/host_ipc.pas b/sys/host_ipc.pas index 2dc2ffe0..d2c06e00 100644 --- a/sys/host_ipc.pas +++ b/sys/host_ipc.pas @@ -313,7 +313,7 @@ var begin node:=AllocMem(SizeOf(TNodeIpcSync)); node^.event:=RTLEventCreate; - node^.tid :=GetThreadID; + node^.tid :=ThreadID; RTLEventResetEvent(node^.event); diff --git a/sys/kern/kern_exec.pas b/sys/kern/kern_exec.pas index 1e7dd729..8401cb81 100644 --- a/sys/kern/kern_exec.pas +++ b/sys/kern/kern_exec.pas @@ -321,7 +321,8 @@ begin VM_PROT_RW, VM_PROT_ALL, MAP_INHERIT_SHARE or MAP_ACC_NO_CHARGE or MAP_COW_NO_BUDGET, - 0); + 0, + nil); if (error<>0) then begin @@ -375,7 +376,11 @@ begin Writeln('vm_map_stack:0x',HexStr(stack_addr,10),'..0x',HexStr(stack_addr+ssiz,10)); - error:=vm_map_stack(map,stack_addr,ssiz,VM_PROT_RW,VM_PROT_ALL,MAP_STACK_GROWS_DOWN); + error:=vm_map_stack(map, + stack_addr,ssiz, + VM_PROT_RW,VM_PROT_ALL, + MAP_STACK_GROWS_DOWN, + nil); if (error<>0) then begin @@ -1314,7 +1319,7 @@ begin Result:=exec_new_vmspace(imgp); - vn_lock(imgp^.vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(imgp^.vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (Result<>0) then Exit; @@ -1520,7 +1525,7 @@ begin if (error<>0) then goto exec_fail; vfslocked:=VFS_LOCK_GIANT(binvp^.v_mount); - vn_lock(binvp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(binvp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); imgp^.vp:=binvp; end; @@ -1554,7 +1559,7 @@ begin imgp^.execpath:=args^.fname; end; - vn_lock(imgp^.vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(imgp^.vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end else if (args^.fname^<>'/') then begin @@ -1612,7 +1617,7 @@ begin { close files on exec } fdcloseexec(); - vn_lock(imgp^.vp, LK_SHARED or LK_RETRY); + vn_lock(imgp^.vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); { Get a reference to the vnode prior to locking the proc } VREF(binvp); @@ -1718,7 +1723,7 @@ begin vrele(binvp); end; - vn_lock(imgp^.vp, LK_SHARED or LK_RETRY); + vn_lock(imgp^.vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); pargs_drop(oldargs); pargs_drop(newargs); diff --git a/sys/kern/kern_mtx.pas b/sys/kern/kern_mtx.pas index 7fdedd06..e381f111 100644 --- a/sys/kern/kern_mtx.pas +++ b/sys/kern/kern_mtx.pas @@ -14,7 +14,7 @@ type n:PChar; c:TRTLCriticalSection; {$IFDEF DEBUG_MTX} - debug_own:array[0..1] of Pointer; + debug_own:array[0..2] of Pointer; {$ENDIF} end; @@ -62,6 +62,7 @@ implementation {$IFDEF DEBUG_MTX} uses + md_systm, kern_thr; {$ENDIF} @@ -82,6 +83,7 @@ var rbp:Pointer; {$ENDIF} begin + //Writeln('lock:',m.n,':',HexStr(@m)); {$IFDEF DEBUG_MTX} if curkthread<>nil then curkthread^.td_debug_mtx:=@m; @@ -94,8 +96,9 @@ begin asm movq %rbp,rbp end; - m.debug_own[0]:=PPointer(rbp)[1]; rbp:=PPointer(rbp)[0]; - m.debug_own[1]:=PPointer(rbp)[1]; rbp:=PPointer(rbp)[0]; + m.debug_own[0]:=md_fuword(PPointer(rbp)[1]); rbp:=md_fuword(PPointer(rbp)[0]); + m.debug_own[1]:=md_fuword(PPointer(rbp)[1]); rbp:=md_fuword(PPointer(rbp)[0]); + m.debug_own[2]:=md_fuword(PPointer(rbp)[1]); {$ENDIF} end; @@ -113,18 +116,21 @@ begin asm movq %rbp,rbp end; - m.debug_own[0]:=PPointer(rbp)[1]; rbp:=PPointer(rbp)[0]; - m.debug_own[1]:=PPointer(rbp)[1]; rbp:=PPointer(rbp)[0]; + m.debug_own[0]:=md_fuword(PPointer(rbp)[1]); rbp:=md_fuword(PPointer(rbp)[0]); + m.debug_own[1]:=md_fuword(PPointer(rbp)[1]); rbp:=md_fuword(PPointer(rbp)[0]); + m.debug_own[2]:=md_fuword(PPointer(rbp)[1]); end; {$ENDIF} end; procedure mtx_unlock(var m:mtx); {$IFNDEF DEBUG_MTX} inline; {$ENDIF} begin + //Writeln('ulck:',m.n,HexStr(@m)); mtx_assert(m); {$IFDEF DEBUG_MTX} m.debug_own[0]:=nil; m.debug_own[1]:=nil; + m.debug_own[2]:=nil; {$ENDIF} LeaveCriticalSection(m.c); end; @@ -138,7 +144,7 @@ procedure mtx_assert(var m:mtx); //inline; begin if not mtx_owned(m) then begin - Assert(false,'mtx_assert:'+IntToStr(m.c.OwningThread)+'<>'+IntToStr(GetCurrentThreadId)); + Assert(false,'mtx_assert:'+IntToStr(m.c.OwningThread)+'<>'+IntToStr(ThreadID)); end; end; diff --git a/sys/kern/kern_rtld.pas b/sys/kern/kern_rtld.pas index 26f5d9d5..76d384e0 100644 --- a/sys/kern/kern_rtld.pas +++ b/sys/kern/kern_rtld.pas @@ -1111,7 +1111,14 @@ begin vm_object_reference(imgp^.obj); - Result:=vm_map_insert(map,imgp^.obj,offset,vaddr_lo,vaddr_hi,VM_PROT_RW,prot or VM_PROT_RW,MAP_COW_NO_BUDGET,false); + Result:=vm_map_insert(map, + imgp^.obj, + offset, + vaddr_lo,vaddr_hi, + VM_PROT_RW,prot or VM_PROT_RW, + MAP_COW_NO_BUDGET, + nil, + false); if (Result<>0) then begin vm_map_unlock(map); diff --git a/sys/kern/kern_stub.pas b/sys/kern/kern_stub.pas index 74ff5171..d9b0b62b 100644 --- a/sys/kern/kern_stub.pas +++ b/sys/kern/kern_stub.pas @@ -132,7 +132,7 @@ begin if (err<>0) then Exit; vm_map_lock(map); - vm_map_set_name_locked(map,start,start+size,'#patch',VM_INHERIT_PATCH); + vm_map_set_info_locked(map,start,start+size,'#patch',VM_INHERIT_PATCH); vm_map_unlock(map); end else begin diff --git a/sys/kern/kern_sx.pas b/sys/kern/kern_sx.pas index 31ad4083..2d007922 100644 --- a/sys/kern/kern_sx.pas +++ b/sys/kern/kern_sx.pas @@ -37,7 +37,7 @@ end; function sx_xlocked(p:p_sx):Boolean; begin - Result:=(PDWORD(@p^.m)[0]=System.GetCurrentThreadId) and + Result:=(PDWORD(@p^.m)[0]=ThreadID) and (PDWORD(@p^.m)[1]=2); end; @@ -60,7 +60,7 @@ begin //Writeln(' sx_xlock:',HexStr(p),':',p^.n); rw_wlock(p^.c); - PDWORD(@p^.m)[0]:=System.GetCurrentThreadId; + PDWORD(@p^.m)[0]:=ThreadID; PDWORD(@p^.m)[1]:=2; end; @@ -75,7 +75,7 @@ procedure sx_xunlock(p:p_sx); begin //Writeln(' sx_xunlock:',HexStr(p),':',p^.n); - Assert(PDWORD(@p^.m)[0]=System.GetCurrentThreadId,'sx_unlock'); + Assert(PDWORD(@p^.m)[0]=ThreadID,'sx_unlock'); PDWORD(@p^.m)[0]:=0; PDWORD(@p^.m)[1]:=0; @@ -91,7 +91,7 @@ begin 1:rw_runlock(p^.c); 2: begin - Assert(PDWORD(@p^.m)[0]=System.GetCurrentThreadId,'sx_unlock'); + Assert(PDWORD(@p^.m)[0]=ThreadID,'sx_unlock'); PDWORD(@p^.m)[0]:=0; PDWORD(@p^.m)[1]:=0; diff --git a/sys/md/md_vnops.pas b/sys/md/md_vnops.pas index 3df5a722..bc204bdc 100644 --- a/sys/md/md_vnops.pas +++ b/sys/md/md_vnops.pas @@ -453,10 +453,10 @@ var F:Thandle; R:DWORD; begin - w:=_UTF8Decode(@de^.ufs_dirent^.d_name,de^.ufs_dirent^.d_namlen); - Assert(de^.ufs_dir^.ufs_md_fp<>nil); + w:=_UTF8Decode(@de^.ufs_dirent^.d_name,de^.ufs_dirent^.d_namlen); + OBJ:=Default(TOBJ_ATTR); INIT_OBJ(OBJ,THandle(de^.ufs_dir^.ufs_md_fp),0,PWideChar(w)); BLK:=Default(IO_STATUS_BLOCK); @@ -486,10 +486,12 @@ var opt:DWORD; R:DWORD; begin - w:=_UTF8Decode(@de^.ufs_dirent^.d_name,de^.ufs_dirent^.d_namlen); + sx_assert(@de^.ufs_md_lock); Assert(de^.ufs_dir^.ufs_md_fp<>nil); + w:=_UTF8Decode(@de^.ufs_dirent^.d_name,de^.ufs_dirent^.d_namlen); + OBJ:=Default(TOBJ_ATTR); INIT_OBJ(OBJ,THandle(de^.ufs_dir^.ufs_md_fp),0,PWideChar(w)); BLK:=Default(IO_STATUS_BLOCK); @@ -604,6 +606,8 @@ var mp:p_mount; begin + sx_assert(@de^.ufs_md_lock); + if (de^.ufs_dirent^.d_type<>DT_LNK) then Exit(EINVAL); if (de^.ufs_symlink<>nil) then Exit(0); //cached @@ -702,6 +706,8 @@ begin Result:=0; if (de=nil) then Exit; + sx_assert(@de^.ufs_md_lock); + if (FD<>0) then begin RL:=0; @@ -876,7 +882,10 @@ begin ufs_de_hold(dotdot); end; + sx_xlock(@nd^.ufs_md_lock); error:=md_update_dirent(0,nd,nil); + sx_xunlock(@nd^.ufs_md_lock); + if (error<>0) then begin ufs_de_drop(nd); @@ -952,7 +961,10 @@ begin end; end; + sx_xlock(@nd^.ufs_md_lock); Result:=md_update_dirent(0,nd,prev); + sx_unlock(@nd^.ufs_md_lock); + if (Result<>0) then begin ufs_de_drop(nd); @@ -1004,24 +1016,33 @@ begin Result:=md_new_cache(dd,name,namelen,@FBI,nd); end; -procedure md_unlink_cache(de:p_ufs_dirent); +procedure md_unlink_cache(de:p_ufs_dirent;curr_locked,parent_locked:Boolean); label - _start; + _start, + _exit; var dd:p_ufs_dirent; - notlocked:Boolean; + //notlocked:Boolean; fparent:Boolean; begin if (de=nil) then Exit; _start: + Assert(sx_xlocked(@de^.ufs_md_lock)=curr_locked); + + if not curr_locked then + begin + sx_xlock(@de^.ufs_md_lock); + end; + dd:=System.InterlockedExchange(de^.ufs_dir,nil); //parent if ((de^.ufs_flags and UFS_CREATE)<>0) then begin //unlink soft de^.ufs_dir:=nil; + sx_unlock(@de^.ufs_md_lock); ufs_de_drop(dd); Exit; end; @@ -1029,60 +1050,60 @@ begin if (dd<>nil) then begin ufs_de_hold(dd); - notlocked:=not sx_xlocked(@dd^.ufs_md_lock); - if notlocked then + + //notlocked:=not sx_xlocked(@dd^.ufs_md_lock); + + Assert(sx_xlocked(@dd^.ufs_md_lock)=parent_locked); + + if not parent_locked then begin - sx_xlock(@dd^.ufs_md_lock); + sx_unlock(@de^.ufs_md_lock); + sx_xlock (@dd^.ufs_md_lock); + sx_xlock (@de^.ufs_md_lock); end; + TAILQ_REMOVE(@dd^.ufs_dlist,de,@de^.ufs_list); fparent:=TAILQ_EMPTY(@dd^.ufs_dlist) and (dd^.ufs_dir<>nil); - if notlocked then + + if not parent_locked then begin sx_unlock(@dd^.ufs_md_lock); end; + ufs_de_drop(dd); //prev hold ufs_de_drop(dd); //list hold + if fparent then begin + curr_locked :=True; + parent_locked:=False; de:=dd; goto _start; end; end; + + _exit: + sx_unlock(@de^.ufs_md_lock); end; procedure md_delete_cache(de:p_ufs_dirent); begin if (de=nil) then Exit; + sx_xlock(@de^.ufs_md_lock); + Assert(de^.ufs_ref>0); Assert((de^.ufs_flags and UFS_DOOMED)=0,'ufs_delete doomed dirent'); de^.ufs_flags:=de^.ufs_flags or UFS_DOOMED; - md_unlink_cache(de); + md_unlink_cache(de,True,False); ufs_de_drop(de); end; function md_inactive(ap:p_vop_inactive_args):Integer; -var - vp:p_vnode; - mp:p_mount; - de:p_ufs_dirent; begin - vp:=ap^.a_vp; - - mp:=vp^.v_mount; - if ((mp^.mnt_flag and MNT_RDONLY)=0) then - begin - de:=ufs_relv(vp); - if (de<>nil) then - begin - md_delete_cache(de); - end; - vrecycle(vp); - end; - Exit(0); end; @@ -1096,7 +1117,9 @@ begin de:=ufs_relv(vp); if (de<>nil) then begin + VI_LOCK(vp); md_delete_cache(de); + VI_UNLOCK(vp); end; vnode_destroy_vobject(vp); @@ -1104,7 +1127,7 @@ begin Exit(0); end; -function md_lookupx(ap:p_vop_lookup_args):Integer; +function md_lookup(ap:p_vop_lookup_args):Integer; var cnp:p_componentname; dvp:p_vnode; @@ -1120,6 +1143,7 @@ begin pname:=cnp^.cn_nameptr; flags:=cnp^.cn_flags; nameiop:=cnp^.cn_nameiop; + dd:=dvp^.v_data; vpp^:=nil; @@ -1152,6 +1176,8 @@ begin Exit(0); end; + sx_xlock(@dd^.ufs_md_lock); + Result:=0; de:=md_find_cache(dd, cnp^.cn_nameptr, cnp^.cn_namelen, 0); @@ -1160,6 +1186,8 @@ begin Result:=md_lookup_dirent(dd,cnp^.cn_nameptr,cnp^.cn_namelen,de); end; + sx_xunlock(@dd^.ufs_md_lock); + if (de=nil) then begin Case nameiop of @@ -1197,23 +1225,12 @@ begin dmp:=VFSTOUFS(ap^.a_dvp^.v_mount); sx_xlock(@dmp^.ufs_lock); - error:=ufs_allocv(de, dvp^.v_mount, cnp^.cn_lkflags and LK_TYPE_MASK, vpp); + + error:=ufs_allocv(de, dvp^.v_mount, cnp^.cn_lkflags and LK_TYPE_MASK, vpp); //sx_xunlock Exit(error); end; -function md_lookup(ap:p_vop_lookup_args):Integer; -var - dd:p_ufs_dirent; -begin - dd:=ap^.a_dvp^.v_data; - sx_xlock(@dd^.ufs_md_lock); - - Result:=md_lookupx(ap); - - sx_xunlock(@dd^.ufs_md_lock); -end; - function md_readdir(ap:p_vop_readdir_args):Integer; var uio:p_uio; @@ -1313,6 +1330,7 @@ begin vp:=ap^.a_vp; de:=vp^.v_data; + VI_LOCK(vp); sx_xlock(@de^.ufs_md_lock); Result:=md_update_dirent(THandle(vp^.v_un),de,nil); @@ -1320,6 +1338,7 @@ begin vnode_pager_setsize(vp, de^.ufs_size); sx_xunlock(@de^.ufs_md_lock); + VI_UNLOCK(vp); if (Result<>0) then Exit; @@ -1341,11 +1360,15 @@ begin Result:=md_update_dirent(0,de,nil); end; + if (Result<>0) then + begin + sx_xunlock(@de^.ufs_md_lock); + Exit; + end; + + Result:=uiomove(de^.ufs_symlink, strlen(de^.ufs_symlink), ap^.a_uio); + sx_xunlock(@de^.ufs_md_lock); - - if (Result<>0) then Exit; - - Exit(uiomove(de^.ufs_symlink, strlen(de^.ufs_symlink), ap^.a_uio)); end; function md_symlink(ap:p_vop_symlink_args):Integer; @@ -1390,14 +1413,14 @@ begin dd:=ap^.a_dvp^.v_data; + sx_xlock(@dd^.ufs_md_lock); + w:=_UTF8Decode(ap^.a_cnp^.cn_nameptr, ap^.a_cnp^.cn_namelen); OBJ:=Default(TOBJ_ATTR); INIT_OBJ(OBJ,THandle(dd^.ufs_md_fp),0,PWideChar(w)); BLK:=Default(IO_STATUS_BLOCK); - sx_xlock(@dd^.ufs_md_lock); - R:=NtCreateFile(@FD, FILE_READ_ATTRIBUTES or FILE_WRITE_ATTRIBUTES or @@ -1487,7 +1510,7 @@ begin //clear cache de:=md_find_cache(dd,ap^.a_cnp^.cn_nameptr,ap^.a_cnp^.cn_namelen,0); - md_unlink_cache(de); + md_unlink_cache(de,False,True); //new dirent Result:=md_new_cache(dd,ap^.a_cnp^.cn_nameptr,ap^.a_cnp^.cn_namelen,@FBI,de); @@ -1499,6 +1522,7 @@ begin dmp:=VFSTOUFS(ap^.a_dvp^.v_mount); sx_xlock(@dmp^.ufs_lock); + Exit(ufs_allocv(de, ap^.a_dvp^.v_mount, LK_EXCLUSIVE, ap^.a_vpp)); //sx_xunlock end; @@ -1522,8 +1546,12 @@ begin de:=ap^.a_vp^.v_data; sx_xlock(@dd^.ufs_md_lock); + sx_xlock(@de^.ufs_md_lock); Result:=md_open_dirent_file(de,True,@FD); + + sx_xunlock(@de^.ufs_md_lock); + if (Result<>0) then begin sx_xunlock(@dd^.ufs_md_lock); @@ -1562,7 +1590,7 @@ begin begin //clear cache de:=md_find_cache(dd,cnp^.cn_nameptr,cnp^.cn_namelen,0); - md_unlink_cache(de); + md_unlink_cache(de,False,True); end; sx_xunlock(@dd^.ufs_md_lock); @@ -1637,13 +1665,12 @@ begin //clear cache de:=md_find_cache(dd,ap^.a_cnp^.cn_nameptr,ap^.a_cnp^.cn_namelen,0); - md_unlink_cache(de); + md_unlink_cache(de,False,True); de:=md_vmkdir(dmp,cnp^.cn_nameptr,cnp^.cn_namelen,dd); if (de=nil) then begin - sx_xunlock(@dd^.ufs_md_lock); Exit(ENOMEM); end; @@ -1652,6 +1679,7 @@ begin sx_xunlock(@dd^.ufs_md_lock); sx_xlock(@dmp^.ufs_lock); + Exit(ufs_allocv(de, ap^.a_dvp^.v_mount, LK_EXCLUSIVE, ap^.a_vpp)); //sx_xunlock end; @@ -1673,9 +1701,16 @@ begin de:=vp^.v_data; sx_xlock(@dd^.ufs_md_lock); + sx_xlock(@de^.ufs_md_lock); Result:=md_open_dirent_file(de,True,@FD); - if (Result<>0) then Exit; + + if (Result<>0) then + begin + sx_xunlock(@de^.ufs_md_lock); + sx_xunlock(@dd^.ufs_md_lock); + Exit; + end; BLK:=Default(IO_STATUS_BLOCK); del_on_close:=true; @@ -1691,7 +1726,7 @@ begin end; //clear cache - md_unlink_cache(de); + md_unlink_cache(de,True,True); NtClose(FD); //<-deleted @@ -1718,9 +1753,16 @@ begin if (de^.ufs_dirent^.d_type<>DT_DIR) then Exit(ENOTDIR); sx_xlock(@dd^.ufs_md_lock); + sx_xlock(@de^.ufs_md_lock); Result:=md_open_dirent_file(de,True,@FD); - if (Result<>0) then Exit; + + if (Result<>0) then + begin + sx_xunlock(@de^.ufs_md_lock); + sx_xunlock(@dd^.ufs_md_lock); + Exit; + end; BLK:=Default(IO_STATUS_BLOCK); del_on_close:=true; @@ -1736,7 +1778,7 @@ begin end; //clear cache - md_unlink_cache(de); + md_unlink_cache(de,True,True); NtClose(FD); //<-deleted @@ -1778,8 +1820,10 @@ begin sx_xlock(@dd_t^.ufs_md_lock); end; + sx_xlock(@de_f^.ufs_md_lock); + Result:=md_open_dirent_file(de_f,True,@FD); - if (Result<>0) then Exit; + if (Result<>0) then goto _exit; NT_RENAME:=Default(T_NT_RENAME); NT_RENAME.info.ReplaceIfExists:=True; @@ -1811,10 +1855,18 @@ begin if (Result<>0) then goto _exit; //clear cache - md_unlink_cache(de_f); - md_unlink_cache(de_t); + md_unlink_cache(de_f,True ,True); + md_unlink_cache(de_t,False,True); + + de_f:=nil; _exit: + + if (de_f<>nil) then + begin + sx_xunlock(@de_f^.ufs_md_lock); + end; + sx_xunlock(@dd_f^.ufs_md_lock); if (dd_f<>dd_t) then begin @@ -1918,6 +1970,7 @@ begin dmp:=VFSTOUFS(dvp^.v_mount); sx_xlock(@dmp^.ufs_lock); + Exit(ufs_allocv(nd, ap^.a_dvp^.v_mount, LK_EXCLUSIVE, ap^.a_vpp)); //sx_xunlock end; @@ -1932,6 +1985,8 @@ var de:p_ufs_dirent; dc:p_ufs_dirent; + ufs_size:Int64; + w:WideString; OBJ:TOBJ_ATTR; BLK:IO_STATUS_BLOCK; @@ -1961,6 +2016,7 @@ begin if (dd=nil) then Exit(EPERM); sx_xlock(@dd^.ufs_md_lock); + sx_xlock(@de^.ufs_md_lock); w:=_UTF8Decode(@de^.ufs_dirent^.d_name,de^.ufs_dirent^.d_namlen); @@ -1988,7 +2044,7 @@ begin Result:=ntf2px(R); if (Result<>0) then begin - md_unlink_cache(de); + md_unlink_cache(de,True,True); sx_xunlock(@dd^.ufs_md_lock); Exit; end; @@ -1996,7 +2052,7 @@ begin Result:=md_update_dirent(FD,de,nil); if (Result<>0) then begin - md_unlink_cache(de); + md_unlink_cache(de,True,True); sx_xunlock(@dd^.ufs_md_lock); NtClose(FD); Exit; @@ -2004,7 +2060,7 @@ begin vp^.v_un:=Pointer(FD); - vnode_create_vobject(vp, de^.ufs_size); + ufs_size:=de^.ufs_size; if ((de^.ufs_flags and UFS_CREATE)<>0) then begin @@ -2012,7 +2068,7 @@ begin begin //clear cache dc:=md_find_cache(dd,@de^.ufs_dirent^.d_name,de^.ufs_dirent^.d_namlen,0); - md_unlink_cache(dc); + md_unlink_cache(dc,False,True); end; // de^.ufs_flags:=de^.ufs_flags and (not UFS_CREATE); @@ -2021,7 +2077,10 @@ begin Inc(dd^.ufs_links); end; + sx_unlock (@de^.ufs_md_lock); sx_xunlock(@dd^.ufs_md_lock); + + vnode_create_vobject(vp, ufs_size); end; function md_close(ap:p_vop_close_args):Integer; @@ -2119,6 +2178,9 @@ begin de:=vp^.v_data; + VI_LOCK(vp); + sx_xlock(@de^.ufs_md_lock); + error:=0; change_time:=False; change_size:=False; @@ -2275,6 +2337,10 @@ begin end; _err: + + sx_unlock(@de^.ufs_md_lock); + VI_UNLOCK(vp); + if (RL<>0) then begin NtClose(RL); diff --git a/sys/vfs/kern_descrip.pas b/sys/vfs/kern_descrip.pas index b8dbd052..1d7aea4a 100644 --- a/sys/vfs/kern_descrip.pas +++ b/sys/vfs/kern_descrip.pas @@ -679,7 +679,7 @@ begin begin vp:=fp^.f_vnode; vfslocked:=VFS_LOCK_GIANT(vp^.v_mount); - error:=vn_lock(vp, LK_SHARED); + error:=vn_lock(vp, LK_SHARED,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (error<>0) then goto readahead_vnlock_fail; bsize:=p_mount(fp^.f_vnode^.v_mount)^.mnt_stat.f_iosize; @@ -1011,7 +1011,7 @@ begin if (vp<>nil) then begin vfslocked:=VFS_LOCK_GIANT(vp^.v_mount); - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=VOP_PATHCONF(vp, name, td^.td_retval); VOP_UNLOCK(vp, 0); VFS_UNLOCK_GIANT(vfslocked); diff --git a/sys/vfs/vfs_cache.pas b/sys/vfs/vfs_cache.pas index 5c82a19c..37ba5261 100644 --- a/sys/vfs/vfs_cache.pas +++ b/sys/vfs/vfs_cache.pas @@ -188,7 +188,7 @@ begin //no cache vfslocked:=VFS_LOCK_GIANT((vp^)^.v_mount); - vn_lock(vp^, LK_SHARED or LK_RETRY); + vn_lock(vp^, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=VOP_VPTOCNP(vp^, @dvp, buf, PInteger(buflen)); vput(vp^); VFS_UNLOCK_GIANT(vfslocked); diff --git a/sys/vfs/vfs_default.pas b/sys/vfs/vfs_default.pas index d24176f2..43a79a11 100644 --- a/sys/vfs/vfs_default.pas +++ b/sys/vfs/vfs_default.pas @@ -48,6 +48,7 @@ function vop_stdadvlock(ap:p_vop_advlock_args):Integer; function vop_stdadvlockasync(ap:p_vop_advlockasync_args):Integer; function vop_stdadvlockpurge(ap:p_vop_advlockpurge_args):Integer; function vop_stdpathconf(ap:p_vop_pathconf_args):Integer; +function lockmgr(lk:p_mtx;flags:Integer;ilk:p_mtx):Integer; function vop_stdlock(ap:p_vop_lock1_args):Integer; function vop_stdunlock(ap:p_vop_unlock_args):Integer; function vop_stdislocked(ap:p_vop_islocked_args):Integer; @@ -403,7 +404,7 @@ begin * the NFSv4 server always uses SEEK_SET and this code is * only required for the SEEK_END case. } - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=VOP_GETATTR(vp, @vattr); VOP_UNLOCK(vp, 0); if (error<>0) then @@ -425,13 +426,17 @@ begin if (ap^.a_fl^.l_whence=SEEK_END) then begin { The size argument is only needed for SEEK_END. } - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=VOP_GETATTR(vp, @vattr); VOP_UNLOCK(vp, 0); if (error<>0) then + begin Exit(error); + end; end else + begin vattr.va_size:=0; + end; Exit(EOPNOTSUPP); //Exit(lf_advlockasync(ap, @(vp^.v_lockf), vattr.va_size)); @@ -509,36 +514,39 @@ function lockmgr(lk:p_mtx;flags:Integer;ilk:p_mtx):Integer; var op:Integer; begin - - op:=(flags and LK_TYPE_MASK); - case op of - LK_SHARED, - LK_EXCLUSIVE: - begin - mtx_lock(lk^); - end; - LK_RELEASE: - begin - mtx_unlock(lk^); - end; - LK_UPGRADE: - begin - if not mtx_owned(lk^) then - begin - mtx_lock(lk^); - end; - end; - LK_DOWNGRADE:;// - else - Assert(false); - end; + Result:=0; if ((flags and LK_INTERLOCK)<>0) then begin mtx_unlock(ilk^); end; - Result:=0; + op:=(flags and LK_TYPE_MASK); + case op of + LK_SHARED, //read lock + LK_EXCLUSIVE: //write lock + begin + if ((flags and LK_NOWAIT)<>0) then //trylock + begin + if not mtx_trylock(lk^) then + begin + Result:=1; + end; + end else + begin + mtx_lock(lk^); + end; + end; + LK_RELEASE: //unlock + begin + mtx_unlock(lk^); + end; + LK_UPGRADE :;//read ->write + LK_DOWNGRADE:;//write->read + else + Assert(false,'TODO'); + end; + end; { @@ -813,7 +821,7 @@ begin error:=vn_open_cred(@nd, @flags, 0, VN_OPEN_NOAUDIT, nil); if (error<>0) then begin - vn_lock(vp, locked or LK_RETRY); + vn_lock(vp, locked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(error); end; NDFREE(@nd, NDF_ONLY_PNBUF); @@ -830,7 +838,7 @@ begin VOP_UNLOCK(mvp, 0); vn_close(mvp, FREAD); VREF(dvp^); - vn_lock(dvp^, LK_EXCLUSIVE or LK_RETRY); + vn_lock(dvp^, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); covered:=1; end; @@ -862,16 +870,16 @@ begin if (covered<>0) then begin VOP_UNLOCK(dvp^, 0); - vn_lock(mvp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(mvp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (dirent_exists(mvp, dp^.d_name)=0) then begin error:=ENOENT; VOP_UNLOCK(mvp, 0); - vn_lock(dvp^, LK_EXCLUSIVE or LK_RETRY); + vn_lock(dvp^, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); goto _out; end; VOP_UNLOCK(mvp, 0); - vn_lock(dvp^, LK_EXCLUSIVE or LK_RETRY); + vn_lock(dvp^, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; Dec(i,dp^.d_namlen); @@ -909,7 +917,7 @@ _out: VOP_UNLOCK(mvp, 0); vn_close(mvp, FREAD); end; - vn_lock(vp, locked or LK_RETRY); + vn_lock(vp, locked or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); Exit(error); end; @@ -1077,7 +1085,9 @@ begin lockreq:=LK_EXCLUSIVE or LK_INTERLOCK; if (waitfor<>MNT_WAIT) then + begin lockreq:=lockreq or LK_NOWAIT; + end; { * Force stale buffer cache information to be flushed. } diff --git a/sys/vfs/vfs_lookup.pas b/sys/vfs/vfs_lookup.pas index 8752d1d7..a6580859 100644 --- a/sys/vfs/vfs_lookup.pas +++ b/sys/vfs/vfs_lookup.pas @@ -510,7 +510,7 @@ begin dp:=ndp^.ni_startdir; ndp^.ni_startdir:=nil; - vn_lock(dp,compute_cn_lkflags(dp^.v_mount,cnp^.cn_lkflags or LK_RETRY,cnp^.cn_flags)); + vn_lock(dp,compute_cn_lkflags(dp^.v_mount,cnp^.cn_lkflags or LK_RETRY,cnp^.cn_flags),{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); dirloop: { @@ -681,7 +681,7 @@ dirloop: VREF(dp); vput(tdp); VFS_UNLOCK_GIANT(tvfslocked); - vn_lock(dp,compute_cn_lkflags(dp^.v_mount,cnp^.cn_lkflags or LK_RETRY,ISDOTDOT)); + vn_lock(dp,compute_cn_lkflags(dp^.v_mount,cnp^.cn_lkflags or LK_RETRY,ISDOTDOT),{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; end; @@ -708,7 +708,7 @@ unionlookup: (VOP_ISLOCKED(dp)=LK_SHARED) and ((cnp^.cn_flags and ISLASTCN)<>0) and ((cnp^.cn_flags and LOCKPARENT)<>0) then begin - vn_lock(dp, LK_UPGRADE or LK_RETRY); + vn_lock(dp, LK_UPGRADE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; if ((dp^.v_iflag and VI_DOOMED)<>0) then @@ -746,7 +746,7 @@ unionlookup: VREF(dp); vput(tdp); VFS_UNLOCK_GIANT(tvfslocked); - vn_lock(dp,compute_cn_lkflags(dp^.v_mount, cnp^.cn_lkflags or LK_RETRY, cnp^.cn_flags)); + vn_lock(dp,compute_cn_lkflags(dp^.v_mount, cnp^.cn_lkflags or LK_RETRY, cnp^.cn_flags),{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); goto unionlookup; end; @@ -777,7 +777,7 @@ unionlookup: VOP_UNLOCK(dp, 0); end; { - * We Exitwith ni_vp nil to indicate that the entry + * We Exit with ni_vp nil to indicate that the entry * doesn't currently exist, leaving a pointer to the * (possibly locked) directory vnode in ndp^.ni_dvp. } @@ -843,7 +843,7 @@ unionlookup: vfs_unbusy(mp); - if (vn_lock(vp_crossmp, LK_SHARED or LK_NOWAIT)<>0) then + if (vn_lock(vp_crossmp, LK_SHARED or LK_NOWAIT,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%})<>0) then begin Assert(False,'vp_crossmp exclusively locked or reclaimed'); end; @@ -972,7 +972,7 @@ success: if (needs_exclusive_leaf(dp^.v_mount, cnp^.cn_flags)<>0) and (VOP_ISLOCKED(dp)<>LK_EXCLUSIVE) then begin - vn_lock(dp, LK_UPGRADE or LK_RETRY); + vn_lock(dp, LK_UPGRADE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if ((dp^.v_iflag and VI_DOOMED)<>0) then begin error:=ENOENT; diff --git a/sys/vfs/vfs_mount.pas b/sys/vfs/vfs_mount.pas index 28d30f2c..9435d349 100644 --- a/sys/vfs/vfs_mount.pas +++ b/sys/vfs/vfs_mount.pas @@ -987,7 +987,7 @@ begin MNT_IUNLOCK(mp); - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); //cache_purge(vp); VI_LOCK(vp); vp^.v_iflag:=vp^.v_iflag and (not VI_MOUNT); @@ -1501,7 +1501,7 @@ begin mnt_gen_r:=mp^.mnt_gen; VI_LOCK(coveredvp); vholdl(coveredvp); - vn_lock(coveredvp, LK_EXCLUSIVE or LK_INTERLOCK or LK_RETRY); + vn_lock(coveredvp, LK_EXCLUSIVE or LK_INTERLOCK or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); vdrop(coveredvp); { * Check for mp being unmounted while waiting for the diff --git a/sys/vfs/vfs_subr.pas b/sys/vfs/vfs_subr.pas index 45febcf5..e374b4a4 100644 --- a/sys/vfs/vfs_subr.pas +++ b/sys/vfs/vfs_subr.pas @@ -433,6 +433,7 @@ begin vn_start_write(nil, @mp, V_WAIT); MNT_ILOCK(mp); count:=mp^.mnt_nvnodelistsize div 10 + 1; + while (count<>0) do begin vp:=TAILQ_FIRST(@mp^.mnt_nvnodelist); @@ -442,15 +443,16 @@ begin vp:=TAILQ_NEXT(vp,@vp^.v_nmntvnodes); end; - if (vp=nil) then - break; + if (vp=nil) then break; TAILQ_REMOVE (@mp^.mnt_nvnodelist,vp,@vp^.v_nmntvnodes); TAILQ_INSERT_TAIL(@mp^.mnt_nvnodelist,vp,@vp^.v_nmntvnodes); Dec(count); if (not VI_TRYLOCK(vp)) then + begin goto next_iter; + end; { * If it's been deconstructed already, it's still @@ -881,7 +883,7 @@ begin unlocked } if (VOP_ISLOCKED(vp)=0) then begin - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; vgone(vp); vput(vp); @@ -1958,7 +1960,7 @@ begin vholdl(vp); - error:=vn_lock(vp,flags or LK_INTERLOCK); + error:=vn_lock(vp,flags or LK_INTERLOCK,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (error<>0) then begin vdrop(vp); @@ -2074,7 +2076,7 @@ begin case (func) of VPUTX_VRELE: begin - error:=vn_lock(vp, LK_EXCLUSIVE or LK_INTERLOCK); + error:=vn_lock(vp, LK_EXCLUSIVE or LK_INTERLOCK,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); VI_LOCK(vp); end; VPUTX_VPUT: @@ -2381,7 +2383,7 @@ loop: while (vp<>nil) do begin vholdl(vp); - error:=vn_lock(vp, LK_INTERLOCK or LK_EXCLUSIVE); + error:=vn_lock(vp, LK_INTERLOCK or LK_EXCLUSIVE,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (error<>0) then begin vdrop(vp); @@ -3440,7 +3442,7 @@ const procedure vfs_knllock(arg:Pointer); begin - vn_lock(p_vnode(arg), LK_EXCLUSIVE or LK_RETRY); + vn_lock(p_vnode(arg), LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; procedure vfs_knlunlock(arg:Pointer); diff --git a/sys/vfs/vfs_syscalls.pas b/sys/vfs/vfs_syscalls.pas index 658efdec..0e99cbf8 100644 --- a/sys/vfs/vfs_syscalls.pas +++ b/sys/vfs/vfs_syscalls.pas @@ -286,7 +286,7 @@ begin vp:=fp^.f_vnode; vfslocked:=VFS_LOCK_GIANT(vp^.v_mount); - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); mp:=vp^.v_mount; if (mp<>nil) then begin @@ -536,7 +536,7 @@ begin VREF(vp); fdrop(fp); vfslocked:=VFS_LOCK_GIANT(vp^.v_mount); - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=change_dir(vp); mp:=vp^.v_mountedhere; @@ -1374,7 +1374,7 @@ begin error:=EEXIST; end else begin - error:=vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + error:=vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (error=0) then begin error:=can_hardlink(vp); @@ -1715,7 +1715,7 @@ begin end; L_XTND: //end begin - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=VOP_GETATTR(vp, @vattr); VOP_UNLOCK(vp, 0); if (error<>0) then @@ -2137,7 +2137,7 @@ begin error:=vn_start_write(vp, @mp, V_WAIT or PCATCH); if (error<>0) then Exit(error); - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); VATTR_NULL(@vattr); vattr.va_flags:=flags; @@ -2238,7 +2238,7 @@ begin begin Exit(error); end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); VATTR_NULL(@vattr); vattr.va_mode:=mode and ALLPERMS; @@ -2357,7 +2357,7 @@ begin begin Exit(error); end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); VATTR_NULL(@vattr); vattr.va_uid:=uid; vattr.va_gid:=gid; @@ -2518,7 +2518,7 @@ begin error:=vn_start_write(vp, @mp, V_WAIT or PCATCH); if (error<>0) then Exit(error); - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); setbirthtime:=0; if (numtimes < 3) and @@ -2703,7 +2703,7 @@ begin Exit(error); end; NDFREE(@nd, NDF_ONLY_PNBUF); - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (vp^.v_type=VDIR) then error:=EISDIR @@ -2770,7 +2770,7 @@ begin begin lock_flags:=LK_EXCLUSIVE; end; - vn_lock(vp, lock_flags or LK_RETRY); + vn_lock(vp, lock_flags or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (vp^.v_object<>nil) then begin @@ -3218,7 +3218,7 @@ unionread: auio.uio_rw :=UIO_READ; auio.uio_segflg:=UIO_USERSPACE; auio.uio_td :=td; - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); loff:=foffset; auio.uio_offset:=foffset; diff --git a/sys/vfs/vfs_vnops.pas b/sys/vfs/vfs_vnops.pas index b625415c..f63fd7e2 100644 --- a/sys/vfs/vfs_vnops.pas +++ b/sys/vfs/vfs_vnops.pas @@ -18,7 +18,7 @@ uses vfilio, vnode; -function vn_lock(vp:p_vnode;flags:Integer):Integer; +function vn_lock(vp:p_vnode;flags:Integer;_file:PChar;line:Integer):Integer; function vn_open(ndp:p_nameidata; flagp:PInteger; @@ -77,6 +77,7 @@ procedure vref(vp:p_vnode); external; implementation uses + sysutils, errno, vnode_if, vfcntl, @@ -88,15 +89,18 @@ uses kern_mtxpool, kern_descrip; -function vn_lock(vp:p_vnode;flags:Integer):Integer; +function vn_lock(vp:p_vnode;flags:Integer;_file:PChar;line:Integer):Integer; begin Assert((flags and LK_TYPE_MASK)<>0,'vn_lock called with no locktype.'); repeat - Result:=VOP_LOCK(vp,flags,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); - flags:=flags and (not LK_INTERLOCK); + Result:=VOP_LOCK(vp,flags,_file,line); + flags:=flags and (not LK_INTERLOCK); //Interlock is always dropped. - Assert(((flags and LK_RETRY)=0) or (Result=0),'LK_RETRY set with incompatible flags (0x%x) or an Result occured (%d)'); + if ((flags and LK_RETRY)<>0) and (Result<>0) then + begin + Assert(false,'LK_RETRY set with incompatible flags (0x'+HexStr(flags,4)+') or an error occured ('+IntToStr(Result)+')'); + end; if (Result=0) and ((vp^.v_iflag and VI_DOOMED)<>0) and @@ -106,7 +110,7 @@ begin Result:=ENOENT; break; end; - until ((flags and LK_RETRY)=0) or (Result=0); + until ((flags and LK_RETRY)<>0) or (Result=0); end; function vn_open(ndp:p_nameidata; @@ -338,7 +342,7 @@ restart: if (vp^.v_type=VFIFO) and (VOP_ISLOCKED(vp)<>LK_EXCLUSIVE) then begin - vn_lock(vp, LK_UPGRADE or LK_RETRY); + vn_lock(vp, LK_UPGRADE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); end; error:=VOP_OPEN(vp, ofmode, fp); @@ -507,7 +511,7 @@ begin VFS_ASSERT_GIANT(vp^.v_mount); vn_start_write(vp, @mp, V_WAIT); - vn_lock(vp, lock_flags or LK_RETRY); + vn_lock(vp, lock_flags or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if ((flags and FWRITE)<>0) then begin Assert(vp^.v_writecount > 0,'vn_close: negative writecount'); @@ -804,7 +808,7 @@ begin advice:=get_advice(fp, uio); vfslocked:=VFS_LOCK_GIANT(vp^.v_mount); - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); case advice of POSIX_FADV_NORMAL, @@ -925,7 +929,7 @@ begin lock_flags:=LK_EXCLUSIVE; end; - vn_lock(vp, lock_flags or LK_RETRY); + vn_lock(vp, lock_flags or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); case advice of POSIX_FADV_NORMAL, POSIX_FADV_SEQUENTIAL, @@ -1157,6 +1161,12 @@ _out: } out_last: + + if (error<>0) then + begin + Assert(false,'vn_io_fault'); + end; + if (rl_cookie<>nil) then begin vn_rangelock_unlock(vp, rl_cookie); @@ -1194,7 +1204,7 @@ begin goto out1; end; - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (vp^.v_type=VDIR) then begin error:=EISDIR; @@ -1241,7 +1251,7 @@ begin begin if (com=FIONREAD) then begin - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=VOP_GETATTR(vp, @vattr); VOP_UNLOCK(vp, 0); if (error=0) then @@ -1293,7 +1303,7 @@ var begin vp:=fp^.f_vnode; vfslocked:=VFS_LOCK_GIANT(vp^.v_mount); - vn_lock(vp, LK_SHARED or LK_RETRY); + vn_lock(vp, LK_SHARED or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); error:=vn_stat(vp, sb); VOP_UNLOCK(vp, 0); VFS_UNLOCK_GIANT(vfslocked); diff --git a/sys/vm/vm_object.pas b/sys/vm/vm_object.pas index 7ef886f7..94aca83b 100644 --- a/sys/vm/vm_object.pas +++ b/sys/vm/vm_object.pas @@ -160,7 +160,7 @@ begin vhold(vp); VM_OBJECT_UNLOCK(obj); - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); vdrop(vp); VM_OBJECT_LOCK(obj); @@ -564,7 +564,7 @@ begin VM_OBJECT_UNLOCK(obj); vn_start_write(vp, @mp, V_WAIT); vfslocked:=VFS_LOCK_GIANT(vp^.v_mount); - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); if (syncio) and (not invalidate) and diff --git a/sys/vm/vnode_pager.pas b/sys/vm/vnode_pager.pas index b42ad446..49d1fd64 100644 --- a/sys/vm/vnode_pager.pas +++ b/sys/vm/vnode_pager.pas @@ -161,7 +161,7 @@ begin VOP_UNLOCK(vp, 0); vm_object_set_flag(obj, OBJ_DISCONNECTWNT); msleep(obj, VM_OBJECT_MTX(obj), PDROP or PVM, 'vodead', 0); - vn_lock(vp, LK_EXCLUSIVE or LK_RETRY); + vn_lock(vp, LK_EXCLUSIVE or LK_RETRY,{$INCLUDE %FILE%},{$INCLUDE %LINENUM%}); // obj:=vp^.v_object; end;