libafs: add partial background store
authorHartmut Reuter <reuter@rzg.mpg.de>
Thu, 18 Oct 2012 11:07:21 +0000 (07:07 -0400)
committerDerrick Brashear <shadow@your-file-system.com>
Fri, 19 Oct 2012 10:32:22 +0000 (03:32 -0700)
add a bop that does a partial store

Change-Id: I5971d2cda705a11c7fba7c0cfa54a3fa2d90f392
Reviewed-on: http://gerrit.openafs.org/8249
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@your-file-system.com>

src/afs/afs.h
src/afs/afs_daemons.c

index 6a24cc0..f3acdb7 100644 (file)
@@ -135,6 +135,7 @@ struct sysname_info {
 #ifdef AFS_DARWIN_ENV
 #define        BOP_MOVE        5        /* ptr1 afs_uspc_param ptr2 sname ptr3 dname */
 #endif
+#define BOP_PARTIAL_STORE 6     /* parm1 is chunk to store */
 
 #define        B_DONTWAIT      1       /* On failure return; don't wait */
 
index 05e4287..7d875ed 100644 (file)
@@ -611,6 +611,43 @@ BStore(struct brequest *ab)
     }
 }
 
+static void
+BPartialStore(struct brequest *ab)
+{
+    struct vcache *tvc;
+    afs_int32 code;
+    struct vrequest treq;
+    int locked, shared_locked = 0;
+
+    AFS_STATCNT(BStore);
+    if ((code = afs_InitReq(&treq, ab->cred)))
+       return;
+    code = 0;
+    tvc = ab->vc;
+    locked = tvc->lock.excl_locked? 1:0;
+    if (!locked)
+        ObtainWriteLock(&tvc->lock, 1209);
+    else if (!(tvc->lock.excl_locked & WRITE_LOCK)) {
+       shared_locked = 1;
+       ConvertSToRLock(&tvc->lock);
+    }
+    code = afs_StoreAllSegments(tvc, &treq, AFS_ASYNC);
+    if (!locked)
+       ReleaseWriteLock(&tvc->lock);
+    else if (shared_locked)
+       ConvertSToRLock(&tvc->lock);
+    /* now set final return code, and wakeup anyone waiting */
+    if ((ab->flags & BUVALID) == 0) {
+       /* set final code, since treq doesn't go across processes */
+       ab->code = afs_CheckCode(code, &treq, 43);
+       ab->flags |= BUVALID;
+       if (ab->flags & BUWAIT) {
+           ab->flags &= ~BUWAIT;
+           afs_osi_Wakeup(ab);
+       }
+    }
+}
+
 /* release a held request buffer */
 void
 afs_BRelease(struct brequest *ab)
@@ -1104,6 +1141,8 @@ afs_BackgroundDaemon(void)
                 return 0;
             }
 #endif
+           else if (tb->opcode == BOP_PARTIAL_STORE)
+               BPartialStore(tb);
            else
                panic("background bop");
            brequest_release(tb);