From 7ffd4a867a3f339853631fc6dd708222961493e6 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Thu, 3 Feb 2011 15:40:48 -0600 Subject: [PATCH] ConvertROtoRW: Use old copyDate for creationDate When we convert an RO volume to an RW, currently we just copy the copyDate and creationDate from the RO metadata into the RW. But the copyDate and creationDate fields have different meanings for RW and RO volumes: for ROs, the creationDate is merely the last time the data was updated from the RW during a release operation. So, if the copyDate is older than the creationDate, use the copyDate as the new RW creationDate instead. This will probably not match the creationDate of the original RW, but it will be closer to it, and it will more accurately represent the conceptual "created time" of the new RW. Doing this can avoid forcing an unnecessary full dump on a subsequent release of the resultant RW volume, since the creationDate is more accurate. Reviewed-on: http://gerrit.openafs.org/3891 Tested-by: BuildBot Reviewed-by: Derrick Brashear (cherry picked from commit f47487db051ba6b51ae12daf7edc09ecfd3c38cd) Change-Id: I54516a20ebb87d9c482cbc4840e0d236e7c54f8a Reviewed-on: http://gerrit.openafs.org/5755 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/vol/listinodes.c | 13 +++++++++++++ src/vol/namei_ops.c | 14 ++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/vol/listinodes.c b/src/vol/listinodes.c index beed24553..fd608aa75 100644 --- a/src/vol/listinodes.c +++ b/src/vol/listinodes.c @@ -1327,6 +1327,19 @@ convertVolumeInfo(FdHandle_t *fdhr, FdHandle_t *fdhw, afs_uint32 vid) vd.uniquifier += 5000; /* just in case there are still file copies from the old RW volume around */ + /* For ROs, the copyDate contains the time that the RO volume was actually + * created, and the creationDate just contains the last time the RO was + * copied from the RW data. So, make the new RW creationDate more accurate + * by setting it to copyDate, if copyDate is older. Since, we know the + * volume is at least as old as copyDate. */ + if (vd.copyDate < vd.creationDate) { + vd.creationDate = vd.copyDate; + } else { + /* If copyDate is newer, just make copyDate and creationDate the same, + * for consistency with other RWs */ + vd.copyDate = vd.creationDate; + } + p = strrchr(vd.name, '.'); if (p && !strcmp(p, ".readonly")) { memset(p, 0, 9); diff --git a/src/vol/namei_ops.c b/src/vol/namei_ops.c index 59267d0ab..42ae89eaa 100644 --- a/src/vol/namei_ops.c +++ b/src/vol/namei_ops.c @@ -2753,6 +2753,20 @@ convertVolumeInfo(FD_t fdr, FD_t fdw, afs_uint32 vid) vd.inUse = 0; vd.uniquifier += 5000; /* just in case there are still file copies from * the old RW volume around */ + + /* For ROs, the copyDate contains the time that the RO volume was actually + * created, and the creationDate just contains the last time the RO was + * copied from the RW data. So, make the new RW creationDate more accurate + * by setting it to copyDate, if copyDate is older. Since, we know the + * volume is at least as old as copyDate. */ + if (vd.copyDate < vd.creationDate) { + vd.creationDate = vd.copyDate; + } else { + /* If copyDate is newer, just make copyDate and creationDate the same, + * for consistency with other RWs */ + vd.copyDate = vd.creationDate; + } + p = strrchr(vd.name, '.'); if (p && !strcmp(p, ".readonly")) { memset(p, 0, 9); -- 2.39.5