[SCM] Samba Shared Repository - branch master updated

Jeremy Allison jra at samba.org
Sat Jan 6 03:42:03 UTC 2018


The branch, master has been updated
       via  debf8ba vfs_fileid: add fileid:algorithm = fsname_norootdir
       via  1468dd2 vfs_fileid: add fileid:nolockinode parameter
       via  b599cb2 vfs_fileid: add fileid:algorithm = fsname_nodirs
       via  495c646 vfs_fileid: add fileid:algorithm = hostname
       via  6a8764e vfs_fileid: convert dev argument of the device_mapping_fn to SMB_STRUCT_STAT
       via  9962495 vfs_fileid: add "fstype/mntdir deny/allow list" option
       via  326df16 vfs_fileid: preserve errno in an error code path
       via  5cce620 vfs_fileid: add a DEBUG message to log dev and inode
       via  d0def3b tests: The pthreadpooltests do not need a full environment
       via  74dbeba dnscli: Make a few functions static
       via  361ea74 samba: Only use async signal-safe functions in signal handler
       via  e1fb902 s4/torture: test vfs_fruit "fruit:time machine max size" option
       via  74eebac vfs_fruit: add "time machine max size" option
      from  3cbeaf4 docs-xml: add basic Makefile dependencies for targets that use xsltproc

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


- Log -----------------------------------------------------------------
commit debf8ba799ea7a4535e29c20a5f9377932c81938
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jan 4 17:22:16 2018 +0100

    vfs_fileid: add fileid:algorithm = fsname_norootdir
    
    Based-on-a-patch-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>
    
    Autobuild-User(master): Jeremy Allison <jra at samba.org>
    Autobuild-Date(master): Sat Jan  6 04:41:24 CET 2018 on sn-devel-144

commit 1468dd21c37445cff044583229b107254d53b2b9
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jan 4 17:09:21 2018 +0100

    vfs_fileid: add fileid:nolockinode parameter
    
    Based-on-a-patch-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit b599cb216815415a63504ec69be3f70f08ea58d5
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jan 4 17:02:53 2018 +0100

    vfs_fileid: add fileid:algorithm = fsname_nodirs
    
    Enabling fileid:algorithm = fsname_nodirs uses the hostname algorithm
    for directories and thus breaks cluster lock coherence for directories.
    
    Based-on-a-patch-by: Christian Ambach <ambi at samba.org>
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 495c646ec5cbd61539f6c547cd6048d7ff167d30
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jan 4 16:59:54 2018 +0100

    vfs_fileid: add fileid:algorithm = hostname
    
    Using fileid:algorithm = hostname makes fileid generate
    fileids based on the hostname. This breaks cluster lock coherence.
    
    Based-on-a-patch-by: Christian Ambach <ambi at samba.org>
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 6a8764ebcc0de57e7dd0dc22eaf4a9d201c0dca9
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jan 4 16:35:38 2018 +0100

    vfs_fileid: convert dev argument of the device_mapping_fn to SMB_STRUCT_STAT
    
    This is in preperation of adding an additional mapping function that
    acts differently depending of the file type. No change in behaviour.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 996249571d0e8f9285d1b714b1c36d66e7649271
Author: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
Date:   Tue Jan 12 16:00:24 2016 +0100

    vfs_fileid: add "fstype/mntdir deny/allow list" option
    
    When using the fsname or fsid algorithm a stat() and statfs() call is
    required for all mounted file systems to generate the file_id. If e.g.
    an NFS file system is unresponsive such a call might block and the smbd
    process will become unresponsive. Add "fileid:fstype deny",
    "fileid:fstype allow", "fileid:mntdir deny", and "fileid:mntdir allow"
    options to ignore potentially unresponsive file systems.
    
    See also https://lists.samba.org/archive/samba-technical/2016-January/111553.html
    for a discussion about why this is useful.
    
    Signed-off-by: Ralph Wuerthner <ralph.wuerthner at de.ibm.com>
    Reviewed-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 326df161736abc16fb3bd35a18a3e55a44fb3c5d
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Jan 5 10:23:30 2018 +0100

    vfs_fileid: preserve errno in an error code path
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 5cce620bc1eac9a3f0bbf58084b7df2acde6bb15
Author: Ralph Boehme <slow at samba.org>
Date:   Thu Jan 4 17:25:07 2018 +0100

    vfs_fileid: add a DEBUG message to log dev and inode
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit d0def3b2179cfbfca6f35237f2bb23d226a72814
Author: Volker Lendecke <vl at samba.org>
Date:   Fri Jan 5 10:45:41 2018 +0100

    tests: The pthreadpooltests do not need a full environment
    
    Makes "make test TESTS=pthreadpool" faster
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 74dbeba723c642bd207dad9d6881e8aa803b7509
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jan 4 21:26:58 2018 +0100

    dnscli: Make a few functions static
    
    We might want to use the tcp flavor in the future in the forwarder for a
    single, persistent TCP connection. Then we can easily re-publish it.
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit 361ea743576cf125d7957a97ed78a0446dab1a19
Author: Volker Lendecke <vl at samba.org>
Date:   Thu Jan 4 21:06:02 2018 +0100

    samba: Only use async signal-safe functions in signal handler
    
    Otherwise shutdown can hang
    
    Signed-off-by: Volker Lendecke <vl at samba.org>
    Reviewed-by: Andreas Schneider <asn at samba.org>

commit e1fb902ca408aeecf26ecfd1926ca7824b25a3e7
Author: Ralph Boehme <slow at samba.org>
Date:   Tue Jan 2 19:09:04 2018 +0100

    s4/torture: test vfs_fruit "fruit:time machine max size" option
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

commit 74eebac975ee913e49c95b29c13a329edb0744e5
Author: Ralph Boehme <slow at samba.org>
Date:   Fri Nov 3 10:56:29 2017 +0100

    vfs_fruit: add "time machine max size" option
    
    This can be used to configure a per client filesystem size limit on
    TimeMachine shares.
    
    It's a nasty hack but it was reportedly working well in Netatalk where
    it's taken from.
    
    Signed-off-by: Ralph Boehme <slow at samba.org>
    Reviewed-by: Jeremy Allison <jra at samba.org>

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

Summary of changes:
 docs-xml/manpages/vfs_fileid.8.xml |  77 ++++++-
 docs-xml/manpages/vfs_fruit.8.xml  |  18 ++
 libcli/dns/dns.c                   |  36 ++--
 libcli/dns/libdns.h                |  38 ----
 selftest/target/Samba3.pm          |   8 +
 source3/modules/vfs_fileid.c       | 235 +++++++++++++++++++-
 source3/modules/vfs_fruit.c        | 428 +++++++++++++++++++++++++++++++++++++
 source3/selftest/tests.py          |   8 +-
 source4/smbd/server.c              |   4 +-
 source4/torture/vfs/fruit.c        | 102 +++++++++
 source4/torture/vfs/vfs.c          |   1 +
 11 files changed, 881 insertions(+), 74 deletions(-)


Changeset truncated at 500 lines:

diff --git a/docs-xml/manpages/vfs_fileid.8.xml b/docs-xml/manpages/vfs_fileid.8.xml
index 5a3a70e..edfdef2 100644
--- a/docs-xml/manpages/vfs_fileid.8.xml
+++ b/docs-xml/manpages/vfs_fileid.8.xml
@@ -40,6 +40,15 @@
 	generates the device number based on the configured algorithm
 	(see the "fileid:algorithm" option).
 	</para>
+
+	<para>When using the fsname or fsid algorithm a
+	<command>stat()</command> and <command>statfs()</command> call is
+	required for all mounted file systems to generate the file_id. If e.g.
+	an NFS file system is unresponsive such a call might block and the smbd
+	process will become unresponsive. Use the "fileid:fstype deny",
+	"fileid:fstype allow", "fileid:mntdir deny", or "fileid:mntdir allow"
+	options to ignore potentially unresponsive file systems.
+	</para>
 </refsect1>
 
 
@@ -51,17 +60,33 @@
 		<varlistentry>
 		<term>fileid:algorithm = ALGORITHM</term>
 		<listitem>
-		<para>Available algorithms are <command>fsname</command>
-		and <command>fsid</command>. The default value is
+		<para>Available algorithms are <command>fsname</command>,
+		<command>fsname_nodirs</command>, <command>fsid</command> and
+		<command>hostname</command>. The default value is
 		<command>fsname</command>.
 		</para>
 		<para>The <command>fsname</command> algorithm generates
 		device id by hashing the kernel device name.
 		</para>
+		<para>The <command>fsname_nodirs</command> algorithm generates
+		device id by hashing the kernel device name for files and by hashing
+		the hostname for directories. This can be used to deliberately
+		break lock coherency for directories in a cluster.
+		</para>
 		<para>The <command>fsid</command> algorithm generates
 		the device id from the <command>f_fsid</command> returned
 		from the <command>statfs()</command> syscall.
 		</para>
+		<para>The <command>hostname</command> algorithm generates device
+		id by hashing the hostname. This can be used to deliberately
+		break lock coherency in a cluster.
+		</para>
+		<para>The <command>fsname_norootdir</command> algorithm
+		generates device ids by hashing the kernel device name, except
+		for the root directory of shares where it will use the hostname
+		algorithm. This can be used to deliberately break lock coherency
+		in a cluster for the root directory of a share.
+		</para>
 		</listitem>
 		</varlistentry>
 
@@ -75,6 +100,54 @@
 		</listitem>
 		</varlistentry>
 
+		<varlistentry>
+		<term>fileid:fstype deny = LIST</term>
+		<listitem>
+		<para>List of file system types to be ignored for file_id
+		generation.
+		</para>
+		</listitem>
+		</varlistentry>
+
+		<varlistentry>
+		<term>fileid:fstype allow = LIST</term>
+		<listitem>
+		<para>List of file system types to be allowed for file_id
+		generation. If this option is set, file system types not listed
+		here are ignored.
+		</para>
+		</listitem>
+		</varlistentry>
+
+		<varlistentry>
+		<term>fileid:mntdir deny = LIST</term>
+		<listitem>
+		<para>List of file system mount points to be ignored for
+		file_id	generation.
+		</para>
+		</listitem>
+		</varlistentry>
+
+		<varlistentry>
+		<term>fileid:mntdir allow = LIST</term>
+		<listitem>
+		<para>List of file system mount points to be allowed for file_id
+		generation. If this option is set, file system mount points
+		not listed here are ignored.
+		</para>
+		</listitem>
+		</varlistentry>
+
+		<varlistentry>
+		<term>fileid:nolockinode</term>
+		<listitem>
+		<para>This option triggers use of the fileid hostname algorithm
+		for the configured inode which can be used to deliberately break
+		lock coherency for the corresponding file or directory in a
+		cluster.
+		</para>
+		</listitem>
+		</varlistentry>
 	</variablelist>
 </refsect1>
 
diff --git a/docs-xml/manpages/vfs_fruit.8.xml b/docs-xml/manpages/vfs_fruit.8.xml
index fcaf173..7f6a0e7 100644
--- a/docs-xml/manpages/vfs_fruit.8.xml
+++ b/docs-xml/manpages/vfs_fruit.8.xml
@@ -242,6 +242,24 @@
 	  </varlistentry>
 
 	  <varlistentry>
+	    <term>fruit:time machine max size = SIZE [K|M|G|T|P]</term>
+	    <listitem>
+	      <para>Useful for Time Machine: limits the reported disksize, thus
+	      preventing Time Machine from using the whole real disk space for
+	      backup. The option takes a number plus an optional unit.</para>
+	      <para><emphasis>IMPORTANT</emphasis>: This is an approximated
+	      calculation that only takes into account the contents of Time
+	      Machine sparsebundle images. Therefor you <emphasis>MUST
+	      NOT</emphasis> use this volume to store other content when using
+	      this option, because it would NOT be accounted.</para>
+	      <para>The calculation works by reading the band size from the
+	      Info.plist XML file of the sparsebundle, reading the bands/
+	      directory counting the number of band files, and then multiplying
+	      one with the other.</para>
+	    </listitem>
+	  </varlistentry>
+
+	  <varlistentry>
 	    <term>fruit:metadata = [ stream | netatalk ]</term>
 	    <listitem>
 	      <para>Controls where the OS X metadata stream is stored:</para>
diff --git a/libcli/dns/dns.c b/libcli/dns/dns.c
index 6404cb8..c30de2d 100644
--- a/libcli/dns/dns.c
+++ b/libcli/dns/dns.c
@@ -45,11 +45,11 @@ struct dns_udp_request_state {
 static void dns_udp_request_get_reply(struct tevent_req *subreq);
 static void dns_udp_request_done(struct tevent_req *subreq);
 
-struct tevent_req *dns_udp_request_send(TALLOC_CTX *mem_ctx,
-					struct tevent_context *ev,
-					const char *server_addr_string,
-					const uint8_t *query,
-					size_t query_len)
+static struct tevent_req *dns_udp_request_send(TALLOC_CTX *mem_ctx,
+					       struct tevent_context *ev,
+					       const char *server_addr_string,
+					       const uint8_t *query,
+					       size_t query_len)
 {
 	struct tevent_req *req, *subreq;
 	struct dns_udp_request_state *state;
@@ -158,10 +158,10 @@ static void dns_udp_request_done(struct tevent_req *subreq)
 	tevent_req_done(req);
 }
 
-int dns_udp_request_recv(struct tevent_req *req,
-			 TALLOC_CTX *mem_ctx,
-			 uint8_t **reply,
-			 size_t *reply_len)
+static int dns_udp_request_recv(struct tevent_req *req,
+				TALLOC_CTX *mem_ctx,
+				uint8_t **reply,
+				size_t *reply_len)
 {
 	struct dns_udp_request_state *state = tevent_req_data(req,
 			struct dns_udp_request_state);
@@ -201,11 +201,11 @@ static int dns_tcp_request_next_vector(struct tstream_context *stream,
 				       size_t *_count);
 static void dns_tcp_request_received(struct tevent_req *subreq);
 
-struct tevent_req *dns_tcp_request_send(TALLOC_CTX *mem_ctx,
-					struct tevent_context *ev,
-					const char *server_addr_string,
-					const uint8_t *query,
-					size_t query_len)
+static struct tevent_req *dns_tcp_request_send(TALLOC_CTX *mem_ctx,
+					       struct tevent_context *ev,
+					       const char *server_addr_string,
+					       const uint8_t *query,
+					       size_t query_len)
 {
 	struct tevent_req *req, *subreq;
 	struct dns_tcp_request_state *state;
@@ -377,10 +377,10 @@ static void dns_tcp_request_received(struct tevent_req *subreq)
 	tevent_req_done(req);
 }
 
-int dns_tcp_request_recv(struct tevent_req *req,
-			 TALLOC_CTX *mem_ctx,
-			 uint8_t **reply,
-			 size_t *reply_len)
+static int dns_tcp_request_recv(struct tevent_req *req,
+				TALLOC_CTX *mem_ctx,
+				uint8_t **reply,
+				size_t *reply_len)
 {
 	struct dns_tcp_request_state *state = tevent_req_data(
 		req, struct dns_tcp_request_state);
diff --git a/libcli/dns/libdns.h b/libcli/dns/libdns.h
index 1b7c404..15ca257 100644
--- a/libcli/dns/libdns.h
+++ b/libcli/dns/libdns.h
@@ -26,44 +26,6 @@
 #include "lib/util/time.h"
 #include "librpc/gen_ndr/dns.h"
 
-/** Send an dns request to a dns server using UDP
- *
- *@param mem_ctx        talloc memory context to use
- *@param ev             tevent context to use
- *@param server_address address of the server as a string
- *@param query          dns query to send
- *@param query_len      length of the query
- *@return tevent_req with the active request or NULL on out-of-memory
- */
-struct tevent_req *dns_udp_request_send(TALLOC_CTX *mem_ctx,
-					struct tevent_context *ev,
-					const char *server_address,
-					const uint8_t *query,
-					size_t query_len);
-
-/** Get the dns response from a dns server via UDP
- *
- *@param req       tevent_req struct returned from dns_udp_request_send
- *@param mem_ctx   talloc memory context to use for the reply string
- *@param reply     buffer that will be allocated and filled with the dns reply
- *@param reply_len length of the reply buffer
- *@return 0/errno
- */
-int dns_udp_request_recv(struct tevent_req *req,
-			 TALLOC_CTX *mem_ctx,
-			 uint8_t **reply,
-			 size_t *reply_len);
-
-struct tevent_req *dns_tcp_request_send(TALLOC_CTX *mem_ctx,
-					struct tevent_context *ev,
-					const char *server_addr_string,
-					const uint8_t *query,
-					size_t query_len);
-int dns_tcp_request_recv(struct tevent_req *req,
-			 TALLOC_CTX *mem_ctx,
-			 uint8_t **reply,
-			 size_t *reply_len);
-
 /*
  * DNS request with fallback to TCP on truncation
  */
diff --git a/selftest/target/Samba3.pm b/selftest/target/Samba3.pm
index c9888c2..1e652d8e 100755
--- a/selftest/target/Samba3.pm
+++ b/selftest/target/Samba3.pm
@@ -1957,6 +1957,14 @@ sub provision($$$$$$$$$)
 	path = $shrdir
 	vfs objects = streams_depot acl_xattr
 
+[vfs_fruit_timemachine]
+	path = $shrdir
+	vfs objects = fruit streams_xattr acl_xattr
+	fruit:resource = file
+	fruit:metadata = stream
+	fruit:time machine = yes
+	fruit:time machine max size = 32K
+
 [badname-tmp]
 	path = $badnames_shrdir
 	guest ok = yes
diff --git a/source3/modules/vfs_fileid.c b/source3/modules/vfs_fileid.c
index a7c4a49..98cc32d 100644
--- a/source3/modules/vfs_fileid.c
+++ b/source3/modules/vfs_fileid.c
@@ -37,11 +37,64 @@ struct fileid_mount_entry {
 
 struct fileid_handle_data {
 	uint64_t (*device_mapping_fn)(struct fileid_handle_data *data,
-				      SMB_DEV_T dev);
+				      const SMB_STRUCT_STAT *sbuf);
+	char **fstype_deny_list;
+	char **fstype_allow_list;
+	char **mntdir_deny_list;
+	char **mntdir_allow_list;
 	unsigned num_mount_entries;
 	struct fileid_mount_entry *mount_entries;
+	ino_t nolockinode;
 };
 
+/* check if a mount entry is allowed based on fstype and mount directory */
+static bool fileid_mount_entry_allowed(struct fileid_handle_data *data,
+				       struct mntent *m)
+{
+	int i;
+	char **fstype_deny = data->fstype_deny_list;
+	char **fstype_allow = data->fstype_allow_list;
+	char **mntdir_deny = data->mntdir_deny_list;
+	char **mntdir_allow = data->mntdir_allow_list;
+
+	if (fstype_deny != NULL) {
+		for (i = 0; fstype_deny[i] != NULL; i++) {
+			if (strcmp(m->mnt_type, fstype_deny[i]) == 0) {
+				return false;
+			}
+		}
+	}
+	if (fstype_allow != NULL) {
+		for (i = 0; fstype_allow[i] != NULL; i++) {
+			if (strcmp(m->mnt_type, fstype_allow[i]) == 0) {
+				break;
+			}
+		}
+		if (fstype_allow[i] == NULL) {
+			return false;
+		}
+	}
+	if (mntdir_deny != NULL) {
+		for (i=0; mntdir_deny[i] != NULL; i++) {
+			if (strcmp(m->mnt_dir, mntdir_deny[i]) == 0) {
+				return false;
+			}
+		}
+	}
+	if (mntdir_allow != NULL) {
+		for (i=0; mntdir_allow[i] != NULL; i++) {
+			if (strcmp(m->mnt_dir, mntdir_allow[i]) == 0) {
+				break;
+			}
+		}
+		if (mntdir_allow[i] == NULL) {
+			return false;
+		}
+	}
+	return true;
+}
+
+
 /* load all the mount entries from the mtab */
 static void fileid_load_mount_entries(struct fileid_handle_data *data)
 {
@@ -58,7 +111,13 @@ static void fileid_load_mount_entries(struct fileid_handle_data *data)
 		struct stat st;
 		struct statfs sfs;
 		struct fileid_mount_entry *cur;
+		bool allowed;
 
+		allowed = fileid_mount_entry_allowed(data, m);
+		if (!allowed) {
+			DBG_DEBUG("skipping mount entry %s\n", m->mnt_dir);
+			continue;
+		}
 		if (stat(m->mnt_dir, &st) != 0) continue;
 		if (statfs(m->mnt_dir, &sfs) != 0) continue;
 
@@ -136,12 +195,12 @@ static uint64_t fileid_uint64_hash(const uint8_t *s, size_t len)
 
 /* a device mapping using a fsname */
 static uint64_t fileid_device_mapping_fsname(struct fileid_handle_data *data,
-					     SMB_DEV_T dev)
+					     const SMB_STRUCT_STAT *sbuf)
 {
 	struct fileid_mount_entry *m;
 
-	m = fileid_find_mount_entry(data, dev);
-	if (!m) return dev;
+	m = fileid_find_mount_entry(data, sbuf->st_ex_dev);
+	if (!m) return sbuf->st_ex_dev;
 
 	if (m->devid == (uint64_t)-1) {
 		m->devid = fileid_uint64_hash((const uint8_t *)m->mnt_fsname,
@@ -151,14 +210,55 @@ static uint64_t fileid_device_mapping_fsname(struct fileid_handle_data *data,
 	return m->devid;
 }
 
+/* a device mapping using a hostname */
+static uint64_t fileid_device_mapping_hostname(struct fileid_handle_data *data,
+					       const SMB_STRUCT_STAT *sbuf)
+{
+	char hostname[HOST_NAME_MAX+1];
+	char *devname = NULL;
+	uint64_t id;
+	size_t devname_len;
+	int rc;
+
+	rc = gethostname(hostname, HOST_NAME_MAX+1);
+	if (rc != 0) {
+		DBG_ERR("gethostname failed\n");
+		return UINT64_MAX;
+	}
+
+	devname = talloc_asprintf(talloc_tos(), "%s%lu",
+				  hostname, sbuf->st_ex_dev);
+	if (devname == NULL) {
+		DBG_ERR("talloc_asprintf failed\n");
+		return UINT64_MAX;
+	}
+	devname_len = talloc_array_length(devname) - 1;
+	TALLOC_FREE(devname);
+
+	id = fileid_uint64_hash((uint8_t *)devname, devname_len);
+	return id;
+}
+
+/* a device mapping using a fsname for files and hostname for dirs */
+static uint64_t fileid_device_mapping_fsname_nodirs(
+	struct fileid_handle_data *data,
+	const SMB_STRUCT_STAT *sbuf)
+{
+	if (S_ISDIR(sbuf->st_ex_mode)) {
+		return fileid_device_mapping_hostname(data, sbuf);
+	}
+
+	return fileid_device_mapping_fsname(data, sbuf);
+}
+
 /* device mapping functions using a fsid */
 static uint64_t fileid_device_mapping_fsid(struct fileid_handle_data *data,
-					   SMB_DEV_T dev)
+					   const SMB_STRUCT_STAT *sbuf)
 {
 	struct fileid_mount_entry *m;
 
-	m = fileid_find_mount_entry(data, dev);
-	if (!m) return dev;
+	m = fileid_find_mount_entry(data, sbuf->st_ex_dev);
+	if (!m) return sbuf->st_ex_dev;
 
 	if (m->devid == (uint64_t)-1) {
 		if (sizeof(fsid_t) > sizeof(uint64_t)) {
@@ -178,11 +278,43 @@ static uint64_t fileid_device_mapping_fsid(struct fileid_handle_data *data,
 	return m->devid;
 }
 
+static int get_connectpath_ino(struct vfs_handle_struct *handle,
+			       ino_t *ino)
+{
+	struct smb_filename *fname = NULL;
+	int ret;
+
+	fname = synthetic_smb_fname(talloc_tos(),
+				    handle->conn->connectpath,
+				    NULL,
+				    NULL,
+				    0);
+	if (fname == NULL) {
+		DBG_ERR("synthetic_smb_fname failed\n");
+		return -1;
+	}
+
+	ret = SMB_VFS_NEXT_STAT(handle, fname);
+	TALLOC_FREE(fname);
+	if (ret != 0) {
+		DBG_ERR("stat failed for %s with %s\n",
+			handle->conn->connectpath, strerror(errno));
+		return -1;
+	}
+
+	return 0;
+}
+
 static int fileid_connect(struct vfs_handle_struct *handle,
 			  const char *service, const char *user)
 {
 	struct fileid_handle_data *data;
 	const char *algorithm;
+	const char **fstype_deny_list = NULL;
+	const char **fstype_allow_list = NULL;
+	const char **mntdir_deny_list = NULL;
+	const char **mntdir_allow_list = NULL;
+	int saved_errno;
 	int ret = SMB_VFS_NEXT_CONNECT(handle, service, user);
 
 	if (ret < 0) {
@@ -191,11 +323,15 @@ static int fileid_connect(struct vfs_handle_struct *handle,
 
 	data = talloc_zero(handle->conn, struct fileid_handle_data);
 	if (!data) {
+		saved_errno = errno;
 		SMB_VFS_NEXT_DISCONNECT(handle);
 		DEBUG(0, ("talloc_zero() failed\n"));
+		errno = saved_errno;
 		return -1;
 	}
 
+	data->nolockinode = 0;
+
 	/*
 	 * "fileid:mapping" is only here as fallback for old setups
 	 * "fileid:algorithm" is the option new setups should use
@@ -208,20 +344,89 @@ static int fileid_connect(struct vfs_handle_struct *handle,
 					 algorithm);
 	if (strcmp("fsname", algorithm) == 0) {
 		data->device_mapping_fn	= fileid_device_mapping_fsname;
+	} else if (strcmp("fsname_nodirs", algorithm) == 0) {


-- 
Samba Shared Repository



More information about the samba-cvs mailing list