diff options
-rw-r--r-- | docs-xml/manpages-3/vfs_fileid.8.xml | 112 | ||||
-rw-r--r-- | source3/include/ctdbd_conn.h | 4 | ||||
-rw-r--r-- | source3/lib/ctdbd_conn.c | 30 | ||||
-rw-r--r-- | source3/modules/vfs_fileid.c | 8 | ||||
-rw-r--r-- | source3/smbd/server.c | 4 |
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", |