From: Andrew Deason Date: Fri, 11 Jun 2010 22:40:18 +0000 (-0500) Subject: vol: break callbacks when needsCallback is set X-Git-Tag: openafs-devel-1_5_75~94 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=52ac633da7735c297fa8c43bf9098a6fe0f5beb2;p=packages%2Fo%2Fopenafs.git vol: break callbacks when needsCallback is set The needsCallback vol header field indicates that a volume has been altered by a non-fileserver program somehow, and that callbacks for the volume should be broken. So, when we attach a volume that has this flag set, break callbacks if we can. If we are not the fileserver, tell the fileserver over FSSYNC to break callbacks if we can. Change-Id: I1b1a4042f0381e8291a407b54ce9478877dacdca Reviewed-on: http://gerrit.openafs.org/2211 Tested-by: Andrew Deason Tested-by: Derrick Brashear Reviewed-by: Derrick Brashear --- diff --git a/src/vol/volume.c b/src/vol/volume.c index 65b400491..ffd76aa11 100644 --- a/src/vol/volume.c +++ b/src/vol/volume.c @@ -2446,13 +2446,6 @@ VAttachVolumeByName_r(Error * ec, char *partition, char *name, int mode) if (V_attachState(vp) != VOL_STATE_ATTACHED) { goto done; } -#endif - V_needsCallback(vp) = 0; -#ifdef notdef - if (VInit >= 2 && V_BreakVolumeCallbacks) { - Log("VAttachVolume: Volume %u was changed externally; breaking callbacks\n", V_id(vp)); - (*V_BreakVolumeCallbacks) (V_id(vp)); - } #endif VUpdateVolume_r(ec, vp, 0); if (*ec) { @@ -2601,7 +2594,6 @@ VAttachVolumeByVp_r(Error * ec, Volume * vp, int mode) goto done; } - V_needsCallback(vp) = 0; VUpdateVolume_r(ec, vp, 0); if (*ec) { Log("VAttachVolume: Error updating volume %u\n", vp->hashid); @@ -3271,6 +3263,52 @@ attach2(Error * ec, VolId volumeId, char *path, struct DiskPartition64 *partp, } #endif /* BITMAP_LATER */ + if (VInit >= 2 && V_needsCallback(vp)) { + if (V_BreakVolumeCallbacks) { + Log("VAttachVolume: Volume %lu was changed externally; breaking callbacks\n", + afs_printable_uint32_lu(V_id(vp))); + V_needsCallback(vp) = 0; + VOL_UNLOCK; + (*V_BreakVolumeCallbacks) (V_id(vp)); + VOL_LOCK; + + VUpdateVolume_r(ec, vp, 0); + } +#ifdef FSSYNC_BUILD_CLIENT + else if (VCanUseFSSYNC()) { + afs_int32 fsync_code; + + V_needsCallback(vp) = 0; + VOL_UNLOCK; + fsync_code = FSYNC_VolOp(V_id(vp), NULL, FSYNC_VOL_BREAKCBKS, FSYNC_WHATEVER, NULL); + VOL_LOCK; + + if (fsync_code) { + V_needsCallback(vp) = 1; + Log("Error trying to tell the fileserver to break callbacks for " + "changed volume %lu; error code %ld\n", + afs_printable_uint32_lu(V_id(vp)), + afs_printable_int32_ld(fsync_code)); + } else { + VUpdateVolume_r(ec, vp, 0); + } + } +#endif /* FSSYNC_BUILD_CLIENT */ + + if (*ec) { + Log("VAttachVolume: error %d clearing needsCallback on volume " + "%lu; needs salvage\n", (int)*ec, + afs_printable_uint32_lu(V_id(vp))); +#ifdef AFS_DEMAND_ATTACH_FS + VRequestSalvage_r(ec, vp, SALVSYNC_ERROR, VOL_SALVAGE_INVALIDATE_HEADER); + vp->nUsers = 0; +#else /* !AFS_DEMAND_ATTACH_FS */ + *ec = VSALVAGE; +#endif /* !AFS_DEMAND_ATTACh_FS */ + goto error; + } + } + if (programType == fileServer) { if (vp->specialStatus) vp->specialStatus = 0;