]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-undo-viced-copyonwrite-optimization-20090315
authorDerrick Brashear <shadow@dementia.org>
Wed, 25 Mar 2009 13:07:27 +0000 (13:07 +0000)
committerDerrick Brashear <shadow@dementia.org>
Wed, 25 Mar 2009 13:07:27 +0000 (13:07 +0000)
LICENSE IPL10

still issues with this

src/viced/afsfileprocs.c
src/viced/viced.c

index 852d746d6dd3e64e7c39f818b2fba1ccb61f6ab7..555f0f53d2b265771867a2ff58ff0cc55fa01aa1 100644 (file)
@@ -196,8 +196,6 @@ afs_int32 BlocksSpare = 1024;       /* allow 1 MB overruns */
 afs_int32 PctSpare;
 extern afs_int32 implicitAdminRights;
 extern afs_int32 readonlyServer;
-extern int CopyOnWrite_calls, CopyOnWrite_off0, CopyOnWrite_size0;
-extern afs_fsize_t CopyOnWrite_maxsize;
 
 /*
  * Externals used by the xstat code.
@@ -1117,9 +1115,8 @@ Store_AccessList(Vnode * targetptr, struct AFSAccessList *AccessList)
  * disk.inodeNumber and cloned)
  */
 #define        COPYBUFFSIZE    8192
-#define MAXFSIZE (~(afs_fsize_t) 0)
 static int
-CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_fsize_t off, afs_fsize_t len)
+CopyOnWrite(Vnode * targetptr, Volume * volptr)
 {
     Inode ino, nearInode;
     int rdlen;
@@ -1136,13 +1133,6 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_fsize_t off, afs_fsize_t len
        DFlush();               /* just in case? */
 
     VN_GET_LEN(size, targetptr);
-    if (size > off) 
-       size -= off;
-    else 
-       size = 0;
-    if (size > len)
-       size = len;
-
     buff = (char *)malloc(COPYBUFFSIZE);
     if (buff == NULL) {
        return EIO;
@@ -1186,8 +1176,6 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_fsize_t off, afs_fsize_t len
     newFdP = IH_OPEN(newH);
     assert(newFdP != NULL);
 
-    FDH_SEEK(targFdP, off, SEEK_SET);
-    FDH_SEEK(newFdP, off, SEEK_SET);
     while (size > 0) {
        if (size > COPYBUFFSIZE) {      /* more than a buffer */
            length = COPYBUFFSIZE;
@@ -1265,41 +1253,6 @@ CopyOnWrite(Vnode * targetptr, Volume * volptr, afs_fsize_t off, afs_fsize_t len
     return 0;                  /* success */
 }                              /*CopyOnWrite */
 
-static int
-CopyOnWrite2(FdHandle_t *targFdP, FdHandle_t *newFdP, afs_fsize_t off, afs_fsize_t size) {
-    char *buff = (char *)malloc(COPYBUFFSIZE);
-    register int length;
-    int rdlen;
-    int wrlen;
-    int rc;
-
-    FDH_SEEK(targFdP, off, SEEK_SET);
-    FDH_SEEK(newFdP, off, SEEK_SET);
-
-    while (size > 0) {
-       if (size > COPYBUFFSIZE) {      /* more than a buffer */
-           length = COPYBUFFSIZE;
-           size -= COPYBUFFSIZE;
-       } else {
-           length = (int)size;
-           size = 0;
-       }
-       rdlen = FDH_READ(targFdP, buff, length);
-       if (rdlen == length)
-           wrlen = FDH_WRITE(newFdP, buff, length);
-       else
-           wrlen = 0;
-
-       if ((rdlen != length) || (wrlen != length)) {
-           /* no error recovery, at the worst we'll have a "hole" in the file */
-           rc = 1;
-           break;
-       }
-    }
-    free(buff);
-    return rc;
-}
-
 
 /*
  * Common code to handle with removing the Name (file when it's called from
@@ -1320,7 +1273,7 @@ DeleteTarget(Vnode * parentptr, Volume * volptr, Vnode ** targetptr,
        return (EINVAL);
     if (parentptr->disk.cloned) {
        ViceLog(25, ("DeleteTarget : CopyOnWrite called\n"));
-       if ((errorCode = CopyOnWrite(parentptr, volptr, 0, MAXFSIZE))) {
+       if ((errorCode = CopyOnWrite(parentptr, volptr))) {
            ViceLog(20,
                    ("DeleteTarget %s: CopyOnWrite failed %d\n", Name,
                     errorCode));
@@ -1764,7 +1717,7 @@ Alloc_NewVnode(Vnode * parentptr, DirHandle * dir, Volume * volptr,
 
     if (parentptr->disk.cloned) {
        ViceLog(25, ("Alloc_NewVnode : CopyOnWrite called\n"));
-       if ((errorCode = CopyOnWrite(parentptr, volptr, 0, MAXFSIZE))) {        /* disk full */
+       if ((errorCode = CopyOnWrite(parentptr, volptr))) {     /* disk full */
            ViceLog(25, ("Alloc_NewVnode : CopyOnWrite failed\n"));
            /* delete the vnode previously allocated */
            (*targetptr)->delete = 1;
@@ -4034,13 +3987,13 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
      */
     if (oldvptr->disk.cloned) {
        ViceLog(25, ("Rename : calling CopyOnWrite on  old dir\n"));
-       if ((errorCode = CopyOnWrite(oldvptr, volptr, 0, MAXFSIZE)))
+       if ((errorCode = CopyOnWrite(oldvptr, volptr)))
            goto Bad_Rename;
     }
     SetDirHandle(&olddir, oldvptr);
     if (newvptr->disk.cloned) {
        ViceLog(25, ("Rename : calling CopyOnWrite on  new dir\n"));
-       if ((errorCode = CopyOnWrite(newvptr, volptr, 0, MAXFSIZE)))
+       if ((errorCode = CopyOnWrite(newvptr, volptr)))
            goto Bad_Rename;
     }
 
@@ -4190,7 +4143,7 @@ SAFSS_Rename(struct rx_call *acall, struct AFSFid *OldDirFid, char *OldName,
      */
     if ((fileptr->disk.type == vDirectory) && (fileptr->disk.cloned)) {
        ViceLog(25, ("Rename : calling CopyOnWrite on  target dir\n"));
-       if ((errorCode = CopyOnWrite(fileptr, volptr, 0, MAXFSIZE)))
+       if ((errorCode = CopyOnWrite(fileptr, volptr)))
            goto Bad_Rename;
     }
 
@@ -4702,7 +4655,7 @@ SAFSS_Link(struct rx_call *acall, struct AFSFid *DirFid, char *Name,
     }
     if (parentptr->disk.cloned) {
        ViceLog(25, ("Link : calling CopyOnWrite on  target dir\n"));
-       if ((errorCode = CopyOnWrite(parentptr, volptr, 0, MAXFSIZE)))
+       if ((errorCode = CopyOnWrite(parentptr, volptr)))
            goto Bad_Link;      /* disk full error */
     }
 
@@ -7315,8 +7268,7 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
     afs_fsize_t NewLength;     /* size after this store completes */
     afs_sfsize_t adjustSize;   /* bytes to call VAdjust... with */
     int linkCount;             /* link count on inode */
-    afs_fsize_t CoW_off = 0, CoW_len = 0;
-    FdHandle_t *fdP, *origfdP = NULL;
+    FdHandle_t *fdP;
     struct in_addr logHostAddr;        /* host ip holder for inet_ntoa */
 
 #if FS_STATS_DETAILED
@@ -7375,32 +7327,20 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
             * mechanisms (i.e. copy on write overhead.) Also the right size
             * of the disk will be recorded...
             */
-           origfdP = fdP;
+           FDH_CLOSE(fdP);
            VN_GET_LEN(size, targetptr);
            volptr->partition->flags &= ~PART_DONTUPDATE;
            VSetPartitionDiskUsage(volptr->partition);
            volptr->partition->flags |= PART_DONTUPDATE;
            if ((errorCode = VDiskUsage(volptr, nBlocks(size)))) {
                volptr->partition->flags &= ~PART_DONTUPDATE;
-               FDH_CLOSE(origfdP);
                return (errorCode);
            }
 
-           if (Pos == 0) 
-               CoW_off = Length;       /* only copy remaining parts of file */
-           if (Length <= FileLength)
-               CoW_len = FileLength - Length;
-           CopyOnWrite_calls++;
-           if (CoW_len == 0) CopyOnWrite_size0++;
-           if (CoW_off == 0) CopyOnWrite_off0++;
-           if (CoW_len > CopyOnWrite_maxsize) CopyOnWrite_maxsize = CoW_len;
-
-           ViceLog(1, ("StoreData : calling CopyOnWrite on vnode %lu.%lu (%s) off 0x%llx size 0x%llx\n",
-                       V_id(volptr), targetptr->vnodeNumber, V_name(volptr), CoW_off, CoW_len));
-           if ((errorCode = CopyOnWrite(targetptr, volptr, CoW_off, CoW_len))) {
+           ViceLog(25, ("StoreData : calling CopyOnWrite on  target dir\n"));
+           if ((errorCode = CopyOnWrite(targetptr, volptr))) {
                ViceLog(25, ("StoreData : CopyOnWrite failed\n"));
                volptr->partition->flags &= ~PART_DONTUPDATE;
-               FDH_CLOSE(origfdP);
                return (errorCode);
            }
            volptr->partition->flags &= ~PART_DONTUPDATE;
@@ -7409,7 +7349,6 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
            if (fdP == NULL) {
                ViceLog(25,
                        ("StoreData : Reopen after CopyOnWrite failed\n"));
-               FDH_CLOSE(origfdP);
                return ENOENT;
            }
        }
@@ -7441,7 +7380,6 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
         AdjustDiskUsage(volptr, adjustSize,
                         adjustSize - SpareComp(volptr)))) {
        FDH_CLOSE(fdP);
-       if (origfdP) FDH_CLOSE(origfdP);
        return (errorCode);
     }
 
@@ -7537,9 +7475,6 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
         * need to update the target vnode.
         */
        targetptr->changed_newTime = 1;
-       if (origfdP && (bytesTransfered < Length))      /* Need to "finish" CopyOnWrite still */
-           CopyOnWrite2(origfdP, fdP, bytesTransfered, Length - bytesTransfered);
-       if (origfdP) FDH_CLOSE(origfdP);
        FDH_CLOSE(fdP);
        /* set disk usage to be correct */
        VAdjustDiskUsage(&errorCode, volptr,
@@ -7547,7 +7482,6 @@ StoreData_RXStyle(Volume * volptr, Vnode * targetptr, struct AFSFid * Fid,
                                         nBlocks(NewLength)), 0);
        return errorCode;
     }
-    if (origfdP) FDH_CLOSE(origfdP);
     FDH_CLOSE(fdP);
 
     TM_GetTimeOfDay(&StopTime, 0);
index 458b9356f66971d15b48523885956893792019bc..d669ab21ccff854efb75390e6c7e526162fac5c2 100644 (file)
@@ -579,8 +579,6 @@ ClearXStatValues()
 
 }                              /*ClearXStatValues */
 
-int CopyOnWrite_calls = 0, CopyOnWrite_off0 = 0, CopyOnWrite_size0 = 0;
-afs_fsize_t CopyOnWrite_maxsize = 0;
 
 static void
 PrintCounters()
@@ -619,9 +617,6 @@ PrintCounters()
     ViceLog(0,
            ("There are %d workstations, %d are active (req in < 15 mins), %d marked \"down\"\n",
             workstations, activeworkstations, delworkstations));
-    ViceLog(0, ("CopyOnWrite: calls %d off0 %d size0 %d maxsize 0x%llx\n",
-               CopyOnWrite_calls, CopyOnWrite_off0, CopyOnWrite_size0, CopyOnWrite_maxsize));
-
     Statistics = 0;
 
 }                              /*PrintCounters */