cifs: add a "nosharesock" mount option to force new sockets to server to be created
authorJeff Layton <jlayton@redhat.com>
Fri, 24 May 2013 11:40:59 +0000 (07:40 -0400)
committerSteve French <smfrench@gmail.com>
Mon, 24 Jun 2013 06:56:38 +0000 (01:56 -0500)
Some servers set max_vcs to 1 and actually do enforce that limit. Add a
new mount option to work around this behavior that forces a mount
request to open a new socket to the server instead of reusing an
existing one.

I'd prefer to come up with a solution that doesn't require this, so
consider this a debug patch that you can use to determine whether this
is the real problem.

Cc: Jim McDonough <jmcd@samba.org>
Cc: Steve French <smfrench@gmail.com>
Signed-off-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/cifsglob.h
fs/cifs/connect.c

index 4f07f6f..db9f985 100644 (file)
@@ -441,6 +441,7 @@ struct smb_vol {
        bool mfsymlinks:1; /* use Minshall+French Symlinks */
        bool multiuser:1;
        bool rwpidforward:1; /* pid forward for read/write operations */
+       bool nosharesock;
        unsigned int rsize;
        unsigned int wsize;
        bool sockopt_tcp_nodelay:1;
index e3bc39b..180d9b9 100644 (file)
@@ -85,7 +85,7 @@ enum {
        Opt_acl, Opt_noacl, Opt_locallease,
        Opt_sign, Opt_seal, Opt_noac,
        Opt_fsc, Opt_mfsymlinks,
-       Opt_multiuser, Opt_sloppy,
+       Opt_multiuser, Opt_sloppy, Opt_nosharesock,
 
        /* Mount options which take numeric value */
        Opt_backupuid, Opt_backupgid, Opt_uid,
@@ -165,6 +165,7 @@ static const match_table_t cifs_mount_option_tokens = {
        { Opt_mfsymlinks, "mfsymlinks" },
        { Opt_multiuser, "multiuser" },
        { Opt_sloppy, "sloppy" },
+       { Opt_nosharesock, "nosharesock" },
 
        { Opt_backupuid, "backupuid=%s" },
        { Opt_backupgid, "backupgid=%s" },
@@ -1455,6 +1456,9 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
                case Opt_sloppy:
                        sloppy = true;
                        break;
+               case Opt_nosharesock:
+                       vol->nosharesock = true;
+                       break;
 
                /* Numeric Values */
                case Opt_backupuid:
@@ -2027,6 +2031,9 @@ static int match_server(struct TCP_Server_Info *server, struct smb_vol *vol)
 {
        struct sockaddr *addr = (struct sockaddr *)&vol->dstaddr;
 
+       if (vol->nosharesock)
+               return 0;
+
        if ((server->vals != vol->vals) || (server->ops != vol->ops))
                return 0;