]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
STABLE14-darwin-bsd-flock-20060227
authorChaskiel M Grundman <cg2v@andrew.cmu.edu>
Mon, 27 Feb 2006 20:35:11 +0000 (20:35 +0000)
committerDerrick Brashear <shadow@dementia.org>
Mon, 27 Feb 2006 20:35:11 +0000 (20:35 +0000)
FIXES 25544

deal with posix flag in flock request on darwin

(cherry picked from commit 888b038c92c222f0ebb4b61f9f96bd56ce75dfed)

src/afs/DARWIN/osi_vnodeops.c
src/afs/VNOPS/afs_vnop_flock.c

index c2dd79a360ec24e614101a5d4182c0503cf16e55..ada87356ce0b18191debfb853b34e2ab421c7197 100644 (file)
@@ -1743,7 +1743,10 @@ afs_vop_advlock(ap)
 {
     int error;
     struct ucred *tcr;
+    int clid;
+    int op;
 #ifdef AFS_DARWIN80_ENV
+    proc_t p;
     tcr=vop_cred;
 #else
     struct proc *p = current_proc();
@@ -1753,11 +1756,26 @@ afs_vop_advlock(ap)
     pcred_unlock(p);
     tcr=&cr;
 #endif
+    if (ap->a_flags & F_POSIX) {
+#ifdef AFS_DARWIN80_ENV
+       p = (proc_t) ap->a_id;
+       clid = proc_pid(p);
+#else
+       p = (struct proc *) ap->a_id;
+       clid = p->p_pid;
+#endif
+    } else {
+       clid = (int)ap->a_id;
+    }
+    if (ap->a_op == F_UNLCK) {
+       op = F_SETLK;
+    } else if (ap->a_op == F_SETLK && ap->a_flags & F_WAIT) {
+       op = F_SETLKW;
+    } else {
+       op = ap->a_op;
+    }
     AFS_GLOCK();
-    error =
-       afs_lockctl(VTOAFS(ap->a_vp), ap->a_fl,
-                   ap->a_op == F_UNLCK ? F_SETLK : ap->a_op, tcr, 
-                   (int)ap->a_id);
+    error = afs_lockctl(VTOAFS(ap->a_vp), ap->a_fl, op, tcr, clid);
     AFS_GUNLOCK();
     return error;
 }
index c0cb5a8905202048b18e0fbc00699927f7e2f826..55df7cd75c34f2d217a369365903c605281dde5f 100644 (file)
@@ -569,7 +569,7 @@ int afs_lockctl(struct vcache * avc, struct AFS_FLOCK * af, int acmd,
 #endif
        ) && code != LOCK_UN)
        code |= LOCK_NB;        /* non-blocking, s.v.p. */
-#if    defined(AFS_OSF_ENV)
+#if    defined(AFS_OSF_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_XBSD_ENV)
     code = HandleFlock(avc, code, &treq, clid, 0 /*!onlymine */ );
 #elif defined(AFS_SGI_ENV)
     AFS_RWLOCK((vnode_t *) avc, VRWLOCK_WRITE);