summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Bokovoy <ab@samba.org>2004-04-06 11:45:02 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 10:51:07 -0500
commitc4255df992d6ec6bb892bf0d39a32a00d4d570ae (patch)
tree4eca87d04c33b9c2e1fc0c11b5d234fb90feea58
parentd4f815731d58db302856abcdac9835a8c2fe2168 (diff)
downloadsamba-c4255df992d6ec6bb892bf0d39a32a00d4d570ae.tar.gz
samba-c4255df992d6ec6bb892bf0d39a32a00d4d570ae.tar.bz2
samba-c4255df992d6ec6bb892bf0d39a32a00d4d570ae.zip
r76: Fix smbfs problem with Tree Disconnect issued before smbfs starts its work.
We use cli_state.smb_rw_error to pass this specific case into cli_close_connection() from smbmount as smb_rw_error can have only selected number of states and it is ignored in cli_close_connection(). Compiled and tested by Lars Mueller from SuSE on x86, x86_64, ppc, ppc64, s390 and s390x. (This used to be commit 738666ce0a310fae14476020fd6dac027b0e3ec5)
-rw-r--r--source3/client/smbmount.c1
-rw-r--r--source3/include/smb.h1
-rw-r--r--source3/libsmb/clientgen.c6
3 files changed, 7 insertions, 1 deletions
diff --git a/source3/client/smbmount.c b/source3/client/smbmount.c
index 6e8d9f5bca..04bb103dae 100644
--- a/source3/client/smbmount.c
+++ b/source3/client/smbmount.c
@@ -383,6 +383,7 @@ static void send_fs_socket(char *the_service, char *mount_point, struct cli_stat
If we don't do this we will "leak" sockets and memory on
each reconnection we have to make. */
+ c->smb_rw_error = DO_NOT_DO_TDIS;
cli_shutdown(c);
c = NULL;
diff --git a/source3/include/smb.h b/source3/include/smb.h
index 3ee6f01d34..5d306be062 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -82,6 +82,7 @@ typedef int BOOL;
#define READ_ERROR 3
#define WRITE_ERROR 4 /* This error code can go into the client smb_rw_error. */
#define READ_BAD_SIG 5
+#define DO_NOT_DO_TDIS 6 /* cli_close_connection() check for this when smbfs wants to keep tree connected */
#define DIR_STRUCT_SIZE 43
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 66edc3ce38..6edc83c9d7 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -374,8 +374,12 @@ void cli_close_connection(struct cli_state *cli)
* can remain active on the peer end, until some (long) timeout period
* later. This tree disconnect forces the peer to clean up, since the
* connection will be going away.
+ *
+ * Also, do not do tree disconnect when cli->smb_rw_error is DO_NOT_DO_TDIS
+ * the only user for this so far is smbmount which passes opened connection
+ * down to kernel's smbfs module.
*/
- if ( cli->cnum != (uint16)-1 )
+ if ( (cli->cnum != (uint16)-1) && (cli->smb_rw_error != DO_NOT_DO_TDIS ) )
cli_tdis(cli);
cli_nt_session_close(cli);