The branch, master has been updated
       via  2a8b21e vfs_gpfs: Avoid calling gpfs_is_offline on every i/o
       via  53a8cc7 vfs_gpfs: Introduce vfs_gpfs_fsp_is_offline
      from  0fb8ea7 winbind: Don't delete an existing krb5 ticket on cached 
logon.

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 2a8b21e5ae7e90f63c2fb87a7c747d8d1fc2c01e
Author: Volker Lendecke <v...@samba.org>
Date:   Wed Sep 2 13:20:08 2015 +0200

    vfs_gpfs: Avoid calling gpfs_is_offline on every i/o
    
    Asks gpfs as long as a file is offline. Once it was reported online once,
    we'll not ask anymore.  This assumes that while we have a file open it
    won't be migrated away. This might not *always* be true, but probably
    close enough. And as long as we don't have a proper notification mechanism
    and as long as polling is too expensive, this seems like a good strategy.
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Christof Schmitt <c...@samba.org>
    
    Autobuild-User(master): Christof Schmitt <c...@samba.org>
    Autobuild-Date(master): Sat Sep  5 01:50:09 CEST 2015 on sn-devel-104

commit 53a8cc7c0df37d68270a9e1877c14d40e96abf53
Author: Volker Lendecke <v...@samba.org>
Date:   Thu Sep 3 12:10:35 2015 +0200

    vfs_gpfs: Introduce vfs_gpfs_fsp_is_offline
    
    This consolidates a few common calls
    
    Signed-off-by: Volker Lendecke <v...@samba.org>
    Reviewed-by: Christof Schmitt <c...@samba.org>

-----------------------------------------------------------------------

Summary of changes:
 source3/modules/vfs_gpfs.c | 81 ++++++++++++++++++++++++++++++++++------------
 1 file changed, 61 insertions(+), 20 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c
index 3e593e1..ee4c1f6 100644
--- a/source3/modules/vfs_gpfs.c
+++ b/source3/modules/vfs_gpfs.c
@@ -54,6 +54,10 @@ struct gpfs_config_data {
        bool recalls;
 };
 
+struct gpfs_fsp_extension {
+       bool offline;
+};
+
 static inline unsigned int gpfs_acl_flags(gpfs_acl_t *gacl)
 {
        if (gacl->acl_level == GPFS_ACL_LEVEL_V4FLAGS) {
@@ -1955,18 +1959,42 @@ static bool vfs_gpfs_is_offline(struct 
vfs_handle_struct *handle,
        return SMB_VFS_NEXT_IS_OFFLINE(handle, fname, sbuf);
 }
 
+static bool vfs_gpfs_fsp_is_offline(struct vfs_handle_struct *handle,
+                                   struct files_struct *fsp)
+{
+       struct gpfs_fsp_extension *ext;
+
+       ext = VFS_FETCH_FSP_EXTENSION(handle, fsp);
+       if (ext == NULL) {
+               /*
+                * Something bad happened, always ask.
+                */
+               return vfs_gpfs_is_offline(handle, fsp->fsp_name,
+                                          &fsp->fsp_name->st);
+       }
+
+       if (ext->offline) {
+               /*
+                * As long as it's offline, ask.
+                */
+               ext->offline = vfs_gpfs_is_offline(handle, fsp->fsp_name,
+                                                  &fsp->fsp_name->st);
+       }
+
+       return ext->offline;
+}
+
 static bool vfs_gpfs_aio_force(struct vfs_handle_struct *handle,
                               struct files_struct *fsp)
 {
-       return vfs_gpfs_is_offline(handle, fsp->fsp_name, &fsp->fsp_name->st);
+       return vfs_gpfs_fsp_is_offline(handle, fsp);
 }
 
 static ssize_t vfs_gpfs_sendfile(vfs_handle_struct *handle, int tofd,
                                 files_struct *fsp, const DATA_BLOB *hdr,
                                 off_t offset, size_t n)
 {
-       if (SMB_VFS_IS_OFFLINE(handle->conn, fsp->fsp_name, &fsp->fsp_name->st))
-       {
+       if (vfs_gpfs_fsp_is_offline(handle, fsp)) {
                errno = ENOSYS;
                return -1;
        }
@@ -2202,25 +2230,42 @@ static int vfs_gpfs_open(struct vfs_handle_struct 
*handle,
                         int flags, mode_t mode)
 {
        struct gpfs_config_data *config;
+       int ret;
+       struct gpfs_fsp_extension *ext;
 
        SMB_VFS_HANDLE_GET_DATA(handle, config,
                                struct gpfs_config_data,
                                return -1);
 
-       if (config->hsm && !config->recalls) {
-               if (SMB_VFS_IS_OFFLINE(handle->conn, smb_fname, &smb_fname->st))
-               {
-                       DEBUG(10, ("Refusing access to offline file %s\n",
-                                 fsp_str_dbg(fsp)));
-                       errno = EACCES;
-                       return -1;
-               }
+       if (config->hsm && !config->recalls &&
+           vfs_gpfs_fsp_is_offline(handle, fsp)) {
+               DEBUG(10, ("Refusing access to offline file %s\n",
+                          fsp_str_dbg(fsp)));
+               errno = EACCES;
+               return -1;
        }
 
        if (config->syncio) {
                flags |= O_SYNC;
        }
-       return SMB_VFS_NEXT_OPEN(handle, smb_fname, fsp, flags, mode);
+
+       ext = VFS_ADD_FSP_EXTENSION(handle, fsp, struct gpfs_fsp_extension,
+                                   NULL);
+       if (ext == NULL) {
+               errno = ENOMEM;
+               return -1;
+       }
+
+       /*
+        * Assume the file is offline until gpfs tells us it's online.
+        */
+       *ext = (struct gpfs_fsp_extension) { .offline = true };
+
+       ret = SMB_VFS_NEXT_OPEN(handle, smb_fname, fsp, flags, mode);
+       if (ret == -1) {
+               VFS_REMOVE_FSP_EXTENSION(handle, fsp);
+       }
+       return ret;
 }
 
 static ssize_t vfs_gpfs_pread(vfs_handle_struct *handle, files_struct *fsp,
@@ -2229,8 +2274,7 @@ static ssize_t vfs_gpfs_pread(vfs_handle_struct *handle, 
files_struct *fsp,
        ssize_t ret;
        bool was_offline;
 
-       was_offline = SMB_VFS_IS_OFFLINE(handle->conn, fsp->fsp_name,
-                                        &fsp->fsp_name->st);
+       was_offline = vfs_gpfs_fsp_is_offline(handle, fsp);
 
        ret = SMB_VFS_NEXT_PREAD(handle, fsp, data, n, offset);
 
@@ -2266,8 +2310,7 @@ static struct tevent_req *vfs_gpfs_pread_send(struct 
vfs_handle_struct *handle,
        if (req == NULL) {
                return NULL;
        }
-       state->was_offline = SMB_VFS_IS_OFFLINE(handle->conn, fsp->fsp_name,
-                                               &fsp->fsp_name->st);
+       state->was_offline = vfs_gpfs_fsp_is_offline(handle, fsp);
        state->fsp = fsp;
        subreq = SMB_VFS_NEXT_PREAD_SEND(state, ev, handle, fsp, data,
                                         n, offset);
@@ -2317,8 +2360,7 @@ static ssize_t vfs_gpfs_pwrite(vfs_handle_struct *handle, 
files_struct *fsp,
        ssize_t ret;
        bool was_offline;
 
-       was_offline = SMB_VFS_IS_OFFLINE(handle->conn, fsp->fsp_name,
-                                        &fsp->fsp_name->st);
+       was_offline = vfs_gpfs_fsp_is_offline(handle, fsp);
 
        ret = SMB_VFS_NEXT_PWRITE(handle, fsp, data, n, offset);
 
@@ -2355,8 +2397,7 @@ static struct tevent_req *vfs_gpfs_pwrite_send(
        if (req == NULL) {
                return NULL;
        }
-       state->was_offline = SMB_VFS_IS_OFFLINE(handle->conn, fsp->fsp_name,
-                                               &fsp->fsp_name->st);
+       state->was_offline = vfs_gpfs_fsp_is_offline(handle, fsp);
        state->fsp = fsp;
        subreq = SMB_VFS_NEXT_PWRITE_SEND(state, ev, handle, fsp, data,
                                         n, offset);


-- 
Samba Shared Repository

Reply via email to