This commit is contained in:
Pavel 2024-12-09 20:17:40 +03:00
parent 57f3497fe6
commit d63886c189
25 changed files with 313 additions and 196 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;

View File

@ -313,7 +313,7 @@ var
begin
node:=AllocMem(SizeOf(TNodeIpcSync));
node^.event:=RTLEventCreate;
node^.tid :=GetThreadID;
node^.tid :=ThreadID;
RTLEventResetEvent(node^.event);

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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.
}

View File

@ -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;

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;