windows-fs-flushall-20050907
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 7 Sep 2005 20:19:10 +0000 (20:19 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 7 Sep 2005 20:19:10 +0000 (20:19 +0000)
"fs flushall" is like "fs flushvolume" but flushes all data in the cache

====================
This delta was composed from multiple commits as part of the CVS->Git migration.
The checkin message with each commit was inconsistent.
The following are the additional commit messages.
====================

typo

doc/txt/winnotes/afs-changes-since-1.2.txt
src/WINNT/afsd/cm_ioctl.c
src/WINNT/afsd/cm_ioctl.h
src/WINNT/afsd/fs.c
src/WINNT/afsd/smb_iocons.h
src/WINNT/afsd/smb_ioctl.c

index 9ea852a..de9b84b 100644 (file)
@@ -1,3 +1,6 @@
+ * add "fs flushall" command that forces all data buffers
+   to be flushed.
+
 Since 1.4.0 rc2: 1.4.0 rc3 released (4 Sep 2005)
 
  * add support for '/' instead of '\' in pioctl() calls
index 1789304..4d226cc 100644 (file)
@@ -80,6 +80,7 @@ long cm_FlushFile(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
     lock_ReleaseMutex(&scp->mx);
 
     lock_ReleaseWrite(&scp->bufCreateLock);
+    afsi_log("cm_FlushFile scp 0x%x returns error: [%x]",scp, code);
     return code;
 }
 
@@ -556,6 +557,33 @@ long cm_IoctlSetACL(struct smb_ioctl *ioctlp, struct cm_user *userp)
     return code;
 }
 
+long cm_IoctlFlushAllVolumes(struct smb_ioctl *ioctlp, struct cm_user *userp)
+{
+    long code;
+    cm_scache_t *scp;
+    unsigned long volume;
+    int i;
+    cm_req_t req;
+
+    cm_InitReq(&req);
+
+    lock_ObtainWrite(&cm_scacheLock);
+    for (i=0; i<cm_data.hashTableSize; i++) {
+        for (scp = cm_data.hashTablep[i]; scp; scp = scp->nextp) {
+           cm_HoldSCacheNoLock(scp);
+           lock_ReleaseWrite(&cm_scacheLock);
+
+           /* now flush the file */
+           code = cm_FlushFile(scp, userp, &req);
+           lock_ObtainWrite(&cm_scacheLock);
+           cm_ReleaseSCacheNoLock(scp);
+        }
+    }
+    lock_ReleaseWrite(&cm_scacheLock);
+
+    return code;
+}
+
 long cm_IoctlFlushVolume(struct smb_ioctl *ioctlp, struct cm_user *userp)
 {
     long code;
@@ -581,8 +609,6 @@ long cm_IoctlFlushVolume(struct smb_ioctl *ioctlp, struct cm_user *userp)
 
                 /* now flush the file */
                 code = cm_FlushFile(scp, userp, &req);
-                if ( code )
-                    afsi_log("cm_FlushFile returns error: [%x]",code);
                 lock_ObtainWrite(&cm_scacheLock);
                 cm_ReleaseSCacheNoLock(scp);
             }
index bcf7545..016f02b 100644 (file)
@@ -59,6 +59,8 @@ extern long cm_IoctlGetFileCellName(smb_ioctl_t *ioctlp, cm_user_t *userp);
 
 extern long cm_IoctlSetACL(smb_ioctl_t *ioctlp, cm_user_t *userp);
 
+extern long cm_IoctlFlushAllVolumes(smb_ioctl_t *ioctlp, cm_user_t *userp);
+
 extern long cm_IoctlFlushVolume(smb_ioctl_t *ioctlp, cm_user_t *userp);
 
 extern long cm_IoctlFlushFile(smb_ioctl_t *ioctlp, cm_user_t *userp);
index 1308727..64abc21 100644 (file)
@@ -1344,6 +1344,22 @@ ListACLCmd(struct cmd_syndesc *as, char *arock)
 }
 
 static int
+FlushAllCmd(struct cmd_syndesc *as, char *arock)
+{
+    afs_int32 code;
+    struct ViceIoctl blob;
+    struct cmd_item *ti;
+
+    blob.in_size = blob.out_size = 0;
+    code = pioctl(NULL, VIOC_FLUSHALL, &blob, 0);
+    if (code) {
+       fprintf(stderr, "Error flushing all ");
+       return 1;
+    }
+    return 0;
+}
+
+static int
 FlushVolumeCmd(struct cmd_syndesc *as, char *arock)
 {
     afs_int32 code;
@@ -4456,7 +4472,9 @@ main(int argc, char **argv)
     cmd_AddParm(ts, "-cell", CMD_LIST, 0, "cell name");
     cmd_AddParm(ts, "-suid", CMD_FLAG, CMD_OPTIONAL, "allow setuid programs");
     cmd_AddParm(ts, "-nosuid", CMD_FLAG, CMD_OPTIONAL, "disallow setuid programs");
-    
+
+    ts = cmd_CreateSyntax("flushall", FlushAllCmd, 0, "flush all data");
+
     ts = cmd_CreateSyntax("flushvolume", FlushVolumeCmd, 0, "flush all data in volume");
     cmd_AddParm(ts, "-path", CMD_LIST, CMD_OPTIONAL, "dir/file path");
 
index 9e98567..41b2b58 100644 (file)
@@ -91,4 +91,5 @@ typedef struct cm_cacheParms {
 #define VIOC_SETRXKCRYPT               0x28
 #define VIOC_TRACEMEMDUMP               0x29
 #define VIOC_SHUTDOWN                   0x2a
+#define VIOC_FLUSHALL                   0x2b
 #endif /*  __SMB_IOCONS_H_ENV_ */
index 2bfebde..739774f 100644 (file)
@@ -31,6 +31,10 @@ smb_ioctlProc_t *smb_ioctlProcsp[SMB_IOCTL_MAXPROCS];
 
 void smb_InitIoctl(void)
 {
+        int i;
+        for (i=0; i<SMB_IOCTL_MAXPROCS; i++)
+           smb_ioctlProcsp[i] = NULL;
+
        smb_ioctlProcsp[VIOCGETAL] = cm_IoctlGetACL;
         smb_ioctlProcsp[VIOC_FILE_CELL_NAME] = cm_IoctlGetFileCellName;
         smb_ioctlProcsp[VIOCSETAL] = cm_IoctlSetACL;
@@ -74,6 +78,7 @@ void smb_InitIoctl(void)
 #endif
        smb_ioctlProcsp[VIOC_TRACEMEMDUMP] = cm_IoctlMemoryDump;
        smb_ioctlProcsp[VIOC_ISSYMLINK] = cm_IoctlIslink;
+        smb_ioctlProcsp[VIOC_FLUSHALL] = cm_IoctlFlushAllVolumes;
 }
 
 /* called to make a fid structure into an IOCTL fid structure */