From a5378b71ee9b4e2a0c25df95dced1026dbbf7a39 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 1 Feb 2013 13:39:22 -0500 Subject: [PATCH] Windows: Test for PRSFS_INSERT in redirector interface If a test for PRSFS_WRITE fails and the cm_scache.creator is the current user, then also test for PRSFS_INSERT privilege. Change-Id: Ib3e34f7ce50216cd9ff82afe9a7184f79d46ce15 Reviewed-on: http://gerrit.openafs.org/8978 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsrdr/user/RDRFunction.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index dce0be5..ff5f2f9 100644 --- a/src/WINNT/afsrdr/user/RDRFunction.c +++ b/src/WINNT/afsrdr/user/RDRFunction.c @@ -1866,12 +1866,26 @@ RDR_CleanupFileEntry( IN cm_user_t *userp, /* Serialize with any outstanding AsyncStore operation */ code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_ASYNCSTORE); if (code == 0) { - if (bScpLocked) { - lock_ReleaseWrite(&scp->rw); - bScpLocked = FALSE; + cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_ASYNCSTORE); + + code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_WRITE, + CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); + /* + * If we only have 'i' bits, then we should still be able to + * set flush the file. + */ + if (code == CM_ERROR_NOACCESS && scp->creator == userp) { + code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_INSERT, + CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); } + if (code == 0) { + if (bScpLocked) { + lock_ReleaseWrite(&scp->rw); + bScpLocked = FALSE; + } - code = cm_FSync(scp, userp, &req, bScpLocked); + code = cm_FSync(scp, userp, &req, bScpLocked); + } } if (bLastHandle && code) goto unlock; @@ -4235,6 +4249,10 @@ RDR_ReleaseFileExtents( IN cm_user_t *userp, lock_ObtainWrite(&scp->rw); code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_WRITE, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); + if (code == CM_ERROR_NOACCESS && scp->creator == userp) { + code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_INSERT, + CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); + } lock_ReleaseWrite(&scp->rw); if (code == 0) code = cm_FSync(scp, userp, &req, FALSE); @@ -4247,6 +4265,10 @@ RDR_ReleaseFileExtents( IN cm_user_t *userp, lock_ObtainWrite(&scp->rw); code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_WRITE, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); + if (code == CM_ERROR_NOACCESS && scp->creator == userp) { + code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_INSERT, + CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); + } lock_ReleaseWrite(&scp->rw); if (code == 0) { /* -- 1.9.4