summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs-xml/manpages-3/vfs_fileid.8.xml112
-rw-r--r--source3/include/ctdbd_conn.h4
-rw-r--r--source3/lib/ctdbd_conn.c30
-rw-r--r--source3/modules/vfs_fileid.c8
-rw-r--r--source3/smbd/server.c4
5 files changed, 142 insertions, 16 deletions
diff --git a/docs-xml/manpages-3/vfs_fileid.8.xml b/docs-xml/manpages-3/vfs_fileid.8.xml
new file mode 100644
index 0000000000..202d693a94
--- /dev/null
+++ b/docs-xml/manpages-3/vfs_fileid.8.xml
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE refentry PUBLIC "-//Samba-Team//DTD DocBook V4.2-Based Variant V1.0//EN" "http://www.samba.org/samba/DTD/samba-doc">
+<refentry id="vfs_fileid.8">
+
+<refmeta>
+ <refentrytitle>vfs_fileid</refentrytitle>
+ <manvolnum>8</manvolnum>
+ <refmiscinfo class="source">Samba</refmiscinfo>
+ <refmiscinfo class="manual">System Administration tools</refmiscinfo>
+ <refmiscinfo class="version">3.2</refmiscinfo>
+</refmeta>
+
+
+<refnamediv>
+ <refname>vfs_fileid</refname>
+ <refpurpose>Generates file_id structs with unique device id values for
+ cluster setups</refpurpose>
+</refnamediv>
+
+<refsynopsisdiv>
+ <cmdsynopsis>
+ <command>vfs objects = fileid</command>
+ </cmdsynopsis>
+</refsynopsisdiv>
+
+<refsect1>
+ <title>DESCRIPTION</title>
+
+ <para>This VFS module is part of the
+ <citerefentry><refentrytitle>samba</refentrytitle>
+ <manvolnum>7</manvolnum></citerefentry>
+ suite.</para>
+
+ <para>Samba uses file_id structs to uniquely identify files
+ for locking purpose. By default the file_id contains the device
+ and inode number returned by the <command>stat()</command> system call.
+ As the file_id is a unique identifier of a file, it must be the same
+ on all nodes in a cluster setup. This module overloads the
+ <command>SMB_VFS_FILE_ID_CREATE()</command> operation and
+ generates the device number based on the configured algorithm
+ (see the "fileid:algorithm" option).
+ </para>
+</refsect1>
+
+
+<refsect1>
+ <title>OPTIONS</title>
+
+ <variablelist>
+
+ <varlistentry>
+ <term>fileid:algorithm = ALGORITHM</term>
+ <listitem>
+ <para>Available algorithms are <command>fsname</command>
+ and <command>fsid</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>fsid</command> algorithm generates
+ the device id from the <command>f_fsid</command> returned
+ from the <command>statfs()</command> syscall.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>fileid:mapping = ALGORITHM</term>
+ <listitem>
+ <para>This option is the legacy version of the
+ <command>fileid:algorithm</command> option, which was used in earlier
+ versions of fileid mapping feature in custom Samba 3.0 versions.
+ </para>
+ </listitem>
+ </varlistentry>
+
+ </variablelist>
+</refsect1>
+
+<refsect1>
+ <title>EXAMPLES</title>
+
+ <para>Usage of the <command>fileid</command> module with the
+ <command>fsid</command> algorithm:</para>
+
+<programlisting>
+ <smbconfsection name="[global]"/>
+ <smbconfoption name="vfs objects">fileid</smbconfoption>
+ <smbconfoption name="fileid:algorithm">fsid</smbconfoption>
+</programlisting>
+
+</refsect1>
+
+<refsect1>
+ <title>VERSION</title>
+
+ <para>This man page is correct for version 3.2 of the Samba suite.
+ </para>
+</refsect1>
+
+<refsect1>
+ <title>AUTHOR</title>
+
+ <para>The original Samba software and related utilities
+ were created by Andrew Tridgell. Samba is now developed
+ by the Samba Team as an Open Source project similar
+ to the way the Linux kernel is developed.</para>
+
+</refsect1>
+
+</refentry>
diff --git a/source3/include/ctdbd_conn.h b/source3/include/ctdbd_conn.h
index 44c35168a8..d721235336 100644
--- a/source3/include/ctdbd_conn.h
+++ b/source3/include/ctdbd_conn.h
@@ -57,8 +57,8 @@ NTSTATUS ctdbd_traverse(uint32 db_id,
void *private_data);
NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
- const struct sockaddr *server,
- const struct sockaddr *client,
+ const struct sockaddr_storage *server,
+ const struct sockaddr_storage *client,
void (*release_ip_handler)(const char *ip_addr,
void *private_data),
void *private_data);
diff --git a/source3/lib/ctdbd_conn.c b/source3/lib/ctdbd_conn.c
index c94ef802c4..f8dae8fbd6 100644
--- a/source3/lib/ctdbd_conn.c
+++ b/source3/lib/ctdbd_conn.c
@@ -1181,13 +1181,22 @@ NTSTATUS ctdbd_traverse(uint32 db_id,
*/
NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
- const struct sockaddr *server,
- const struct sockaddr *client,
+ const struct sockaddr_storage *server,
+ const struct sockaddr_storage *client,
void (*release_ip_handler)(const char *ip_addr,
void *private_data),
void *private_data)
{
- struct ctdb_control_tcp_vnn p;
+ struct sockaddr *sock = (struct sockaddr *)client;
+ /*
+ * we still use ctdb_control_tcp for ipv4
+ * because we want to work against older ctdb
+ * versions at runtime
+ */
+ struct ctdb_control_tcp p4;
+#ifdef HAVE_IPV6
+ struct ctdb_control_tcp_addr p;
+#endif
TDB_DATA data;
NTSTATUS status;
@@ -1196,15 +1205,19 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
*/
SMB_ASSERT(conn->release_ip_handler == NULL);
- switch (client->sa_family) {
+ switch (sock->sa_family) {
case AF_INET:
- p.dest.ip = *(struct sockaddr_in *)server;
- p.src.ip = *(struct sockaddr_in *)client;
+ p4.dest = *(struct sockaddr_in *)server;
+ p4.src = *(struct sockaddr_in *)client;
+ data.dptr = (uint8_t *)&p4;
+ data.dsize = sizeof(p4);
break;
#ifdef HAVE_IPV6
case AF_INET6:
p.dest.ip6 = *(struct sockaddr_in6 *)server;
p.src.ip6 = *(struct sockaddr_in6 *)client;
+ data.dptr = (uint8_t *)&p;
+ data.dsize = sizeof(p);
break;
#endif
default:
@@ -1227,11 +1240,8 @@ NTSTATUS ctdbd_register_ips(struct ctdbd_connection *conn,
* can send an extra ack to trigger a reset for our client, so it
* immediately reconnects
*/
- data.dptr = (uint8_t *)&p;
- data.dsize = sizeof(p);
-
return ctdbd_control(conn, CTDB_CURRENT_NODE,
- CTDB_CONTROL_TCP_ADD, 0,
+ CTDB_CONTROL_TCP_CLIENT, 0,
CTDB_CTRL_FLAG_NOREPLY, data, NULL, NULL, NULL);
}
diff --git a/source3/modules/vfs_fileid.c b/source3/modules/vfs_fileid.c
index 8ab4ac3793..787a49f36b 100644
--- a/source3/modules/vfs_fileid.c
+++ b/source3/modules/vfs_fileid.c
@@ -188,10 +188,16 @@ static int fileid_connect(struct vfs_handle_struct *handle,
return -1;
}
- data->device_mapping_fn = fileid_device_mapping_fsid;
+ /*
+ * "fileid:mapping" is only here as fallback for old setups
+ * "fileid:algorithm" is the option new setups should use
+ */
algorithm = lp_parm_const_string(SNUM(handle->conn),
"fileid", "mapping",
"fsname");
+ algorithm = lp_parm_const_string(SNUM(handle->conn),
+ "fileid", "algorithm",
+ algorithm);
if (strcmp("fsname", algorithm) == 0) {
data->device_mapping_fn = fileid_device_mapping_fsname;
} else if (strcmp("fsid", algorithm) == 0) {
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 00e939e2b8..a884914839 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -1458,9 +1458,7 @@ extern void build_options(bool screen);
status = ctdbd_register_ips(
messaging_ctdbd_connection(),
- (struct sockaddr *)&srv,
- (struct sockaddr *)&clnt,
- release_ip, NULL);
+ &srv, &clnt, release_ip, NULL);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("ctdbd_register_ips failed: %s\n",