summaryrefslogtreecommitdiffstats
path: root/source/smbd/oplock_linux.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2000-06-11 06:46:05 +0000
committerAndrew Tridgell <tridge@samba.org>2000-06-11 06:46:05 +0000
commitcc0e919fdcb116c8f9688a4f5d7803fc8d7f9588 (patch)
treeb3d11fb63a02d28448daf4b1a67cf999c2c20a92 /source/smbd/oplock_linux.c
parentafa98d511f70f455d599c3a36dd25e49fe74ac09 (diff)
downloadsamba-cc0e919fdcb116c8f9688a4f5d7803fc8d7f9588.tar.gz
samba-cc0e919fdcb116c8f9688a4f5d7803fc8d7f9588.tar.xz
samba-cc0e919fdcb116c8f9688a4f5d7803fc8d7f9588.zip
a better test for oplocks being enabled in this kernel
Diffstat (limited to 'source/smbd/oplock_linux.c')
-rw-r--r--source/smbd/oplock_linux.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/source/smbd/oplock_linux.c b/source/smbd/oplock_linux.c
index ae0a72d0f67..46290683d25 100644
--- a/source/smbd/oplock_linux.c
+++ b/source/smbd/oplock_linux.c
@@ -31,7 +31,6 @@ static unsigned signals_received;
static unsigned signals_processed;
static int fd_pending; /* the fd of the current pending SIGIO */
-
#ifndef F_SETLEASE
#define F_SETLEASE 1024
#endif
@@ -237,6 +236,19 @@ static BOOL linux_oplock_msg_waiting(fd_set *fds)
return signals_processed != signals_received;
}
+/****************************************************************************
+see if the kernel supports oplocks
+****************************************************************************/
+static BOOL linux_oplocks_available(void)
+{
+ int fd, ret;
+ fd = open("/dev/null", O_RDONLY);
+ if (fd == -1) return False; /* uggh! */
+ ret = fcntl(fd, F_GETLEASE, 0);
+ close(fd);
+ return ret == F_UNLCK;
+}
+
/****************************************************************************
setup kernel oplocks
@@ -246,6 +258,11 @@ struct kernel_oplocks *linux_init_kernel_oplocks(void)
static struct kernel_oplocks koplocks;
struct sigaction act;
+ if (!linux_oplocks_available()) {
+ DEBUG(3,("Linux kernel oplocks not available\n"));
+ return NULL;
+ }
+
act.sa_handler = NULL;
act.sa_sigaction = sigio_handler;
act.sa_flags = SA_SIGINFO;