linux-enroll-locks-20060403
authorChaskiel M Grundman <cg2v@andrew.cmu.edu>
Tue, 4 Apr 2006 02:41:12 +0000 (02:41 +0000)
committerDerrick Brashear <shadow@dementia.org>
Tue, 4 Apr 2006 02:41:12 +0000 (02:41 +0000)
FIXES 25037

enroll our locks in the linux kernels' lock management

src/afs/LINUX/osi_vnodeops.c

index 468a7e5..8bbb814 100644 (file)
@@ -463,6 +463,25 @@ afs_linux_lock(struct file *fp, int cmd, struct file_lock *flp)
     code = afs_lockctl(vcp, &flock, cmd, credp);
     AFS_GUNLOCK();
 
+#ifdef AFS_LINUX24_ENV
+    if (code == 0 && (cmd == F_SETLK || cmd == F_SETLKW)) {
+       struct file_lock flp2;
+       flp2 = *flp;
+#ifdef AFS_LINUX26_ENV
+       flp2.fl_flags &=~ FL_SLEEP;
+#endif
+       code = posix_lock_file(fp, &flp2);
+       osi_Assert(code != -EAGAIN); /* there should be no conflicts */
+       if (code) {
+           struct AFS_FLOCK flock2;
+           flock2 = flock;
+           flock2.l_type = F_UNLCK;
+           AFS_GLOCK();
+           afs_lockctl(vcp, &flock2, F_SETLK, credp);
+           AFS_GUNLOCK();
+       }
+    }
+#endif
     /* Convert flock back to Linux's file_lock */
     flp->fl_type = flock.l_type;
     flp->fl_pid = flock.l_pid;