summaryrefslogtreecommitdiffstats
path: root/source/smbd/oplock.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2000-06-11 05:57:58 +0000
committerAndrew Tridgell <tridge@samba.org>2000-06-11 05:57:58 +0000
commitb28cc4163bc2faaa80c5782fc02c8f03c410cdeb (patch)
tree58a5eda9a58f43d9f6bad4f7037ee852f69bf00e /source/smbd/oplock.c
parent1871d4a3f64401f9a6f749ce26d1715e3bcdeac3 (diff)
downloadsamba-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.c9
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
}