[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Tue Aug 20 22:27:02 UTC 2019


The branch, master has been updated
       via  f42642e54e5 s3: VFS: Complete the replacement of SMB_VFS_LINK() -> SMB_VFS_LINKAT().
       via  fb75a3d5e98 s3: VFS: vfs_time_audit. Remove link_fn(). No longer used.
       via  1b2440107f5 s3: VFS: vfs_full_audit. Remove link_fn(). No longer used.
       via  d31d52f16d1 s3: VFS: vfs_unityed_media. Remove link_fn(). No longer used.
       via  295aa5bd24a s3: VFS: vfs_syncops. Remove link_fn(). No longer used.
       via  3c3e62b79ee s3: VFS: vfs_snapper. Remove link_fn(). No longer used.
       via  a5911429560 s3: VFS: vfs_shadow_copy2. Remove link_fn(). No longer used.
       via  38da902351b s3: VFS: vfs_media_harmony. Remove link_fn(). No longer used.
       via  751852ced40 s3: VFS: vfs_glusterfs. Remove link_fn(). No longer used.
       via  f9c3b0b3cf4 s3: VFS: vfs_ceph_snapshots. Remove link_fn(). No longer used.
       via  228423811c9 s3: VFS: vfs_ceph. Remove link_fn(). No longer used.
       via  45851ead18a s3: VFS: vfs_cap. Remove link_fn(). No longer used.
       via  ea637f002d0 s3: smbd: Make hardlink_internals() call SMB_VFS_LINKAT() instead of SMB_VFS_LINK()
       via  d4f3d6ce12b s3: torture: Change cmd_link to call SMB_VFS_LINKAT().
       via  6b6298b0239 s3: VFS: vfs_unityed_media. Implement linkat().
       via  a14d825a250 s3: VFS: vfs_time_audit. Implement linkat().
       via  571624b866d s3: VFS: vfs_syncops. Implement linkat().
       via  dad377dbe47 s3: VFS: vfs_snapper. Implement linkat().
       via  c55b43ba13a s3: VFS: vfs_shadow_copy2. Implement linkat().
       via  6e96b98f643 s3: VFS: vfs_media_harmony. Implement linkat().
       via  d75177454c5 s3: VFS: vfs_glusterfs. Implement linkat().
       via  8e563426063 s3: VFS: vfs_full_audit. Implement linkat().
       via  2f989023259 s3: VFS: vfs_ceph_snapshots. Implement linkat().
       via  7d2ba253ada s3: VFS: vfs_ceph. Implement linkat().
       via  648e771a61d s3: VFS: vfs_cap. Implement linkat().
       via  6c3928e4e5b s3: VFS: Add SMB_VFS_LINKAT().
      from  098486da91b vfs_glusterfs: Enable profiling for file system operations

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


- Log -----------------------------------------------------------------
commit f42642e54e560f8a6328cbc035b0bbcfdffcf728
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:40:37 2019 -0700

    s3: VFS: Complete the replacement of SMB_VFS_LINK() -> SMB_VFS_LINKAT().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Tue Aug 20 22:26:17 UTC 2019 on sn-devel-184

commit fb75a3d5e98e2ae3210f4fc68f0fabbc27f09c18
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:29:11 2019 -0700

    s3: VFS: vfs_time_audit. Remove link_fn(). No longer used.
    
    NB, this will now fail smb_vfs_assert_all_fns()
    until we remove the rename_fn() from the VFS definitions.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 1b2440107f5e987cf6ffe2806d6516547b593fd8
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:21:42 2019 -0700

    s3: VFS: vfs_full_audit. Remove link_fn(). No longer used.
    
    NB, this will now fail smb_vfs_assert_all_fns()
    until we remove the rename_fn() from the VFS definitions.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit d31d52f16d1554c6fb2f9426a39461206d8eb53d
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:28:16 2019 -0700

    s3: VFS: vfs_unityed_media. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 295aa5bd24ac113913e0ec9f22c59c8f56ba3ddc
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:27:25 2019 -0700

    s3: VFS: vfs_syncops. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 3c3e62b79ee791209d3696d1d84641e6f3f99981
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:26:34 2019 -0700

    s3: VFS: vfs_snapper. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit a5911429560fad0585bdc5b9084ad77070abbf96
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:25:37 2019 -0700

    s3: VFS: vfs_shadow_copy2. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 38da902351b933bb6bb99e724e2f49987a8770d8
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:24:53 2019 -0700

    s3: VFS: vfs_media_harmony. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 751852ced401fa1b3a6fe6c30bc89a23c342def0
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:24:38 2019 -0700

    s3: VFS: vfs_glusterfs. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit f9c3b0b3cf43ee08abd001f48307dbb7a332870f
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:21:04 2019 -0700

    s3: VFS: vfs_ceph_snapshots. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 228423811c97d4ee99df924699ae4c003df3e2f9
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:19:22 2019 -0700

    s3: VFS: vfs_ceph. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 45851ead18ab687218648237e8651887e4d809fa
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:18:34 2019 -0700

    s3: VFS: vfs_cap. Remove link_fn(). No longer used.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit ea637f002d0b0e30c29814fc6d8c137103deaa23
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:16:48 2019 -0700

    s3: smbd: Make hardlink_internals() call SMB_VFS_LINKAT() instead of SMB_VFS_LINK()
    
    Use conn->cwd_fsp as current src and dst fsp's.
    
    No logic change for now.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit d4f3d6ce12b2e2d504dcdbbb9b670ceff5cf3243
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:14:03 2019 -0700

    s3: torture: Change cmd_link to call SMB_VFS_LINKAT().
    
    Use conn->cwd_fsp as current src and dst fsp's.
    
    No logic change for now.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 6b6298b02392e30044efd9fbc236d9ffb8f1ec1a
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:08:22 2019 -0700

    s3: VFS: vfs_unityed_media. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit a14d825a2507726f54ac3b4249e10968a2e35bd0
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:05:55 2019 -0700

    s3: VFS: vfs_time_audit. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 571624b866d82bb1e9317c1f099049e0483bd1cc
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:04:02 2019 -0700

    s3: VFS: vfs_syncops. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit dad377dbe4795f110da35bb751f800d6658fa7c0
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 16:01:22 2019 -0700

    s3: VFS: vfs_snapper. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit c55b43ba13a162d07befc27361632cdf2ef8aeb2
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 15:59:27 2019 -0700

    s3: VFS: vfs_shadow_copy2. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 6e96b98f6436289d1804b6a2a767b411edeb291b
Author: Jeremy Allison <jra at samba.org>
Date:   Fri Aug 16 15:57:15 2019 -0700

    s3: VFS: vfs_media_harmony. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit d75177454c5612c7c68f637571f1bd3a3d34f220
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Aug 14 13:01:39 2019 -0700

    s3: VFS: vfs_glusterfs. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 8e5634260632654b82f99170518b1086a2d9b9f1
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Aug 14 11:45:35 2019 -0700

    s3: VFS: vfs_full_audit. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 2f989023259c92d3d5da7e0359a31f1a10c1dbb3
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Aug 14 11:38:23 2019 -0700

    s3: VFS: vfs_ceph_snapshots. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 7d2ba253adaa3c6a57bd7048498e91a1ee0db712
Author: Jeremy Allison <jra at samba.org>
Date:   Wed Aug 14 11:32:30 2019 -0700

    s3: VFS: vfs_ceph. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 648e771a61d2d327ed3fe0f3a4eb0837a714b280
Author: Jeremy Allison <jra at samba.org>
Date:   Tue Aug 13 14:59:05 2019 -0700

    s3: VFS: vfs_cap. Implement linkat().
    
    Currently identical to link().
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

commit 6c3928e4e5b724190843f75bec3e697af77a01a0
Author: Jeremy Allison <jra at samba.org>
Date:   Mon Aug 12 16:49:26 2019 -0700

    s3: VFS: Add SMB_VFS_LINKAT().
    
    Currently identical to SMB_VFS_LINK().
    
    Next, move add to all VFS modules that implement
    link and eventually remove link.
    
    Signed-off-by: Jeremy Allison <jra at samba.org>
    Reviewed-by: Ralph Böhme <slow at samba.org>

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

Summary of changes:
 examples/VFS/skel_opaque.c            |  9 ++++++---
 examples/VFS/skel_transparent.c       | 16 ++++++++++++----
 source3/include/smbprofile.h          |  2 +-
 source3/include/vfs.h                 | 24 +++++++++++++++++-------
 source3/include/vfs_macros.h          |  8 ++++----
 source3/modules/vfs_cap.c             | 18 +++++++++++++-----
 source3/modules/vfs_ceph.c            | 13 ++++++++++---
 source3/modules/vfs_ceph_snapshots.c  | 16 ++++++++++++----
 source3/modules/vfs_default.c         | 24 ++++++++++++++++++------
 source3/modules/vfs_full_audit.c      | 20 +++++++++++++++-----
 source3/modules/vfs_glusterfs.c       | 17 ++++++++++++-----
 source3/modules/vfs_media_harmony.c   | 26 +++++++++++++++++++-------
 source3/modules/vfs_not_implemented.c | 11 +++++++----
 source3/modules/vfs_shadow_copy2.c    | 16 ++++++++++++----
 source3/modules/vfs_snapper.c         | 16 ++++++++++++----
 source3/modules/vfs_syncops.c         | 21 +++++++++++++++++----
 source3/modules/vfs_time_audit.c      | 19 ++++++++++++++-----
 source3/modules/vfs_unityed_media.c   | 27 ++++++++++++++++++++-------
 source3/smbd/trans2.c                 | 10 +++++++++-
 source3/smbd/vfs.c                    | 16 ++++++++++++----
 source3/torture/cmd_vfs.c             |  9 ++++++++-
 21 files changed, 250 insertions(+), 88 deletions(-)


Changeset truncated at 500 lines:

diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c
index 40e16c342ef..8de97e85147 100644
--- a/examples/VFS/skel_opaque.c
+++ b/examples/VFS/skel_opaque.c
@@ -473,9 +473,12 @@ static int skel_vfs_readlink(vfs_handle_struct *handle,
 	return -1;
 }
 
-static int skel_link(vfs_handle_struct *handle,
+static int skel_linkat(vfs_handle_struct *handle,
+			files_struct *srcfsp,
 			const struct smb_filename *old_smb_fname,
-			const struct smb_filename *new_smb_fname)
+			files_struct *dstfsp,
+			const struct smb_filename *new_smb_fname,
+			int flags)
 {
 	errno = ENOSYS;
 	return -1;
@@ -1086,7 +1089,7 @@ static struct vfs_fn_pointers skel_opaque_fns = {
 	.getlock_fn = skel_getlock,
 	.symlink_fn = skel_symlink,
 	.readlink_fn = skel_vfs_readlink,
-	.link_fn = skel_link,
+	.linkat_fn = skel_linkat,
 	.mknod_fn = skel_mknod,
 	.realpath_fn = skel_realpath,
 	.chflags_fn = skel_chflags,
diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c
index b5d44377463..015f72c1549 100644
--- a/examples/VFS/skel_transparent.c
+++ b/examples/VFS/skel_transparent.c
@@ -571,11 +571,19 @@ static int skel_vfs_readlink(vfs_handle_struct *handle,
 	return SMB_VFS_NEXT_READLINK(handle, smb_fname, buf, bufsiz);
 }
 
-static int skel_link(vfs_handle_struct *handle,
+static int skel_linkat(vfs_handle_struct *handle,
+			files_struct *srcfsp,
 			const struct smb_filename *old_smb_fname,
-			const struct smb_filename *new_smb_fname)
+			files_struct *dstfsp,
+			const struct smb_filename *new_smb_fname,
+			int flags)
 {
-	return SMB_VFS_NEXT_LINK(handle, old_smb_fname, new_smb_fname);
+	return SMB_VFS_NEXT_LINKAT(handle,
+			srcfsp,
+			old_smb_fname,
+			dstfsp,
+			new_smb_fname,
+			flags);
 }
 
 static int skel_mknod(vfs_handle_struct *handle,
@@ -1352,7 +1360,7 @@ static struct vfs_fn_pointers skel_transparent_fns = {
 	.getlock_fn = skel_getlock,
 	.symlink_fn = skel_symlink,
 	.readlink_fn = skel_vfs_readlink,
-	.link_fn = skel_link,
+	.linkat_fn = skel_linkat,
 	.mknod_fn = skel_mknod,
 	.realpath_fn = skel_realpath,
 	.chflags_fn = skel_chflags,
diff --git a/source3/include/smbprofile.h b/source3/include/smbprofile.h
index c479c76d508..4568b19bfda 100644
--- a/source3/include/smbprofile.h
+++ b/source3/include/smbprofile.h
@@ -84,7 +84,7 @@ struct tevent_context;
 	SMBPROFILE_STATS_BASIC(syscall_fcntl_getlock) \
 	SMBPROFILE_STATS_BASIC(syscall_readlink) \
 	SMBPROFILE_STATS_BASIC(syscall_symlink) \
-	SMBPROFILE_STATS_BASIC(syscall_link) \
+	SMBPROFILE_STATS_BASIC(syscall_linkat) \
 	SMBPROFILE_STATS_BASIC(syscall_mknod) \
 	SMBPROFILE_STATS_BASIC(syscall_realpath) \
 	SMBPROFILE_STATS_BASIC(syscall_get_quota) \
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index dc407772079..c91b4a3789a 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -273,6 +273,7 @@
 /* Version 42 - Remove share_access member from struct files_struct */
 /* Version 42 - Make "lease" a const* in create_file_fn */
 /* Version 42 - Move SMB_VFS_RENAME -> SMB_VFS_RENAMEAT */
+/* Version 42 - Move SMB_VFS_LINK -> SMB_VFS_LINKAT. */
 
 #define SMB_VFS_INTERFACE_VERSION 42
 
@@ -799,9 +800,12 @@ struct vfs_fn_pointers {
 				const struct smb_filename *smb_fname,
 				char *buf,
 				size_t bufsiz);
-	int (*link_fn)(struct vfs_handle_struct *handle,
+	int (*linkat_fn)(struct vfs_handle_struct *handle,
+				struct files_struct *srcfsp,
 				const struct smb_filename *old_smb_fname,
-				const struct smb_filename *new_smb_fname);
+				struct files_struct *dstfsp,
+				const struct smb_filename *new_smb_fname,
+				int flags);
 	int (*mknod_fn)(struct vfs_handle_struct *handle,
 				const struct smb_filename *smb_fname,
 				mode_t mode,
@@ -1328,9 +1332,12 @@ int smb_vfs_call_readlink(struct vfs_handle_struct *handle,
 			const struct smb_filename *smb_fname,
 			char *buf,
 			size_t bufsiz);
-int smb_vfs_call_link(struct vfs_handle_struct *handle,
+int smb_vfs_call_linkat(struct vfs_handle_struct *handle,
+			struct files_struct *srcfsp,
 			const struct smb_filename *old_smb_fname,
-			const struct smb_filename *new_smb_fname);
+			struct files_struct *dstfsp,
+			const struct smb_filename *new_smb_fname,
+			int flags);
 int smb_vfs_call_mknod(struct vfs_handle_struct *handle,
 			const struct smb_filename *smb_fname,
 			mode_t mode,
@@ -1754,9 +1761,12 @@ int vfs_not_implemented_vfs_readlink(vfs_handle_struct *handle,
 				     const struct smb_filename *smb_fname,
 				     char *buf,
 				     size_t bufsiz);
-int vfs_not_implemented_link(vfs_handle_struct *handle,
-			     const struct smb_filename *old_smb_fname,
-			     const struct smb_filename *new_smb_fname);
+int vfs_not_implemented_linkat(vfs_handle_struct *handle,
+			struct files_struct *srcfsp,
+			const struct smb_filename *old_smb_fname,
+			struct files_struct *dstfsp,
+			const struct smb_filename *new_smb_fname,
+			int flags);
 int vfs_not_implemented_mknod(vfs_handle_struct *handle,
 			      const struct smb_filename *smb_fname,
 			      mode_t mode,
diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index 7bbdc97a6c6..1a90c74d775 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -306,10 +306,10 @@
 #define SMB_VFS_NEXT_READLINK(handle, smb_fname, buf, bufsiz) \
 	smb_vfs_call_readlink((handle)->next, (smb_fname), (buf), (bufsiz))
 
-#define SMB_VFS_LINK(conn, oldpath, newpath) \
-	smb_vfs_call_link((conn)->vfs_handles, (oldpath), (newpath))
-#define SMB_VFS_NEXT_LINK(handle, oldpath, newpath) \
-	smb_vfs_call_link((handle)->next, (oldpath), (newpath))
+#define SMB_VFS_LINKAT(conn, srcfsp, oldpath, dstfsp, newpath, flags) \
+	smb_vfs_call_linkat((conn)->vfs_handles, (srcfsp), (oldpath), (dstfsp), (newpath), (flags))
+#define SMB_VFS_NEXT_LINKAT(handle, srcfsp, oldpath, dstfsp, newpath, flags) \
+	smb_vfs_call_linkat((handle)->next, (srcfsp), (oldpath), (dstfsp), (newpath), (flags))
 
 #define SMB_VFS_MKNOD(conn, smb_fname, mode, dev) \
 	smb_vfs_call_mknod((conn)->vfs_handles, (smb_fname), (mode), (dev))
diff --git a/source3/modules/vfs_cap.c b/source3/modules/vfs_cap.c
index ee48e542930..05c5426919c 100644
--- a/source3/modules/vfs_cap.c
+++ b/source3/modules/vfs_cap.c
@@ -585,9 +585,12 @@ static int cap_readlink(vfs_handle_struct *handle,
 	return ret;
 }
 
-static int cap_link(vfs_handle_struct *handle,
-			const struct smb_filename *old_smb_fname,
-			const struct smb_filename *new_smb_fname)
+static int cap_linkat(vfs_handle_struct *handle,
+		files_struct *srcfsp,
+		const struct smb_filename *old_smb_fname,
+		files_struct *dstfsp,
+		const struct smb_filename *new_smb_fname,
+		int flags)
 {
 	char *capold = capencode(talloc_tos(), old_smb_fname->base_name);
 	char *capnew = capencode(talloc_tos(), new_smb_fname->base_name);
@@ -623,7 +626,12 @@ static int cap_link(vfs_handle_struct *handle,
 		errno = ENOMEM;
 		return -1;
 	}
-	ret = SMB_VFS_NEXT_LINK(handle, old_cap_smb_fname, new_cap_smb_fname);
+	ret = SMB_VFS_NEXT_LINKAT(handle,
+			srcfsp,
+			old_cap_smb_fname,
+			dstfsp,
+			new_cap_smb_fname,
+			flags);
 	if (ret == -1) {
 		saved_errno = errno;
 	}
@@ -1026,7 +1034,7 @@ static struct vfs_fn_pointers vfs_cap_fns = {
 	.ntimes_fn = cap_ntimes,
 	.symlink_fn = cap_symlink,
 	.readlink_fn = cap_readlink,
-	.link_fn = cap_link,
+	.linkat_fn = cap_linkat,
 	.mknod_fn = cap_mknod,
 	.realpath_fn = cap_realpath,
 	.sys_acl_get_file_fn = cap_sys_acl_get_file,
diff --git a/source3/modules/vfs_ceph.c b/source3/modules/vfs_ceph.c
index 0a181327d27..93d5801136d 100644
--- a/source3/modules/vfs_ceph.c
+++ b/source3/modules/vfs_ceph.c
@@ -1156,14 +1156,21 @@ static int cephwrap_readlink(struct vfs_handle_struct *handle,
 	WRAP_RETURN(result);
 }
 
-static int cephwrap_link(struct vfs_handle_struct *handle,
+static int cephwrap_linkat(struct vfs_handle_struct *handle,
+		files_struct *srcfsp,
 		const struct smb_filename *old_smb_fname,
-		const struct smb_filename *new_smb_fname)
+		files_struct *dstfsp,
+		const struct smb_filename *new_smb_fname,
+		int flags)
 {
 	int result = -1;
 	DBG_DEBUG("[CEPH] link(%p, %s, %s)\n", handle,
 			old_smb_fname->base_name,
 			new_smb_fname->base_name);
+
+	SMB_ASSERT(srcfsp == srcfsp->conn->cwd_fsp);
+	SMB_ASSERT(dstfsp == dstfsp->conn->cwd_fsp);
+
 	result = ceph_link(handle->data,
 				old_smb_fname->base_name,
 				new_smb_fname->base_name);
@@ -1451,7 +1458,7 @@ static struct vfs_fn_pointers ceph_fns = {
 	.getlock_fn = cephwrap_getlock,
 	.symlink_fn = cephwrap_symlink,
 	.readlink_fn = cephwrap_readlink,
-	.link_fn = cephwrap_link,
+	.linkat_fn = cephwrap_linkat,
 	.mknod_fn = cephwrap_mknod,
 	.realpath_fn = cephwrap_realpath,
 	.chflags_fn = cephwrap_chflags,
diff --git a/source3/modules/vfs_ceph_snapshots.c b/source3/modules/vfs_ceph_snapshots.c
index 5b4296f0caf..2911907adb0 100644
--- a/source3/modules/vfs_ceph_snapshots.c
+++ b/source3/modules/vfs_ceph_snapshots.c
@@ -826,9 +826,12 @@ static int ceph_snap_gmt_symlink(vfs_handle_struct *handle,
 	return SMB_VFS_NEXT_SYMLINK(handle, link_contents, new_smb_fname);
 }
 
-static int ceph_snap_gmt_link(vfs_handle_struct *handle,
+static int ceph_snap_gmt_linkat(vfs_handle_struct *handle,
+				files_struct *srcfsp,
 				const struct smb_filename *old_smb_fname,
-				const struct smb_filename *new_smb_fname)
+				files_struct *dstfsp,
+				const struct smb_filename *new_smb_fname,
+				int flags)
 {
 	int ret;
 	time_t timestamp_old = 0;
@@ -854,7 +857,12 @@ static int ceph_snap_gmt_link(vfs_handle_struct *handle,
 		errno = EROFS;
 		return -1;
 	}
-	return SMB_VFS_NEXT_LINK(handle, old_smb_fname, new_smb_fname);
+	return SMB_VFS_NEXT_LINKAT(handle,
+			srcfsp,
+			old_smb_fname,
+			dstfsp,
+			new_smb_fname,
+			flags);
 }
 
 static int ceph_snap_gmt_stat(vfs_handle_struct *handle,
@@ -1601,7 +1609,7 @@ static struct vfs_fn_pointers ceph_snap_fns = {
 	.disk_free_fn = ceph_snap_gmt_disk_free,
 	.get_quota_fn = ceph_snap_gmt_get_quota,
 	.renameat_fn = ceph_snap_gmt_renameat,
-	.link_fn = ceph_snap_gmt_link,
+	.linkat_fn = ceph_snap_gmt_linkat,
 	.symlink_fn = ceph_snap_gmt_symlink,
 	.stat_fn = ceph_snap_gmt_stat,
 	.lstat_fn = ceph_snap_gmt_lstat,
diff --git a/source3/modules/vfs_default.c b/source3/modules/vfs_default.c
index a2b6bf6e669..6de217eca9c 100644
--- a/source3/modules/vfs_default.c
+++ b/source3/modules/vfs_default.c
@@ -2663,15 +2663,27 @@ static int vfswrap_readlink(vfs_handle_struct *handle,
 	return result;
 }
 
-static int vfswrap_link(vfs_handle_struct *handle,
+static int vfswrap_linkat(vfs_handle_struct *handle,
+			files_struct *srcfsp,
 			const struct smb_filename *old_smb_fname,
-			const struct smb_filename *new_smb_fname)
+			files_struct *dstfsp,
+			const struct smb_filename *new_smb_fname,
+			int flags)
 {
 	int result;
 
-	START_PROFILE(syscall_link);
-	result = link(old_smb_fname->base_name, new_smb_fname->base_name);
-	END_PROFILE(syscall_link);
+	START_PROFILE(syscall_linkat);
+
+	SMB_ASSERT(srcfsp == srcfsp->conn->cwd_fsp);
+	SMB_ASSERT(dstfsp == dstfsp->conn->cwd_fsp);
+
+	result = linkat(srcfsp->fh->fd,
+			old_smb_fname->base_name,
+			dstfsp->fh->fd,
+			new_smb_fname->base_name,
+			flags);
+
+	END_PROFILE(syscall_linkat);
 	return result;
 }
 
@@ -3467,7 +3479,7 @@ static struct vfs_fn_pointers vfs_default_fns = {
 	.getlock_fn = vfswrap_getlock,
 	.symlink_fn = vfswrap_symlink,
 	.readlink_fn = vfswrap_readlink,
-	.link_fn = vfswrap_link,
+	.linkat_fn = vfswrap_linkat,
 	.mknod_fn = vfswrap_mknod,
 	.realpath_fn = vfswrap_realpath,
 	.chflags_fn = vfswrap_chflags,
diff --git a/source3/modules/vfs_full_audit.c b/source3/modules/vfs_full_audit.c
index e9e9e132b0a..836d4de8b4e 100644
--- a/source3/modules/vfs_full_audit.c
+++ b/source3/modules/vfs_full_audit.c
@@ -154,6 +154,7 @@ typedef enum _vfs_op_type {
 	SMB_VFS_OP_SYMLINK,
 	SMB_VFS_OP_READLINK,
 	SMB_VFS_OP_LINK,
+	SMB_VFS_OP_LINKAT,
 	SMB_VFS_OP_MKNOD,
 	SMB_VFS_OP_REALPATH,
 	SMB_VFS_OP_CHFLAGS,
@@ -297,6 +298,7 @@ static struct {
 	{ SMB_VFS_OP_SYMLINK,	"symlink" },
 	{ SMB_VFS_OP_READLINK,	"readlink" },
 	{ SMB_VFS_OP_LINK,	"link" },
+	{ SMB_VFS_OP_LINKAT,	"linkat" },
 	{ SMB_VFS_OP_MKNOD,	"mknod" },
 	{ SMB_VFS_OP_REALPATH,	"realpath" },
 	{ SMB_VFS_OP_CHFLAGS,	"chflags" },
@@ -1754,15 +1756,23 @@ static int smb_full_audit_readlink(vfs_handle_struct *handle,
 	return result;
 }
 
-static int smb_full_audit_link(vfs_handle_struct *handle,
+static int smb_full_audit_linkat(vfs_handle_struct *handle,
+			files_struct *srcfsp,
 			const struct smb_filename *old_smb_fname,
-			const struct smb_filename *new_smb_fname)
+			files_struct *dstfsp,
+			const struct smb_filename *new_smb_fname,
+			int flags)
 {
 	int result;
 
-	result = SMB_VFS_NEXT_LINK(handle, old_smb_fname, new_smb_fname);
+	result = SMB_VFS_NEXT_LINKAT(handle,
+			srcfsp,
+			old_smb_fname,
+			dstfsp,
+			new_smb_fname,
+			flags);
 
-	do_log(SMB_VFS_OP_LINK, (result >= 0), handle,
+	do_log(SMB_VFS_OP_LINKAT, (result >= 0), handle,
 	       "%s|%s", old_smb_fname->base_name, new_smb_fname->base_name);
 
 	return result;
@@ -2876,7 +2886,7 @@ static struct vfs_fn_pointers vfs_full_audit_fns = {
 	.getlock_fn = smb_full_audit_getlock,
 	.symlink_fn = smb_full_audit_symlink,
 	.readlink_fn = smb_full_audit_readlink,
-	.link_fn = smb_full_audit_link,
+	.linkat_fn = smb_full_audit_linkat,
 	.mknod_fn = smb_full_audit_mknod,
 	.realpath_fn = smb_full_audit_realpath,
 	.chflags_fn = smb_full_audit_chflags,
diff --git a/source3/modules/vfs_glusterfs.c b/source3/modules/vfs_glusterfs.c
index fd60926d815..09299bc70c5 100644
--- a/source3/modules/vfs_glusterfs.c
+++ b/source3/modules/vfs_glusterfs.c
@@ -1661,17 +1661,24 @@ static int vfs_gluster_readlink(struct vfs_handle_struct *handle,
 	return ret;
 }
 
-static int vfs_gluster_link(struct vfs_handle_struct *handle,
+static int vfs_gluster_linkat(struct vfs_handle_struct *handle,
+				files_struct *srcfsp,
 				const struct smb_filename *old_smb_fname,
-				const struct smb_filename *new_smb_fname)
+				files_struct *dstfsp,
+				const struct smb_filename *new_smb_fname,
+				int flags)
 {
 	int ret;
 
-	START_PROFILE(syscall_link);
+	START_PROFILE(syscall_linkat);
+
+	SMB_ASSERT(srcfsp == srcfsp->conn->cwd_fsp);
+	SMB_ASSERT(dstfsp == dstfsp->conn->cwd_fsp);
+
 	ret = glfs_link(handle->data,
 			old_smb_fname->base_name,
 			new_smb_fname->base_name);
-	END_PROFILE(syscall_link);
+	END_PROFILE(syscall_linkat);
 
 	return ret;
 }
@@ -1897,7 +1904,7 @@ static struct vfs_fn_pointers glusterfs_fns = {
 	.getlock_fn = vfs_gluster_getlock,
 	.symlink_fn = vfs_gluster_symlink,
 	.readlink_fn = vfs_gluster_readlink,
-	.link_fn = vfs_gluster_link,
+	.linkat_fn = vfs_gluster_linkat,
 	.mknod_fn = vfs_gluster_mknod,
 	.realpath_fn = vfs_gluster_realpath,
 	.chflags_fn = vfs_gluster_chflags,
diff --git a/source3/modules/vfs_media_harmony.c b/source3/modules/vfs_media_harmony.c
index 7333236497d..d6a8de2d2cc 100644
--- a/source3/modules/vfs_media_harmony.c
+++ b/source3/modules/vfs_media_harmony.c
@@ -1785,20 +1785,26 @@ out:
  * Success: return 0
  * Failure: set errno, return -1
  */
-static int mh_link(vfs_handle_struct *handle,
+static int mh_linkat(vfs_handle_struct *handle,
+		files_struct *srcfsp,
 		const struct smb_filename *old_smb_fname,
-		const struct smb_filename *new_smb_fname)
+		files_struct *dstfsp,
+		const struct smb_filename *new_smb_fname,
+		int flags)
 {
 	int status;
 	struct smb_filename *oldclientFname = NULL;
 	struct smb_filename *newclientFname = NULL;
 
-	DEBUG(MH_INFO_DEBUG, ("Entering mh_link\n"));
+	DEBUG(MH_INFO_DEBUG, ("Entering mh_linkat\n"));
 	if (!is_in_media_files(old_smb_fname->base_name) &&
 			!is_in_media_files(new_smb_fname->base_name)) {
-		status = SMB_VFS_NEXT_LINK(handle,
+		status = SMB_VFS_NEXT_LINKAT(handle,
+				srcfsp,
 				old_smb_fname,
-				new_smb_fname);
+				dstfsp,
+				new_smb_fname,
+				flags);
 		goto out;
 	}
 
@@ -1813,7 +1819,13 @@ static int mh_link(vfs_handle_struct *handle,
 		goto err;
 	}
 
-	status = SMB_VFS_NEXT_LINK(handle, oldclientFname, newclientFname);
+	status = SMB_VFS_NEXT_LINKAT(handle,
+				srcfsp,
+				oldclientFname,
+				dstfsp,
+				newclientFname,
+				flags);
+
 err:
 	TALLOC_FREE(newclientFname);
 	TALLOC_FREE(oldclientFname);
@@ -2301,7 +2313,7 @@ static struct vfs_fn_pointers vfs_mh_fns = {
 	.ntimes_fn = mh_ntimes,
 	.symlink_fn = mh_symlink,
 	.readlink_fn = mh_readlink,
-	.link_fn = mh_link,
+	.linkat_fn = mh_linkat,
 	.mknod_fn = mh_mknod,
 	.realpath_fn = mh_realpath,
 	.chflags_fn = mh_chflags,
diff --git a/source3/modules/vfs_not_implemented.c b/source3/modules/vfs_not_implemented.c
index 0a88f9e08cb..9a6847e83e0 100644
--- a/source3/modules/vfs_not_implemented.c
+++ b/source3/modules/vfs_not_implemented.c
@@ -471,9 +471,12 @@ int vfs_not_implemented_vfs_readlink(vfs_handle_struct *handle,
 	return -1;
 }
 
-int vfs_not_implemented_link(vfs_handle_struct *handle,
-			     const struct smb_filename *old_smb_fname,
-			     const struct smb_filename *new_smb_fname)
+int vfs_not_implemented_linkat(vfs_handle_struct *handle,
+			files_struct *srcfsp,
+			const struct smb_filename *old_smb_fname,
+			files_struct *dstfsp,
+			const struct smb_filename *new_smb_fname,
+			int flags)
 {
 	errno = ENOSYS;


-- 
Samba Shared Repository



More information about the samba-cvs mailing list