]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-windows-fs-flushall-20050907
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 7 Sep 2005 20:31:26 +0000 (20:31 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 7 Sep 2005 20:31:26 +0000 (20:31 +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

====================

remove extra patch from duplicate pullup

====================

ugh, one more time

(cherry picked from commit 9e348b344dfe9f3940f099beb2acc208fa90a61c)

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 a2ceb6e1d192ad84a1cfe45ddedec777d9a5260b..ee6c2cb82b465c2d231cb11d87a1899144051b4a 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 fa5bae6bc419e224543eb3c4e6100cc61e59c98f..397297cec5aaefe6c189a430be6c4a5cf74e2522 100644 (file)
@@ -78,6 +78,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;
 }
 
@@ -530,6 +531,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;
@@ -555,8 +583,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 bcf7545ba3d930278294e95fd9042d7a3fc55a34..016f02b607c8b503e81d66e855cbf1fddc45e895 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 13087272d29591efd0b1329461d718117ad80490..64abc216c78e210c6e3c479fc44c685031c2ce8a 100644 (file)
@@ -1343,6 +1343,22 @@ ListACLCmd(struct cmd_syndesc *as, char *arock)
     return error;
 }
 
+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)
 {
@@ -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 9e98567a59113c7b38e7dd9c0d65fe8f3dbec7c2..41b2b589486f37bb557acd260e7ee0905a53292a 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 2bfebde5122af777f8e487f90e1ee52d3ff8954f..739774f1e72e3df1545935581093abd078ae4986 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 */