The branch, master has been updated via e87d98c s3:vfs_gpfs:quieten an expectable warning message via 4a11be3 s3:vfs_gpfs: fix a compiler warning via 8ce9982 s3:vfs_gpfs:Fix query of creation time from GPFS via 318346a s3:vfs_gpfs: make "gpfs:getrealfilename" a per share option via 8ad2b6a s3:vfs_gpfs: make "gpfs:ftruncate" a per share option via 89a4f66 s3:vfs_gpfs: make "gpfs:winattr" a per share option via 2e95d80 s3:vfs_gpfs: be less verbose in get/set_xattr functions from f1db715 s3-smb2: Use the correct indicator if a request was deferred
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit e87d98c0fcf439a65031b072bebe0fed296cf59e Author: Christian Ambach <a...@samba.org> Date: Fri Feb 10 18:15:56 2012 +0100 s3:vfs_gpfs:quieten an expectable warning message Autobuild-User: Christian Ambach <a...@samba.org> Autobuild-Date: Fri Feb 10 20:14:12 CET 2012 on sn-devel-104 commit 4a11be3fb4d2cdcae323fc7932371eecca56b3cd Author: Christian Ambach <a...@samba.org> Date: Fri Feb 10 18:11:30 2012 +0100 s3:vfs_gpfs: fix a compiler warning commit 8ce9982be9dac71bbfc109e7f0c43aec94850c89 Author: Christof Schmitt <christof.schm...@us.ibm.com> Date: Tue Nov 29 13:23:29 2011 -0700 s3:vfs_gpfs:Fix query of creation time from GPFS Setting the creation time through SetFileTime on a GPFS file system and querying it with GetFileTime shows a mismatch. The vfs_gpfs module first retrieves the information from the operating system and the flag st_ex_calculated_birthtime is set to false. When vfs_gpfs retrieves the birthtime from GPFS the flag st_ex_calculated_birthtime has to be set to true. Otherwise the birth time will get overwritten by a call to update_stat_ex_mtime, reporting the wrong time to a client system. Signed-off-by: Christian Ambach <a...@samba.org> commit 318346a9373df9b16c436b8539362ff8d341960e Author: Stefan Metzmacher <me...@samba.org> Date: Thu Dec 22 15:54:41 2011 +0100 s3:vfs_gpfs: make "gpfs:getrealfilename" a per share option metze Signed-off-by: Christian Ambach <a...@samba.org> commit 8ad2b6a55e23922570659a4e4fb88e1b7d710772 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Dec 22 15:54:41 2011 +0100 s3:vfs_gpfs: make "gpfs:ftruncate" a per share option metze Signed-off-by: Christian Ambach <a...@samba.org> commit 89a4f66826a2e614bd782dcaff72ea3650229142 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Dec 22 14:36:55 2011 +0100 s3:vfs_gpfs: make "gpfs:winattr" a per share option metze Signed-off-by: Christian Ambach <a...@samba.org> commit 2e95d8048b9e9c7025ddada7ede15494e6016ba9 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Dec 22 14:20:32 2011 +0100 s3:vfs_gpfs: be less verbose in get/set_xattr functions metze Signed-off-by: Christian Ambach <a...@samba.org> ----------------------------------------------------------------------- Summary of changes: source3/modules/gpfs.c | 20 ++------ source3/modules/vfs_gpfs.c | 113 ++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 114 insertions(+), 19 deletions(-) Changeset truncated at 500 lines: diff --git a/source3/modules/gpfs.c b/source3/modules/gpfs.c index d73b94b..5ce2381 100644 --- a/source3/modules/gpfs.c +++ b/source3/modules/gpfs.c @@ -25,10 +25,6 @@ #include "gpfs_gpl.h" #include "vfs_gpfs.h" -static bool gpfs_getrealfilename; -static bool gpfs_winattr; -static bool gpfs_do_ftruncate; - 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); static int (*gpfs_getacl_fn)(char *pathname, int flags, void *acl); @@ -136,7 +132,7 @@ int smbd_gpfs_putacl(char *pathname, int flags, void *acl) int smbd_gpfs_ftruncate(int fd, gpfs_off64_t length) { - if (!gpfs_do_ftruncate || (gpfs_ftruncate_fn == NULL)) { + if (gpfs_ftruncate_fn == NULL) { errno = ENOSYS; return -1; } @@ -147,8 +143,7 @@ int smbd_gpfs_ftruncate(int fd, gpfs_off64_t length) int smbd_gpfs_get_realfilename_path(char *pathname, char *filenamep, int *buflen) { - if ((!gpfs_getrealfilename) - || (gpfs_get_realfilename_path_fn == NULL)) { + if (gpfs_get_realfilename_path_fn == NULL) { errno = ENOSYS; return -1; } @@ -159,7 +154,7 @@ int smbd_gpfs_get_realfilename_path(char *pathname, char *filenamep, int get_gpfs_winattrs(char *pathname,struct gpfs_winattr *attrs) { - if ((!gpfs_winattr) || (gpfs_get_winattrs_path_fn == NULL)) { + if (gpfs_get_winattrs_path_fn == NULL) { errno = ENOSYS; return -1; } @@ -170,7 +165,7 @@ int get_gpfs_winattrs(char *pathname,struct gpfs_winattr *attrs) int smbd_fget_gpfs_winattrs(int fd, struct gpfs_winattr *attrs) { - if ((!gpfs_winattr) || (gpfs_get_winattrs_fn == NULL)) { + if (gpfs_get_winattrs_fn == NULL) { errno = ENOSYS; return -1; } @@ -180,7 +175,7 @@ int smbd_fget_gpfs_winattrs(int fd, struct gpfs_winattr *attrs) int set_gpfs_winattrs(char *pathname,int flags,struct gpfs_winattr *attrs) { - if ((!gpfs_winattr) || (gpfs_set_winattrs_path_fn == NULL)) { + if (gpfs_set_winattrs_path_fn == NULL) { errno = ENOSYS; return -1; } @@ -264,10 +259,5 @@ void init_gpfs(void) 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); - gpfs_winattr = lp_parm_bool(-1, "gpfs", "winattr", False); - gpfs_do_ftruncate = lp_parm_bool(-1, "gpfs", "ftruncate", True); - return; } diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c index a588ed1..6a9d3d5 100644 --- a/source3/modules/vfs_gpfs.c +++ b/source3/modules/vfs_gpfs.c @@ -39,6 +39,9 @@ struct gpfs_config_data { bool leases; bool hsm; bool syncio; + bool winattr; + bool ftruncate; + bool getrealfilename; }; @@ -123,6 +126,16 @@ static int vfs_gpfs_get_real_filename(struct vfs_handle_struct *handle, char real_pathname[PATH_MAX+1]; int buflen; bool mangled; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); + + if (!config->getrealfilename) { + return SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, + mem_ctx, found_name); + } mangled = mangle_is_mangled(name, handle->conn->params); if (mangled) { @@ -946,12 +959,22 @@ static int gpfs_set_xattr(struct vfs_handle_struct *handle, const char *path, unsigned int dosmode=0; struct gpfs_winattr attrs; int ret = 0; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); + + if (!config->winattr) { + DEBUG(10, ("gpfs_set_xattr:name is %s -> next\n",name)); + return SMB_VFS_NEXT_SETXATTR(handle,path,name,value,size,flags); + } DEBUG(10, ("gpfs_set_xattr: %s \n",path)); /* Only handle DOS Attributes */ if (strcmp(name,SAMBA_XATTR_DOS_ATTRIB) != 0){ - DEBUG(1, ("gpfs_set_xattr:name is %s\n",name)); + DEBUG(5, ("gpfs_set_xattr:name is %s\n",name)); return SMB_VFS_NEXT_SETXATTR(handle,path,name,value,size,flags); } @@ -1022,12 +1045,22 @@ static ssize_t gpfs_get_xattr(struct vfs_handle_struct *handle, const char *pat unsigned int dosmode = 0; struct gpfs_winattr attrs; int ret = 0; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); + + if (!config->winattr) { + DEBUG(10, ("gpfs_get_xattr:name is %s -> next\n",name)); + return SMB_VFS_NEXT_GETXATTR(handle,path,name,value,size); + } DEBUG(10, ("gpfs_get_xattr: %s \n",path)); /* Only handle DOS Attributes */ if (strcmp(name,SAMBA_XATTR_DOS_ATTRIB) != 0){ - DEBUG(1, ("gpfs_get_xattr:name is %s\n",name)); + DEBUG(5, ("gpfs_get_xattr:name is %s\n",name)); return SMB_VFS_NEXT_GETXATTR(handle,path,name,value,size); } @@ -1075,11 +1108,21 @@ static int vfs_gpfs_stat(struct vfs_handle_struct *handle, char *fname = NULL; NTSTATUS status; int ret; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); ret = SMB_VFS_NEXT_STAT(handle, smb_fname); if (ret == -1) { return -1; } + + if (!config->winattr) { + return 0; + } + status = get_full_smb_filename(talloc_tos(), smb_fname, &fname); if (!NT_STATUS_IS_OK(status)) { errno = map_errno_from_nt_status(status); @@ -1088,6 +1131,7 @@ static int vfs_gpfs_stat(struct vfs_handle_struct *handle, ret = get_gpfs_winattrs(discard_const_p(char, fname), &attrs); TALLOC_FREE(fname); if (ret == 0) { + smb_fname->st.st_ex_calculated_birthtime = false; smb_fname->st.st_ex_btime.tv_sec = attrs.creationTime.tv_sec; smb_fname->st.st_ex_btime.tv_nsec = attrs.creationTime.tv_nsec; smb_fname->st.vfs_private = attrs.winAttrs; @@ -1100,6 +1144,11 @@ static int vfs_gpfs_fstat(struct vfs_handle_struct *handle, { struct gpfs_winattr attrs; int ret; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); ret = SMB_VFS_NEXT_FSTAT(handle, fsp, sbuf); if (ret == -1) { @@ -1108,8 +1157,13 @@ static int vfs_gpfs_fstat(struct vfs_handle_struct *handle, if ((fsp->fh == NULL) || (fsp->fh->fd == -1)) { return 0; } + if (!config->winattr) { + return 0; + } + ret = smbd_fget_gpfs_winattrs(fsp->fh->fd, &attrs); if (ret == 0) { + sbuf->st_ex_calculated_birthtime = false; sbuf->st_ex_btime.tv_sec = attrs.creationTime.tv_sec; sbuf->st_ex_btime.tv_nsec = attrs.creationTime.tv_nsec; } @@ -1123,11 +1177,20 @@ static int vfs_gpfs_lstat(struct vfs_handle_struct *handle, char *path = NULL; NTSTATUS status; int ret; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); ret = SMB_VFS_NEXT_LSTAT(handle, smb_fname); if (ret == -1) { return -1; } + if (!config->winattr) { + return 0; + } + status = get_full_smb_filename(talloc_tos(), smb_fname, &path); if (!NT_STATUS_IS_OK(status)) { errno = map_errno_from_nt_status(status); @@ -1136,6 +1199,7 @@ static int vfs_gpfs_lstat(struct vfs_handle_struct *handle, ret = get_gpfs_winattrs(discard_const_p(char, path), &attrs); TALLOC_FREE(path); if (ret == 0) { + smb_fname->st.st_ex_calculated_birthtime = false; smb_fname->st.st_ex_btime.tv_sec = attrs.creationTime.tv_sec; smb_fname->st.st_ex_btime.tv_nsec = attrs.creationTime.tv_nsec; smb_fname->st.vfs_private = attrs.winAttrs; @@ -1152,10 +1216,19 @@ static int vfs_gpfs_ntimes(struct vfs_handle_struct *handle, int ret; char *path = NULL; NTSTATUS status; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); ret = SMB_VFS_NEXT_NTIMES(handle, smb_fname, ft); if(ret == -1){ - DEBUG(1,("vfs_gpfs_ntimes: SMB_VFS_NEXT_NTIMES failed\n")); + /* don't complain if access was denied */ + if (errno != EPERM && errno != EACCES) { + DEBUG(1,("vfs_gpfs_ntimes: SMB_VFS_NEXT_NTIMES failed:" + "%s", strerror(errno))); + } return -1; } @@ -1164,6 +1237,10 @@ static int vfs_gpfs_ntimes(struct vfs_handle_struct *handle, return 0; } + if (!config->winattr) { + return 0; + } + status = get_full_smb_filename(talloc_tos(), smb_fname, &path); if (!NT_STATUS_IS_OK(status)) { errno = map_errno_from_nt_status(status); @@ -1188,6 +1265,15 @@ static int vfs_gpfs_ftruncate(vfs_handle_struct *handle, files_struct *fsp, SMB_OFF_T len) { int result; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); + + if (!config->ftruncate) { + return SMB_VFS_NEXT_FTRUNCATE(handle, fsp, len); + } result = smbd_gpfs_ftruncate(fsp->fh->fd, len); if ((result == -1) && (errno == ENOSYS)) { @@ -1203,6 +1289,15 @@ static bool vfs_gpfs_is_offline(struct vfs_handle_struct *handle, struct gpfs_winattr attrs; char *path = NULL; NTSTATUS status; + struct gpfs_config_data *config; + + SMB_VFS_HANDLE_GET_DATA(handle, config, + struct gpfs_config_data, + return -1); + + if (!config->winattr) { + return SMB_VFS_NEXT_IS_OFFLINE(handle, fname, sbuf); + } status = get_full_smb_filename(talloc_tos(), fname, &path); if (!NT_STATUS_IS_OK(status)) { @@ -1252,10 +1347,11 @@ int vfs_gpfs_connect(struct vfs_handle_struct *handle, const char *service, const char *user) { struct gpfs_config_data *config; + int ret; smbd_gpfs_lib_init(); - int ret = SMB_VFS_NEXT_CONNECT(handle, service, user); + ret = SMB_VFS_NEXT_CONNECT(handle, service, user); if (ret < 0) { return ret; @@ -1280,6 +1376,15 @@ int vfs_gpfs_connect(struct vfs_handle_struct *handle, const char *service, config->syncio = lp_parm_bool(SNUM(handle->conn), "gpfs", "syncio", false); + config->winattr = lp_parm_bool(SNUM(handle->conn), "gpfs", + "winattr", false); + + config->ftruncate = lp_parm_bool(SNUM(handle->conn), "gpfs", + "ftruncate", true); + + config->getrealfilename = lp_parm_bool(SNUM(handle->conn), "gpfs", + "getrealfilename", true); + SMB_VFS_HANDLE_SET_DATA(handle, config, NULL, struct gpfs_config_data, return -1); -- Samba Shared Repository