summaryrefslogtreecommitdiff
path: root/source3/smbd/oplock_linux.c
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2006-01-05 11:35:29 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:06:01 -0500
commita189257c15725e36e68970ed723f3365d4496792 (patch)
tree9b02968535257705af636aa43830fba00b68b82f /source3/smbd/oplock_linux.c
parentc3a2101da021abf52d06842598325a6cef6bbc83 (diff)
downloadsamba-a189257c15725e36e68970ed723f3365d4496792.tar.gz
samba-a189257c15725e36e68970ed723f3365d4496792.tar.bz2
samba-a189257c15725e36e68970ed723f3365d4496792.zip
r12721: GPFS 2.4 on Linux will contain some windows semantics, ie share modes and
oplocks across the cluster. Adapt Samba to it. The gpfs API is called via libgpfs.so. This code is written with dlopen(), so that you can compile on a system with gpfs installed and later on run on systems without gpfs available. So to actually make Samba call gpfs share mode calls you need to compile with gpfs.h and libgpfs.so around and set 'gpfs share = yes' on the shares you export from GPFS. Volker (This used to be commit 2253b17a1a88555291b59d52c826c81c2b8f7e7f)
Diffstat (limited to 'source3/smbd/oplock_linux.c')
-rw-r--r--source3/smbd/oplock_linux.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/source3/smbd/oplock_linux.c b/source3/smbd/oplock_linux.c
index ab0c08f7fc..0285bfce97 100644
--- a/source3/smbd/oplock_linux.c
+++ b/source3/smbd/oplock_linux.c
@@ -101,11 +101,11 @@ static void set_capability(unsigned capability)
}
/****************************************************************************
- Call SETLEASE. If we get EACCES then we try setting up the right capability and
- try again
+ Call SETLEASE. If we get EACCES then we try setting up the right capability
+ and try again
****************************************************************************/
-static int linux_setlease(int fd, int leasetype)
+static int linux_setlease(int snum, int fd, int leasetype)
{
int ret;
@@ -114,7 +114,17 @@ static int linux_setlease(int fd, int leasetype)
return -1;
}
- ret = fcntl(fd, F_SETLEASE, leasetype);
+ if (lp_gpfs_share(snum)) {
+ ret = set_gpfs_lease(fd, leasetype);
+ } else {
+ ret = fcntl(fd, F_SETLEASE, leasetype);
+ }
+
+ if ((ret < 0) && (errno == ENOSYS)) {
+ /* This must have come from GPFS not being available */
+ ret = fcntl(fd, F_SETLEASE, leasetype);
+ }
+
if (ret == -1 && errno == EACCES) {
set_capability(CAP_LEASE);
ret = fcntl(fd, F_SETLEASE, leasetype);
@@ -154,7 +164,7 @@ static files_struct *linux_oplock_receive_message(fd_set *fds)
static BOOL linux_set_kernel_oplock(files_struct *fsp, int oplock_type)
{
- if (linux_setlease(fsp->fh->fd, F_WRLCK) == -1) {
+ if (linux_setlease(SNUM(fsp->conn), fsp->fh->fd, F_WRLCK) == -1) {
DEBUG(3,("linux_set_kernel_oplock: Refused oplock on file %s, fd = %d, dev = %x, \
inode = %.0f. (%s)\n",
fsp->fsp_name, fsp->fh->fd,
@@ -188,7 +198,7 @@ oplock state of %x.\n", fsp->fsp_name, (unsigned int)fsp->dev,
/*
* Remove the kernel oplock on this file.
*/
- if (linux_setlease(fsp->fh->fd, F_UNLCK) == -1) {
+ if (linux_setlease(SNUM(fsp->conn), fsp->fh->fd, F_UNLCK) == -1) {
if (DEBUGLVL(0)) {
dbgtext("linux_release_kernel_oplock: Error when removing kernel oplock on file " );
dbgtext("%s, dev = %x, inode = %.0f, file_id = %lu. Error was %s\n",