367
398
NTSTATUS ntError = STATUS_SUCCESS;
368
BOOLEAN bLocked = FALSE;
399
BOOLEAN bTableLocked = FALSE;
369
400
BOOLEAN bFcbLocked = FALSE;
401
BOOLEAN bFcbControlLocked = FALSE;
370
402
PVFS_STAT Stat = {0};
403
PPVFS_FCB pFcb = NULL;
404
BOOLEAN bDeleteLocked = FALSE;
372
406
/* Do housekeeping such as setting the last write time or
373
407
honoring DeletOnClose when the CCB handle count reaches
374
0. Not necessaril.y when the RefCount reaches 0. We
408
0. Not necessarily when the RefCount reaches 0. We
375
409
may have a non-handle open in the FCB table for a
376
410
path component (see PvfsFindParentFCB()). */
412
if (ppFcb == NULL || *ppFcb == NULL)
378
419
LWIO_LOCK_RWMUTEX_SHARED(bFcbLocked, &pFcb->rwCcbLock);
380
if (PvfsListLength(pFcb->pCcbList) == 0)
421
if (!PVFS_IS_DEVICE_HANDLE(pFcb) && (PvfsListLength(pFcb->pCcbList) == 0))
382
423
ntError = PvfsSysStat(pFcb->pszFilename, &Stat);
383
424
if (ntError == STATUS_SUCCESS)
425
485
Otherwise another open request could search and locate the
426
486
FCB in the tree and return free()'d memory. */
428
LWIO_LOCK_RWMUTEX_EXCLUSIVE(bLocked, &gFcbTable.rwLock);
488
LWIO_LOCK_RWMUTEX_EXCLUSIVE(bTableLocked, &gFcbTable.rwLock);
430
490
if (InterlockedDecrement(&pFcb->RefCount) == 0)
434
LWIO_UNLOCK_RWMUTEX(bLocked, &gFcbTable.rwLock);
493
/* Clear the path cache */
495
PvfsPathCacheRemove(pFcb->pszFilename);
497
LWIO_LOCK_MUTEX(bFcbControlLocked, &pFcb->ControlBlock);
501
pFcb->bRemoved = TRUE;
503
LWIO_UNLOCK_MUTEX(bFcbControlLocked, &pFcb->ControlBlock);
505
LWIO_UNLOCK_RWMUTEX(bTableLocked, &gFcbTable.rwLock);
436
507
PvfsFreeFCB(pFcb);
439
LWIO_UNLOCK_RWMUTEX(bLocked, &gFcbTable.rwLock);
510
LWIO_UNLOCK_RWMUTEX(bTableLocked, &gFcbTable.rwLock);
512
*ppFcb = (PPVFS_FCB)NULL;
1264
/*****************************************************************************
1265
****************************************************************************/
1271
PCSTR pszNewFilename
1274
NTSTATUS ntError = STATUS_SUCCESS;
1275
BOOLEAN bTableLocked = FALSE;
1276
BOOLEAN bFcbLocked = FALSE;
1277
BOOLEAN bCcbLocked = FALSE;
1278
BOOLEAN bParentLinkLocked = FALSE;
1279
PPVFS_FCB pNewParentFcb = NULL;
1280
PPVFS_FCB pOldParentFcb = NULL;
1281
PPVFS_FCB pExistingTargetFcb = NULL;
1282
BOOLEAN bExistingFcbLocked = FALSE;
1284
LWIO_LOCK_RWMUTEX_EXCLUSIVE(bTableLocked, &gFcbTable.rwLock);
1286
ntError = PvfsValidatePath(pCcb->pFcb, &pCcb->FileId);
1287
BAIL_ON_NT_STATUS(ntError);
1289
/* If the target has an existing FCB, remove it from the Table
1290
and let the existing ref counters play out (e.g. pending
1293
ntError = _PvfsFindFCB(&pExistingTargetFcb, pszNewFilename);
1294
if (ntError == STATUS_SUCCESS)
1296
/* Make sure we have a different FCB */
1298
if (pExistingTargetFcb != pFcb)
1300
LWIO_LOCK_MUTEX(bExistingFcbLocked, &pExistingTargetFcb->ControlBlock);
1301
if (!pExistingTargetFcb->bRemoved)
1303
PvfsRemoveFCB(pExistingTargetFcb);
1304
pExistingTargetFcb->bRemoved = TRUE;
1306
LWIO_UNLOCK_MUTEX(bExistingFcbLocked, &pExistingTargetFcb->ControlBlock);
1310
LWIO_LOCK_RWMUTEX_EXCLUSIVE(bFcbLocked, &pFcb->rwFileName);
1312
ntError = PvfsSysRename(pCcb->pFcb->pszFilename, pszNewFilename);
1313
BAIL_ON_NT_STATUS(ntError);
1315
/* Clear the cache entry but ignore any errors */
1317
ntError = PvfsPathCacheRemove(pFcb->pszFilename);
1319
/* Remove the FCB from the table, update the lookup key,
1320
and then re-add. Otherwise you will get memory corruption
1321
as a freed pointer gets left in the Table because if
1322
cannot be located using the current (updated) filename.
1323
Another reason to use the dev/inode pair instead if
1324
we could solve the "Create New File" issue. */
1326
ntError = PvfsRemoveFCB(pFcb);
1327
BAIL_ON_NT_STATUS(ntError);
1329
PVFS_FREE(&pFcb->pszFilename);
1330
ntError = LwRtlCStringDuplicate(&pFcb->pszFilename, pszNewFilename);
1331
BAIL_ON_NT_STATUS(ntError);
1333
ntError = PvfsFindParentFCB(&pNewParentFcb, pFcb->pszFilename);
1334
BAIL_ON_NT_STATUS(ntError);
1336
/* Have to update the parent links as well */
1338
LWIO_LOCK_RWMUTEX_EXCLUSIVE(bParentLinkLocked, &pFcb->rwParent);
1339
if (pNewParentFcb != pFcb->pParentFcb)
1341
pOldParentFcb = pFcb->pParentFcb;
1342
pFcb->pParentFcb = pNewParentFcb;
1343
pNewParentFcb = NULL;
1345
LWIO_UNLOCK_RWMUTEX(bParentLinkLocked, &pFcb->rwParent);
1347
ntError = PvfsAddFCB(pFcb);
1348
BAIL_ON_NT_STATUS(ntError);
1350
LWIO_UNLOCK_RWMUTEX(bFcbLocked, &pFcb->rwFileName);
1352
LWIO_UNLOCK_RWMUTEX(bTableLocked, &gFcbTable.rwLock);
1354
LWIO_LOCK_MUTEX(bCcbLocked, &pCcb->ControlBlock);
1356
PVFS_FREE(&pCcb->pszFilename);
1357
ntError = LwRtlCStringDuplicate(&pCcb->pszFilename, pszNewFilename);
1358
BAIL_ON_NT_STATUS(ntError);
1360
LWIO_UNLOCK_MUTEX(bCcbLocked, &pCcb->ControlBlock);
1365
PvfsReleaseFCB(&pNewParentFcb);
1370
PvfsReleaseFCB(&pOldParentFcb);
1373
if (pExistingTargetFcb)
1375
PvfsReleaseFCB(&pExistingTargetFcb);
1381
LWIO_UNLOCK_RWMUTEX(bParentLinkLocked, &pFcb->rwParent);
1382
LWIO_UNLOCK_MUTEX(bCcbLocked, &pCcb->ControlBlock);
1383
LWIO_UNLOCK_RWMUTEX(bFcbLocked, &pFcb->rwFileName);
1384
LWIO_UNLOCK_RWMUTEX(bTableLocked, &gFcbTable.rwLock);
1390
/*****************************************************************************
1391
****************************************************************************/
1394
PvfsFcbIsPendingDelete(
1398
BOOLEAN bPendingDelete = FALSE;
1399
BOOLEAN bIsLocked = FALSE;
1401
LWIO_LOCK_MUTEX(bIsLocked, &pFcb->ControlBlock);
1402
bPendingDelete = pFcb->bDeleteOnClose;
1403
LWIO_UNLOCK_MUTEX(bIsLocked, &pFcb->ControlBlock);
1405
return bPendingDelete;
1408
/*****************************************************************************
1409
****************************************************************************/
1412
PvfsFcbSetPendingDelete(
1414
BOOLEAN bPendingDelete
1417
BOOLEAN bIsLocked = FALSE;
1419
LWIO_LOCK_MUTEX(bIsLocked, &pFcb->ControlBlock);
1420
pFcb->bDeleteOnClose = bPendingDelete;
1421
LWIO_UNLOCK_MUTEX(bIsLocked, &pFcb->ControlBlock);
1424
/*****************************************************************************
1425
****************************************************************************/
1432
PPVFS_FCB pParent = NULL;
1433
BOOLEAN bLocked = FALSE;
1437
LWIO_LOCK_RWMUTEX_SHARED(bLocked, &pFcb->rwParent);
1438
if (pFcb->pParentFcb)
1440
pParent = PvfsReferenceFCB(pFcb->pParentFcb);
1442
LWIO_UNLOCK_RWMUTEX(bLocked, &pFcb->rwParent);
1163
1449
local variables: