diff options
author | Andrew Tridgell <tridge@samba.org> | 2000-06-11 05:57:58 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2000-06-11 05:57:58 +0000 |
commit | b28cc4163bc2faaa80c5782fc02c8f03c410cdeb (patch) | |
tree | 58a5eda9a58f43d9f6bad4f7037ee852f69bf00e /source/smbd/oplock.c | |
parent | 1871d4a3f64401f9a6f749ce26d1715e3bcdeac3 (diff) | |
download | samba-b28cc4163bc2faaa80c5782fc02c8f03c410cdeb.tar.gz samba-b28cc4163bc2faaa80c5782fc02c8f03c410cdeb.tar.xz samba-b28cc4163bc2faaa80c5782fc02c8f03c410cdeb.zip |
Linux kernel oplocks now seem to work, but need a _lot_ of testing
I had to modify sys_select() to not loop on EINTR. I added a wrapper
called sys_select_intr() which gives the old behaviour.
Diffstat (limited to 'source/smbd/oplock.c')
-rw-r--r-- | source/smbd/oplock.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/source/smbd/oplock.c b/source/smbd/oplock.c index 44a8e9b0716..5e63b4d4ff5 100644 --- a/source/smbd/oplock.c +++ b/source/smbd/oplock.c @@ -84,6 +84,13 @@ BOOL receive_local_message(fd_set *fds, char *buffer, int buffer_len, int timeou selrtn = sys_select(maxfd+1,fds,&to); + if (selrtn == -1 && errno == EINTR) { + /* could be a kernel oplock interrupt */ + if (koplocks && koplocks->msg_waiting(fds)) { + return koplocks->receive_message(fds, buffer, buffer_len); + } + } + /* Check if error */ if(selrtn == -1) { /* something is wrong. Maybe the socket is dead? */ @@ -1120,6 +1127,8 @@ address %lx. Error was %s\n", (long)htonl(INADDR_LOOPBACK), strerror(errno))); if (lp_kernel_oplocks()) { #if HAVE_KERNEL_OPLOCKS_IRIX koplocks = irix_init_kernel_oplocks(); +#elif HAVE_KERNEL_OPLOCKS_LINUX + koplocks = linux_init_kernel_oplocks(); #endif } |