From c0bb6ce3f2057b82d38a9b3e3c3b3f390e4de1ac Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 7 Sep 2005 20:31:26 +0000 Subject: [PATCH] STABLE14-windows-fs-flushall-20050907 "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 | 3 +++ src/WINNT/afsd/cm_ioctl.c | 30 ++++++++++++++++++++-- src/WINNT/afsd/cm_ioctl.h | 2 ++ src/WINNT/afsd/fs.c | 20 ++++++++++++++- src/WINNT/afsd/smb_iocons.h | 1 + src/WINNT/afsd/smb_ioctl.c | 5 ++++ 6 files changed, 58 insertions(+), 3 deletions(-) diff --git a/doc/txt/winnotes/afs-changes-since-1.2.txt b/doc/txt/winnotes/afs-changes-since-1.2.txt index a2ceb6e1d..ee6c2cb82 100644 --- a/doc/txt/winnotes/afs-changes-since-1.2.txt +++ b/doc/txt/winnotes/afs-changes-since-1.2.txt @@ -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 diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index fa5bae6bc..397297cec 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -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; inextp) { + 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); } diff --git a/src/WINNT/afsd/cm_ioctl.h b/src/WINNT/afsd/cm_ioctl.h index bcf7545ba..016f02b60 100644 --- a/src/WINNT/afsd/cm_ioctl.h +++ b/src/WINNT/afsd/cm_ioctl.h @@ -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); diff --git a/src/WINNT/afsd/fs.c b/src/WINNT/afsd/fs.c index 13087272d..64abc216c 100644 --- a/src/WINNT/afsd/fs.c +++ b/src/WINNT/afsd/fs.c @@ -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"); diff --git a/src/WINNT/afsd/smb_iocons.h b/src/WINNT/afsd/smb_iocons.h index 9e98567a5..41b2b5894 100644 --- a/src/WINNT/afsd/smb_iocons.h +++ b/src/WINNT/afsd/smb_iocons.h @@ -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_ */ diff --git a/src/WINNT/afsd/smb_ioctl.c b/src/WINNT/afsd/smb_ioctl.c index 2bfebde51..739774f1e 100644 --- a/src/WINNT/afsd/smb_ioctl.c +++ b/src/WINNT/afsd/smb_ioctl.c @@ -31,6 +31,10 @@ smb_ioctlProc_t *smb_ioctlProcsp[SMB_IOCTL_MAXPROCS]; void smb_InitIoctl(void) { + int i; + for (i=0; i