struct clone_rock decRock;
afs_int32 offset = 0;
afs_int32 dircloned, inodeinced;
+ afs_int32 filecount = 0, diskused = 0;
struct VnodeClassInfo *vcp = &VnodeClassInfo[class];
int ReadWriteOriginal = VolumeWriteable(rwvp);
+ /* Correct number of files in volume: this assumes indexes are always
+ cloned starting with vLarge */
+ if (ReadWriteOriginal && class != vLarge) {
+ filecount = V_filecount(rwvp);
+ diskused = V_diskused(rwvp);
+ }
+
/* Open the RW volume's index file and seek to beginning */
IH_COPY(rwH, rwvp->vnodeIndex[class].handle);
rwFd = IH_OPEN(rwH);
}
if (rwvnode->type != vNull) {
+ afs_fsize_t ll;
+
if (rwvnode->vnodeMagic != vcp->magic)
ERROR_EXIT(-1);
rwinode = VNDISK_GET_INO(rwvnode);
+ filecount++;
+ VNDISK_GET_LEN(ll, rwvnode);
+ diskused += nBlocks(ll);
/* Increment the inode if not already */
if (clinode && (clinode == rwinode)) {
error = code;
ci_Destroy(&decHead);
+ if (ReadWriteOriginal && filecount > 0)
+ V_filecount(rwvp) = filecount;
+ if (ReadWriteOriginal && diskused > 0)
+ V_diskused(rwvp) = diskused;
return error;
}
{
afs_int32 code, error = 0;
afs_int32 reclone;
+ afs_int32 filecount = V_filecount(original), diskused = V_diskused(original);
*rerror = 0;
reclone = ((new == old) ? 1 : 0);
code = DoCloneIndex(original, new, vSmall, reclone);
if (code)
ERROR_EXIT(code);
+ if (filecount != V_filecount(original) || diskused != V_diskused(original))
+ Log("Clone %u: filecount %d -> %d diskused %d -> %d\n",
+ V_id(original), filecount, V_filecount(original), diskused, V_diskused(original));
code = CopyVolumeHeader(&V_disk(original), &V_disk(new));
if (code)