mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
57f3497fe6
commit
d63886c189
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -313,7 +313,7 @@ var
|
|||
begin
|
||||
node:=AllocMem(SizeOf(TNodeIpcSync));
|
||||
node^.event:=RTLEventCreate;
|
||||
node^.tid :=GetThreadID;
|
||||
node^.tid :=ThreadID;
|
||||
|
||||
RTLEventResetEvent(node^.event);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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.
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue