[OpenAFS-devel] Re: [OpenAFS] namei interface lockf buggy on Solaris (and probably HP-UX and AIX)

Robert Banz banz@umbc.edu
Wed, 13 Sep 2006 16:37:56 -0400


Here's my take on the lockf stuff switching to fcntl locking...  Only  
bothered to emulate F_LOCK & F_ULOCK because, well, that's all  
namei_ops uses.  I've tested it on sunx86_510, it seems to be doing  
it's thing.

BTW, it's really interesting to peek at the OpenAFS fileserver with  
some of the dtrace tools.  It's *very* fdsync happy, and seems to  
spend a lot of time/resources syncing buffers to disk -- I wonder if  
we could seriously increase performance here and let the OS write- 
cache actually be one...

-rob

*** openafs-1.4.1/src/vol/namei_ops.c   Tue Nov  1 11:45:44 2005
--- openafs-1.4.1rb/src/vol/namei_ops.c Tue Sep 12 11:50:32 2006
***************
*** 149,154 ****
--- 149,183 ----
       int ogm_mode;
   } namei_ogm_t;

+ #if defined(AFS_AIX_ENV) || defined(AFS_SUN5_ENV) || defined 
(AFS_HPUX_ENV)
+ #include <fcntl.h>
+ #define lockf(a,b,c) fcntl_lockf_emulator(a,b,c)
+ int fcntl_lockf_emulator ( int fd, int function, off_t size ) {
+
+     struct flock fl;
+     int op;
+
+     fl.l_start = 0;
+     fl.l_len = size;
+     fl.l_pid = 0;
+     fl.l_whence = SEEK_SET;
+
+     if ( function == F_LOCK ) {
+       op = F_SETLK;
+       fl.l_type = F_WRLCK;
+     } else if ( function == F_ULOCK ) {
+       op = F_SETLK;
+       fl.l_type = F_UNLCK;
+     } else {
+       /* eek */
+       return -1;
+     }
+
+     return fcntl( fd, op, &fl );
+
+ }
+ #endif
+