s3:vfs use gpfs_lib_init
authorChristian Ambach <christian.ambach@de.ibm.com>
Mon, 21 Feb 2011 17:25:36 +0000 (18:25 +0100)
committerVolker Lendecke <vlendec@samba.org>
Tue, 26 Apr 2011 18:52:36 +0000 (20:52 +0200)
With newer GPFS releases, libgpfs contains a function
gpfs_lib_init(). It marks the pseudo-device the lib uses
as interface to the GPFS kernel module to not be to
destroyed after each call to GPFS.
This saves us some microseconds creating and removing the device
each time we do a call to libgpfs.

Autobuild-User: Volker Lendecke <vlendec@samba.org>
Autobuild-Date: Tue Apr 26 20:52:36 CEST 2011 on sn-devel-104

source3/modules/gpfs.c
source3/modules/vfs_gpfs.c
source3/modules/vfs_gpfs.h

index ef7709954833a8387e701c261e665d2d6ea2ac90..d690199e9b69799fbefcf4e8e523866bd2514e09 100644 (file)
@@ -40,6 +40,7 @@ static int (*gpfs_set_winattrs_path_fn)(char *pathname, int flags, struct gpfs_w
 static int (*gpfs_get_winattrs_path_fn)(char *pathname, struct gpfs_winattr *attrs);
 static int (*gpfs_get_winattrs_fn)(int fd, struct gpfs_winattr *attrs);
 static int (*gpfs_ftruncate_fn)(int fd, gpfs_off64_t length);
+static int (*gpfs_lib_init_fn)(int flags);
 
 bool set_gpfs_sharemode(files_struct *fsp, uint32 access_mask,
                        uint32 share_access)
@@ -189,6 +190,17 @@ int set_gpfs_winattrs(char *pathname,int flags,struct gpfs_winattr *attrs)
         return gpfs_set_winattrs_path_fn(pathname,flags, attrs);
 }
 
+void smbd_gpfs_lib_init()
+{
+       if (gpfs_lib_init_fn) {
+               int rc = gpfs_lib_init_fn(0);
+               DEBUG(10, ("gpfs_lib_init() finished with rc %d "
+                          "and errno %d\n", rc, errno));
+       } else {
+               DEBUG(10, ("libgpfs lacks gpfs_lib_init\n"));
+       }
+}
+
 static bool init_gpfs_function_lib(void *plibhandle_pointer,
                                   const char *libname,
                                   void *pfn_pointer, const char *fn_name)
@@ -251,6 +263,7 @@ void init_gpfs(void)
         init_gpfs_function(&gpfs_set_winattrs_path_fn,"gpfs_set_winattrs_path");
         init_gpfs_function(&gpfs_get_winattrs_fn,"gpfs_get_winattrs");
        init_gpfs_function(&gpfs_ftruncate_fn, "gpfs_ftruncate");
+        init_gpfs_function(&gpfs_lib_init_fn,"gpfs_lib_init");
 
        gpfs_getrealfilename = lp_parm_bool(-1, "gpfs", "getrealfilename",
                                            True);
@@ -311,6 +324,11 @@ int get_gpfs_winattrs(char *pathname,struct gpfs_winattr *attrs)
         return -1;
 }
 
+void smbd_gpfs_lib_init()
+{
+       return;
+}
+
 void init_gpfs(void)
 {
        return;
index c38d7c2337fc4f777aa6a219d2d855fafd71eed8..b8bc1b239bcaaafe3bdc1e3199f50af1de9f10ef 100644 (file)
@@ -1232,6 +1232,9 @@ int vfs_gpfs_connect(struct vfs_handle_struct *handle, const char *service,
                        const char *user)
 {
        struct gpfs_config_data *config;
+
+       smbd_gpfs_lib_init();
+
        int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
 
        if (ret < 0) {
index 46cfdfea0ac322b0bebe36deb8846cb6375563ba..8a314e1103d9f402dd380b11fb623df2d43fed1a 100644 (file)
@@ -36,3 +36,4 @@ int get_gpfs_winattrs(char * pathname,struct gpfs_winattr *attrs);
 int set_gpfs_winattrs(char * pathname,int flags,struct gpfs_winattr *attrs);
 int smbd_gpfs_ftruncate(int fd, gpfs_off64_t length);
 void init_gpfs(void);
+void smbd_gpfs_lib_init();