]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
afs_TruncateAllSegments() make sure correct afs_size_t comparison is
authorRainer Toebbicke <rtb@pclella.cern.ch>
Mon, 8 Feb 2010 14:18:04 +0000 (15:18 +0100)
committerDerrick Brashear <shadow@dementia.org>
Tue, 9 Feb 2010 19:34:02 +0000 (11:34 -0800)
used when selecting dcache entries for truncation

Insure that afs_TruncateAllSegments() uses the correct [64-bit]
comparison when deciding whether to truncate chunks:
alen - AFS_CHUNKTOBASE(tdc->f.chunk) for a file > 2GB would fail
to be recognised negative with an "afs_int32 newSize", even with
alen = 0 and big tdc->f.chunk.

Change-Id: Id77109fb8238234dae725bd876f70ea0fbd403fc
Change-Id: If0120e21a52316e536d03241c83e8f0d36614c13
Reviewed-on: http://gerrit.openafs.org/1252
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit 3913aa55eed10f9d6316910ef950f5c3242e20d7)
Reviewed-on: http://gerrit.openafs.org/1282

src/afs/afs_segments.c

index a430c08ecc8111f82082f2dcdbd5c0a4e7500aa5..66fa1fe879387a3188588812fba23886f02a3b14 100644 (file)
@@ -931,7 +931,7 @@ afs_TruncateAllSegments(register struct vcache *avc, afs_size_t alen,
     register struct dcache *tdc;
     register afs_int32 code;
     register afs_int32 index;
-    afs_int32 newSize;
+    afs_size_t newSize;
 
     int dcCount, dcPos;
     struct dcache **tdcArray;
@@ -1035,12 +1035,12 @@ afs_TruncateAllSegments(register struct vcache *avc, afs_size_t alen,
        if (newSize < 0)
            newSize = 0;
        ObtainSharedLock(&tdc->lock, 672);
-       if (newSize < tdc->f.chunkBytes) {
+       if (newSize < tdc->f.chunkBytes && newSize < MAX_AFS_UINT32) {
            UpgradeSToWLock(&tdc->lock, 673);
            tfile = afs_CFileOpen(tdc->f.inode);
-           afs_CFileTruncate(tfile, newSize);
+           afs_CFileTruncate(tfile, (afs_int32)newSize);
            afs_CFileClose(tfile);
-           afs_AdjustSize(tdc, newSize);
+           afs_AdjustSize(tdc, (afs_int32)newSize);
            if (alen < tdc->validPos) {
                 if (alen < AFS_CHUNKTOBASE(tdc->f.chunk))
                     tdc->validPos = 0;