Remove sys_dl*() - stubs are already provided by libreplace.
[ira/wip.git] / source3 / modules / gpfs.c
index d274984ec702e363577656a6a8cf8fbbe773bb9e..a0d33fa33a0c1919a0dcfe38691b2c1856f9b1b8 100644 (file)
@@ -5,7 +5,7 @@
  *
  *  This program is free software; you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation; either version 3 of the License, or
  *  (at your option) any later version.
  *  
  *  This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  *  GNU General Public License for more details.
  *  
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *  along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "includes.h"
 #ifdef HAVE_GPFS
 
 #include "gpfs_gpl.h"
+#include "vfs_gpfs.h"
 
 static void *libgpfs_handle = NULL;
-static BOOL gpfs_share_modes;
+static bool gpfs_share_modes;
+static bool gpfs_leases;
 
 static int (*gpfs_set_share_fn)(int fd, unsigned int allow, unsigned int deny);
 static int (*gpfs_set_lease_fn)(int fd, unsigned int leaseType);
@@ -33,7 +34,7 @@ static int (*gpfs_getacl_fn)(char *pathname, int flags, void *acl);
 static int (*gpfs_putacl_fn)(char *pathname, int flags, void *acl);
 
 
-BOOL set_gpfs_sharemode(files_struct *fsp, uint32 access_mask,
+bool set_gpfs_sharemode(files_struct *fsp, uint32 access_mask,
                        uint32 share_access)
 {
        unsigned int allow = GPFS_SHARE_NONE;
@@ -43,7 +44,7 @@ BOOL set_gpfs_sharemode(files_struct *fsp, uint32 access_mask,
        if (!gpfs_share_modes) {
                return True;
        }
-
+       
        if (gpfs_set_share_fn == NULL) {
                return False;
        }
@@ -89,7 +90,7 @@ int set_gpfs_lease(int fd, int leasetype)
 {
        int gpfs_type = GPFS_LEASE_NONE;
 
-       if (!gpfs_share_modes) {
+       if (!gpfs_leases) {
                return True;
        }
 
@@ -104,6 +105,13 @@ int set_gpfs_lease(int fd, int leasetype)
        if (leasetype == F_WRLCK) {
                gpfs_type = GPFS_LEASE_WRITE;
        }
+       
+       /* we unconditionally set CAP_LEASE, rather than looking for
+          -1/EACCES as there is a bug in some versions of
+          libgpfs_gpl.so which results in a leaked fd on /dev/ss0
+          each time we try this with the wrong capabilities set
+       */
+       linux_set_lease_capability();
        return gpfs_set_lease_fn(fd, gpfs_type);
 }
 
@@ -133,56 +141,53 @@ void init_gpfs(void)
                return;
        }
 
-       libgpfs_handle = sys_dlopen("libgpfs_gpl.so", RTLD_LAZY);
+       libgpfs_handle = dlopen("libgpfs_gpl.so", RTLD_LAZY);
 
        if (libgpfs_handle == NULL) {
-               DEBUG(10, ("sys_dlopen for libgpfs_gpl failed: %s\n",
+               DEBUG(10, ("dlopen for libgpfs_gpl failed: %s\n",
                           strerror(errno)));
                return;
        }
 
        DEBUG(10, ("libgpfs_gpl.so loaded\n"));
 
-       gpfs_set_share_fn = sys_dlsym(libgpfs_handle, "gpfs_set_share");
+       gpfs_set_share_fn = dlsym(libgpfs_handle, "gpfs_set_share");
        if (gpfs_set_share_fn == NULL) {
                DEBUG(3, ("libgpfs_gpl.so does not contain the symbol "
                          "'gpfs_set_share'\n"));
                goto failed;
        }
 
-       gpfs_set_lease_fn = sys_dlsym(libgpfs_handle, "gpfs_set_lease");
+       gpfs_set_lease_fn = dlsym(libgpfs_handle, "gpfs_set_lease");
        if (gpfs_set_lease_fn == NULL) {
                DEBUG(3, ("libgpfs_gpl.so does not contain the symbol "
                          "'gpfs_set_lease'\n"));
-               sys_dlclose(libgpfs_handle);
+               dlclose(libgpfs_handle);
 
                goto failed;
        }
 
-       gpfs_getacl_fn = sys_dlsym(libgpfs_handle, "gpfs_getacl");
+       gpfs_getacl_fn = dlsym(libgpfs_handle, "gpfs_getacl");
        if (gpfs_getacl_fn == NULL) {
                DEBUG(3, ("libgpfs_gpl.so does not contain the symbol "
                          "'gpfs_getacl'\n"));
                goto failed;
        }
 
-       gpfs_putacl_fn = sys_dlsym(libgpfs_handle, "gpfs_putacl");
+       gpfs_putacl_fn = dlsym(libgpfs_handle, "gpfs_putacl");
        if (gpfs_putacl_fn == NULL) {
                DEBUG(3, ("libgpfs_gpl.so does not contain the symbol "
                          "'gpfs_putacl'\n"));
                goto failed;
        }
 
-       if (lp_parm_bool(-1, "gpfs", "sharemodes", True)) {
-               gpfs_share_modes = True;
-       } else {
-               gpfs_share_modes = False;
-       }
+       gpfs_share_modes = lp_parm_bool(-1, "gpfs", "sharemodes", True);
+       gpfs_leases      = lp_parm_bool(-1, "gpfs", "leases", True);
 
        return;
 
 failed:
-       sys_dlclose(libgpfs_handle);
+       dlclose(libgpfs_handle);
        /* leave libgpfs_handle != NULL around, no point
           in trying twice */
        gpfs_set_share_fn = NULL;
@@ -203,7 +208,7 @@ int set_gpfs_lease(int snum, int leasetype)
        return -1;
 }
 
-BOOL set_gpfs_sharemode(files_struct *fsp, uint32 access_mask,
+bool set_gpfs_sharemode(files_struct *fsp, uint32 access_mask,
                        uint32 share_access)
 {
        DEBUG(0, ("VFS module - smbgpfs.so loaded, without gpfs support compiled\n"));