cifs: ignore ipc reconnect failures during dfs failover
authorPaulo Alcantara <pc@cjr.nz>
Thu, 29 Dec 2022 15:33:55 +0000 (12:33 -0300)
committerSteve French <stfrench@microsoft.com>
Wed, 4 Jan 2023 06:10:19 +0000 (00:10 -0600)
If it failed to reconnect ipc used for getting referrals, we can just
ignore it as it is not required for reconnecting the share.  The worst
case would be not being able to detect or chase nested links as long
as dfs root server is unreachable.

Before patch:

  $ mount.cifs //root/dfs/link /mnt -o echo_interval=10,...
    -> target share: /fs0/share

  disconnect root & fs0

  $ ls /mnt
  ls: cannot access '/mnt': Host is down

  connect fs0

  $ ls /mnt
  ls: cannot access '/mnt': Resource temporarily unavailable

After patch:

  $ mount.cifs //root/dfs/link /mnt -o echo_interval=10,...
    -> target share: /fs0/share

  disconnect root & fs0

  $ ls /mnt
  ls: cannot access '/mnt': Host is down

  connect fs0

  $ ls /mnt
  bar.rtf  dir1  foo

Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Reviewed-by: Enzo Matsumiya <ematsumiya@suse.de>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/dfs.c

index b541e68..30086f2 100644 (file)
@@ -401,8 +401,7 @@ static int __tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *t
                if (ipc->need_reconnect) {
                        scnprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$", server->hostname);
                        rc = ops->tree_connect(xid, ipc->ses, tree, ipc, cifs_sb->local_nls);
-                       if (rc)
-                               break;
+                       cifs_dbg(FYI, "%s: reconnect ipc: %d\n", __func__, rc);
                }
 
                scnprintf(tree, MAX_TREE_SIZE, "\\%s", share);