[SRU][Artful][Bionic][PATCH 0/3] Fixes for LP:1747572

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

[SRU][Artful][Bionic][PATCH 0/3] Fixes for LP:1747572

Joseph Salisbury-3
BugLink: http://bugs.launchpad.net/bugs/1747572

== SRU Justification ==
CIFS SMB2/SMB3 does not work for domain based DFS.  The bug reporter is
having problems mounting a domain based DFS share using mount.cifs with the
parameter vers=2.0 or vers=3.0, even though it works with the deprecated
version vers=1.0.

This bug was reported and fixed upstream by the requested three commits:
https://bugzilla.samba.org/show_bug.cgi?id=12917

The three requested commits are all in mainline as of v4.16-rc1.

== Fixes ==
b327a717e506 ("CIFS: make IPC a regular tcon")
63a83b861c47 ("CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl")
02cf5905e35d ("CIFS: dump IPC tcon in debug proc file")

== Regression Potential ==
Low.  Limited to cifs.

== Test Case ==
A test kernel was built with this patch and tested by the original bug reporter.
The bug reporter states the test kernel resolved the bug.

Aurelien Aptel (3):
  CIFS: make IPC a regular tcon
  CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl
  CIFS: dump IPC tcon in debug proc file

 fs/cifs/cifs_debug.c |  61 ++++++++++++---------
 fs/cifs/cifsglob.h   |  14 ++---
 fs/cifs/cifssmb.c    |   7 +--
 fs/cifs/connect.c    | 150 ++++++++++++++++++++++++++++++++++++++-------------
 fs/cifs/inode.c      |   2 +-
 fs/cifs/smb2file.c   |   2 +-
 fs/cifs/smb2ops.c    |  53 ++++++++----------
 fs/cifs/smb2pdu.c    |  40 ++++----------
 fs/cifs/smb2proto.h  |   3 +-
 9 files changed, 193 insertions(+), 139 deletions(-)

--
2.7.4


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][Artful][Bionic][PATCH 1/3] CIFS: make IPC a regular tcon

Joseph Salisbury-3
From: Aurelien Aptel <[hidden email]>

BugLink: http://bugs.launchpad.net/bugs/1747572

* Remove ses->ipc_tid.
* Make IPC$ regular tcon.
* Add a direct pointer to it in ses->tcon_ipc.
* Distinguish PIPE tcon from IPC tcon by adding a tcon->pipe flag. All
  IPC tcons are pipes but not all pipes are IPC.
* All TreeConnect functions now cannot take a NULL tcon object.

The IPC tcon has the same lifetime as the session it belongs to. It is
created when the session is created and destroyed when the session is
destroyed.

Since no mounts directly refer to the IPC tcon, its refcount should
always be set to initialisation value (1). Thus we make sure
cifs_put_tcon() skips it.

If the mount request resulting in a new session being created requires
encryption, try to require it too for IPC.

* set SERVER_NAME_LENGTH to serverName actual size

The maximum length of an ipv6 string representation is defined in
INET6_ADDRSTRLEN as 45+1 for null but lets keep what we know works.

Signed-off-by: Aurelien Aptel <[hidden email]>
Signed-off-by: Steve French <[hidden email]>
Reviewed-by: Pavel Shilovsky <[hidden email]>
(back ported from commit b327a717e506980399464e304e363f94f95eb7a1)
Signed-off-by: Joseph Salisbury <[hidden email]>
---
 fs/cifs/cifsglob.h |  14 ++---
 fs/cifs/cifssmb.c  |   7 +--
 fs/cifs/connect.c  | 150 ++++++++++++++++++++++++++++++++++++++++-------------
 fs/cifs/inode.c    |   2 +-
 fs/cifs/smb2pdu.c  |  36 +++----------
 5 files changed, 133 insertions(+), 76 deletions(-)

diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index ab69d89..a5548fd 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -64,8 +64,8 @@
 #define RFC1001_NAME_LEN 15
 #define RFC1001_NAME_LEN_WITH_NULL (RFC1001_NAME_LEN + 1)
 
-/* currently length of NIP6_FMT */
-#define SERVER_NAME_LENGTH 40
+/* maximum length of ip addr as a string (including ipv6 and sctp) */
+#define SERVER_NAME_LENGTH 80
 #define SERVER_NAME_LEN_WITH_NULL     (SERVER_NAME_LENGTH + 1)
 
 /* echo interval in seconds */
@@ -822,12 +822,12 @@ static inline void cifs_set_net_ns(struct TCP_Server_Info *srv, struct net *net)
 struct cifs_ses {
  struct list_head smb_ses_list;
  struct list_head tcon_list;
+ struct cifs_tcon *tcon_ipc;
  struct mutex session_mutex;
  struct TCP_Server_Info *server; /* pointer to server info */
  int ses_count; /* reference counter */
  enum statusEnum status;
  unsigned overrideSecFlg;  /* if non-zero override global sec flags */
- __u32 ipc_tid; /* special tid for connection to IPC share */
  char *serverOS; /* name of operating system underlying server */
  char *serverNOS; /* name of network operating system of server */
  char *serverDomain; /* security realm of server */
@@ -835,8 +835,7 @@ struct cifs_ses {
  kuid_t linux_uid; /* overriding owner of files on the mount */
  kuid_t cred_uid; /* owner of credentials */
  unsigned int capabilities;
- char serverName[SERVER_NAME_LEN_WITH_NULL * 2]; /* BB make bigger for
- TCP names - will ipv6 and sctp addresses fit? */
+ char serverName[SERVER_NAME_LEN_WITH_NULL];
  char *user_name; /* must not be null except during init of sess
    and after mount option parsing we fill it */
  char *domainName;
@@ -931,7 +930,9 @@ struct cifs_tcon {
  FILE_SYSTEM_DEVICE_INFO fsDevInfo;
  FILE_SYSTEM_ATTRIBUTE_INFO fsAttrInfo; /* ok if fs name truncated */
  FILE_SYSTEM_UNIX_INFO fsUnixInfo;
- bool ipc:1; /* set if connection to IPC$ eg for RPC/PIPES */
+ bool ipc:1;   /* set if connection to IPC$ share (always also pipe) */
+ bool pipe:1;  /* set if connection to pipe share */
+ bool print:1; /* set if connection to printer share */
  bool retry:1;
  bool nocase:1;
  bool seal:1;      /* transport encryption for this mounted share */
@@ -944,7 +945,6 @@ struct cifs_tcon {
  bool need_reopen_files:1; /* need to reopen tcon file handles */
  bool use_resilient:1; /* use resilient instead of durable handles */
  bool use_persistent:1; /* use persistent instead of durable handles */
- bool print:1; /* set if connection to printer share */
  __le32 capabilities;
  __u32 share_flags;
  __u32 maximal_access;
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 72a53bd..9b46fd5 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -4810,10 +4810,11 @@ CIFSGetDFSRefer(const unsigned int xid, struct cifs_ses *ses,
  *target_nodes = NULL;
 
  cifs_dbg(FYI, "In GetDFSRefer the path %s\n", search_name);
- if (ses == NULL)
+ if (ses == NULL || ses->tcon_ipc == NULL)
  return -ENODEV;
+
 getDFSRetry:
- rc = smb_init(SMB_COM_TRANSACTION2, 15, NULL, (void **) &pSMB,
+ rc = smb_init(SMB_COM_TRANSACTION2, 15, ses->tcon_ipc, (void **) &pSMB,
       (void **) &pSMBr);
  if (rc)
  return rc;
@@ -4821,7 +4822,7 @@ CIFSGetDFSRefer(const unsigned int xid, struct cifs_ses *ses,
  /* server pointer checked in called function,
  but should never be null here anyway */
  pSMB->hdr.Mid = get_next_mid(ses->server);
- pSMB->hdr.Tid = ses->ipc_tid;
+ pSMB->hdr.Tid = ses->tcon_ipc->tid;
  pSMB->hdr.Uid = ses->Suid;
  if (ses->capabilities & CAP_STATUS32)
  pSMB->hdr.Flags2 |= SMBFLG2_ERR_STATUS;
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 9e12679..66e425a 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -353,11 +353,12 @@ cifs_reconnect(struct TCP_Server_Info *server)
  list_for_each(tmp, &server->smb_ses_list) {
  ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
  ses->need_reconnect = true;
- ses->ipc_tid = 0;
  list_for_each(tmp2, &ses->tcon_list) {
  tcon = list_entry(tmp2, struct cifs_tcon, tcon_list);
  tcon->need_reconnect = true;
  }
+ if (ses->tcon_ipc)
+ ses->tcon_ipc->need_reconnect = true;
  }
  spin_unlock(&cifs_tcp_ses_lock);
 
@@ -2380,6 +2381,93 @@ static int match_session(struct cifs_ses *ses, struct smb_vol *vol)
  return 1;
 }
 
+/**
+ * cifs_setup_ipc - helper to setup the IPC tcon for the session
+ *
+ * A new IPC connection is made and stored in the session
+ * tcon_ipc. The IPC tcon has the same lifetime as the session.
+ */
+static int
+cifs_setup_ipc(struct cifs_ses *ses, struct smb_vol *volume_info)
+{
+ int rc = 0, xid;
+ struct cifs_tcon *tcon;
+ struct nls_table *nls_codepage;
+ char unc[SERVER_NAME_LENGTH + sizeof("//x/IPC$")] = {0};
+ bool seal = false;
+
+ /*
+ * If the mount request that resulted in the creation of the
+ * session requires encryption, force IPC to be encrypted too.
+ */
+ if (volume_info->seal) {
+ if (ses->server->capabilities & SMB2_GLOBAL_CAP_ENCRYPTION)
+ seal = true;
+ else {
+ cifs_dbg(VFS,
+ "IPC: server doesn't support encryption\n");
+ return -EOPNOTSUPP;
+ }
+ }
+
+ tcon = tconInfoAlloc();
+ if (tcon == NULL)
+ return -ENOMEM;
+
+ snprintf(unc, sizeof(unc), "\\\\%s\\IPC$", ses->serverName);
+
+ /* cannot fail */
+ nls_codepage = load_nls_default();
+
+ xid = get_xid();
+ tcon->ses = ses;
+ tcon->ipc = true;
+ tcon->seal = seal;
+ rc = ses->server->ops->tree_connect(xid, ses, unc, tcon, nls_codepage);
+ free_xid(xid);
+
+ if (rc) {
+ cifs_dbg(VFS, "failed to connect to IPC (rc=%d)\n", rc);
+ tconInfoFree(tcon);
+ goto out;
+ }
+
+ cifs_dbg(FYI, "IPC tcon rc = %d ipc tid = %d\n", rc, tcon->tid);
+
+ ses->tcon_ipc = tcon;
+out:
+ unload_nls(nls_codepage);
+ return rc;
+}
+
+/**
+ * cifs_free_ipc - helper to release the session IPC tcon
+ *
+ * Needs to be called everytime a session is destroyed
+ */
+static int
+cifs_free_ipc(struct cifs_ses *ses)
+{
+ int rc = 0, xid;
+ struct cifs_tcon *tcon = ses->tcon_ipc;
+
+ if (tcon == NULL)
+ return 0;
+
+ if (ses->server->ops->tree_disconnect) {
+ xid = get_xid();
+ rc = ses->server->ops->tree_disconnect(xid, tcon);
+ free_xid(xid);
+ }
+
+ if (rc)
+ cifs_dbg(FYI, "failed to disconnect IPC tcon (rc=%d)\n", rc);
+
+ tconInfoFree(tcon);
+ ses->tcon_ipc = NULL;
+ return rc;
+}
+
 static struct cifs_ses *
 cifs_find_smb_ses(struct TCP_Server_Info *server, struct smb_vol *vol)
 {
@@ -2420,6 +2508,8 @@ cifs_put_smb_ses(struct cifs_ses *ses)
  ses->status = CifsExiting;
  spin_unlock(&cifs_tcp_ses_lock);
 
+ cifs_free_ipc(ses);
+
  if (ses->status == CifsExiting && server->ops->logoff) {
  xid = get_xid();
  rc = server->ops->logoff(xid, ses);
@@ -2664,6 +2754,9 @@ cifs_get_smb_ses(struct TCP_Server_Info *server, struct smb_vol *volume_info)
  spin_unlock(&cifs_tcp_ses_lock);
 
  free_xid(xid);
+
+ cifs_setup_ipc(ses, volume_info);
+
  return ses;
 
 get_ses_fail:
@@ -2708,8 +2801,16 @@ void
 cifs_put_tcon(struct cifs_tcon *tcon)
 {
  unsigned int xid;
- struct cifs_ses *ses = tcon->ses;
+ struct cifs_ses *ses;
+
+ /*
+ * IPC tcon share the lifetime of their session and are
+ * destroyed in the session put function
+ */
+ if (tcon == NULL || tcon->ipc)
+ return;
 
+ ses = tcon->ses;
  cifs_dbg(FYI, "%s: tc_count=%d\n", __func__, tcon->tc_count);
  spin_lock(&cifs_tcp_ses_lock);
  if (--tcon->tc_count > 0) {
@@ -2985,39 +3086,17 @@ get_dfs_path(const unsigned int xid, struct cifs_ses *ses, const char *old_path,
      const struct nls_table *nls_codepage, unsigned int *num_referrals,
      struct dfs_info3_param **referrals, int remap)
 {
- char *temp_unc;
  int rc = 0;
 
- if (!ses->server->ops->tree_connect || !ses->server->ops->get_dfs_refer)
+ if (!ses->server->ops->get_dfs_refer)
  return -ENOSYS;
 
  *num_referrals = 0;
  *referrals = NULL;
 
- if (ses->ipc_tid == 0) {
- temp_unc = kmalloc(2 /* for slashes */ +
- strnlen(ses->serverName, SERVER_NAME_LEN_WITH_NULL * 2)
- + 1 + 4 /* slash IPC$ */ + 2, GFP_KERNEL);
- if (temp_unc == NULL)
- return -ENOMEM;
- temp_unc[0] = '\\';
- temp_unc[1] = '\\';
- strcpy(temp_unc + 2, ses->serverName);
- strcpy(temp_unc + 2 + strlen(ses->serverName), "\\IPC$");
- rc = ses->server->ops->tree_connect(xid, ses, temp_unc, NULL,
-    nls_codepage);
- cifs_dbg(FYI, "Tcon rc = %d ipc_tid = %d\n", rc, ses->ipc_tid);
- kfree(temp_unc);
- }
- if (rc == 0)
- rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
-     referrals, num_referrals,
-     nls_codepage, remap);
- /*
- * BB - map targetUNCs to dfs_info3 structures, here or in
- * ses->server->ops->get_dfs_refer.
- */
-
+ rc = ses->server->ops->get_dfs_refer(xid, ses, old_path,
+     referrals, num_referrals,
+     nls_codepage, remap);
  return rc;
 }
 
@@ -3782,7 +3861,7 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
  tcon->unix_ext = 0; /* server does not support them */
 
  /* do not care if a following call succeed - informational */
- if (!tcon->ipc && server->ops->qfs_tcon)
+ if (!tcon->pipe && server->ops->qfs_tcon)
  server->ops->qfs_tcon(xid, tcon);
 
  cifs_sb->wsize = server->ops->negotiate_wsize(tcon, volume_info);
@@ -3912,8 +3991,7 @@ cifs_mount(struct cifs_sb_info *cifs_sb, struct smb_vol *volume_info)
 }
 
 /*
- * Issue a TREE_CONNECT request. Note that for IPC$ shares, that the tcon
- * pointer may be NULL.
+ * Issue a TREE_CONNECT request.
  */
 int
 CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
@@ -3949,7 +4027,7 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
  pSMB->AndXCommand = 0xFF;
  pSMB->Flags = cpu_to_le16(TCON_EXTENDED_SECINFO);
  bcc_ptr = &pSMB->Password[0];
- if (!tcon || (ses->server->sec_mode & SECMODE_USER)) {
+ if (tcon->pipe || (ses->server->sec_mode & SECMODE_USER)) {
  pSMB->PasswordLength = cpu_to_le16(1); /* minimum */
  *bcc_ptr = 0; /* password is null byte */
  bcc_ptr++;              /* skip password */
@@ -4021,7 +4099,7 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
  0);
 
  /* above now done in SendReceive */
- if ((rc == 0) && (tcon != NULL)) {
+ if (rc == 0) {
  bool is_unicode;
 
  tcon->tidStatus = CifsGood;
@@ -4041,7 +4119,8 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
  if ((bcc_ptr[0] == 'I') && (bcc_ptr[1] == 'P') &&
     (bcc_ptr[2] == 'C')) {
  cifs_dbg(FYI, "IPC connection\n");
- tcon->ipc = 1;
+ tcon->ipc = true;
+ tcon->pipe = true;
  }
  } else if (length == 2) {
  if ((bcc_ptr[0] == 'A') && (bcc_ptr[1] == ':')) {
@@ -4068,9 +4147,6 @@ CIFSTCon(const unsigned int xid, struct cifs_ses *ses,
  else
  tcon->Flags = 0;
  cifs_dbg(FYI, "Tcon flags: 0x%x\n", tcon->Flags);
- } else if ((rc == 0) && tcon == NULL) {
- /* all we need to save for IPC$ connection */
- ses->ipc_tid = smb_buffer_response->Tid;
  }
 
  cifs_buf_release(smb_buffer);
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index 7c732cb4..9e5f038 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -1049,7 +1049,7 @@ struct inode *cifs_root_iget(struct super_block *sb)
  tcon->resource_id = CIFS_I(inode)->uniqueid;
 #endif
 
- if (rc && tcon->ipc) {
+ if (rc && tcon->pipe) {
  cifs_dbg(FYI, "ipc connection - fake read inode\n");
  spin_lock(&inode->i_lock);
  inode->i_mode |= S_IFDIR;
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index 834d18d..bf79e75 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -1267,8 +1267,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
  }
 
  /* SMB2 TREE_CONNECT request must be called with TreeId == 0 */
- if (tcon)
- tcon->tid = 0;
+ tcon->tid = 0;
 
  rc = small_smb2_init(SMB2_TREE_CONNECT, tcon, (void **) &req);
  if (rc) {
@@ -1276,15 +1275,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
  return rc;
  }
 
- if (tcon == NULL) {
- if ((ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA))
- flags |= CIFS_TRANSFORM_REQ;
-
- /* since no tcon, smb2_init can not do this, so do here */
- req->hdr.sync_hdr.SessionId = ses->Suid;
- if (ses->server->sign)
- req->hdr.sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
- } else if (encryption_required(tcon))
+ if (encryption_required(tcon))
  flags |= CIFS_TRANSFORM_REQ;
 
  iov[0].iov_base = (char *)req;
@@ -1312,21 +1303,16 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
  goto tcon_error_exit;
  }
 
- if (tcon == NULL) {
- ses->ipc_tid = rsp->hdr.sync_hdr.TreeId;
- goto tcon_exit;
- }
-
  switch (rsp->ShareType) {
  case SMB2_SHARE_TYPE_DISK:
  cifs_dbg(FYI, "connection to disk share\n");
  break;
  case SMB2_SHARE_TYPE_PIPE:
- tcon->ipc = true;
+ tcon->pipe = true;
  cifs_dbg(FYI, "connection to pipe share\n");
  break;
  case SMB2_SHARE_TYPE_PRINT:
- tcon->ipc = true;
+ tcon->print = true;
  cifs_dbg(FYI, "connection to printer\n");
  break;
  default:
@@ -1897,16 +1883,6 @@ SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
  if (rc)
  return rc;
 
- if (use_ipc) {
- if (ses->ipc_tid == 0) {
- cifs_small_buf_release(req);
- return -ENOTCONN;
- }
-
- cifs_dbg(FYI, "replacing tid 0x%x with IPC tid 0x%x\n",
- req->hdr.sync_hdr.TreeId, ses->ipc_tid);
- req->hdr.sync_hdr.TreeId = ses->ipc_tid;
- }
  if (encryption_required(tcon))
  flags |= CIFS_TRANSFORM_REQ;
 
@@ -2306,6 +2282,10 @@ void smb2_reconnect_server(struct work_struct *work)
  tcon_exist = true;
  }
  }
+ if (ses->tcon_ipc && ses->tcon_ipc->need_reconnect) {
+ list_add_tail(&ses->tcon_ipc->rlist, &tmp_list);
+ tcon_exist = true;
+ }
  }
  /*
  * Get the reference to server struct to be sure that the last call of
--
2.7.4


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[PATCH 2/3] CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl

Joseph Salisbury-3
In reply to this post by Joseph Salisbury-3
From: Aurelien Aptel <[hidden email]>

BugLink: http://bugs.launchpad.net/bugs/1747572

Since IPC now has a tcon object, the caller can just pass it. This
allows domain-based DFS requests to work with smb2+.

Link: https://bugzilla.samba.org/show_bug.cgi?id=12917
Fixes: 9d49640a21bf ("CIFS: implement get_dfs_refer for SMB2+")
Signed-off-by: Aurelien Aptel <[hidden email]>
Signed-off-by: Steve French <[hidden email]>
Reviewed-by: Pavel Shilovsky <[hidden email]>
(cherry picked from commit 63a83b861c47dba9e0f46b98423723a6a3d97fb1)
Signed-off-by: Joseph Salisbury <[hidden email]>
---
 fs/cifs/smb2file.c  |  2 +-
 fs/cifs/smb2ops.c   | 53 ++++++++++++++++++++++-------------------------------
 fs/cifs/smb2pdu.c   |  4 +---
 fs/cifs/smb2proto.h |  3 +--
 4 files changed, 25 insertions(+), 37 deletions(-)

diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
index b4b1f03..12af5db 100644
--- a/fs/cifs/smb2file.c
+++ b/fs/cifs/smb2file.c
@@ -74,7 +74,7 @@ smb2_open_file(const unsigned int xid, struct cifs_open_parms *oparms,
  nr_ioctl_req.Reserved = 0;
  rc = SMB2_ioctl(xid, oparms->tcon, fid->persistent_fid,
  fid->volatile_fid, FSCTL_LMR_REQUEST_RESILIENCY,
- true /* is_fsctl */, false /* use_ipc */,
+ true /* is_fsctl */,
  (char *)&nr_ioctl_req, sizeof(nr_ioctl_req),
  NULL, NULL /* no return info */);
  if (rc == -EOPNOTSUPP) {
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index a6c9481..3e6f886 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -283,7 +283,6 @@ SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon)
 
  rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
  FSCTL_QUERY_NETWORK_INTERFACE_INFO, true /* is_fsctl */,
- false /* use_ipc */,
  NULL /* no data input */, 0 /* no data input */,
  (char **)&out_buf, &ret_data_len);
  if (rc != 0)
@@ -573,7 +572,6 @@ SMB2_request_res_key(const unsigned int xid, struct cifs_tcon *tcon,
 
  rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid,
  FSCTL_SRV_REQUEST_RESUME_KEY, true /* is_fsctl */,
- false /* use_ipc */,
  NULL, 0 /* no input */,
  (char **)&res_key, &ret_data_len);
 
@@ -639,8 +637,7 @@ smb2_copychunk_range(const unsigned int xid,
  /* Request server copy to target from src identified by key */
  rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
  trgtfile->fid.volatile_fid, FSCTL_SRV_COPYCHUNK_WRITE,
- true /* is_fsctl */, false /* use_ipc */,
- (char *)pcchunk,
+ true /* is_fsctl */, (char *)pcchunk,
  sizeof(struct copychunk_ioctl), (char **)&retbuf,
  &ret_data_len);
  if (rc == 0) {
@@ -797,7 +794,7 @@ static bool smb2_set_sparse(const unsigned int xid, struct cifs_tcon *tcon,
 
  rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
  cfile->fid.volatile_fid, FSCTL_SET_SPARSE,
- true /* is_fctl */, false /* use_ipc */,
+ true /* is_fctl */,
  &setsparse, 1, NULL, NULL);
  if (rc) {
  tcon->broken_sparse_sup = true;
@@ -868,7 +865,7 @@ smb2_duplicate_extents(const unsigned int xid,
  rc = SMB2_ioctl(xid, tcon, trgtfile->fid.persistent_fid,
  trgtfile->fid.volatile_fid,
  FSCTL_DUPLICATE_EXTENTS_TO_FILE,
- true /* is_fsctl */, false /* use_ipc */,
+ true /* is_fsctl */,
  (char *)&dup_ext_buf,
  sizeof(struct duplicate_extents_to_file),
  NULL,
@@ -903,7 +900,7 @@ smb3_set_integrity(const unsigned int xid, struct cifs_tcon *tcon,
  return SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
  cfile->fid.volatile_fid,
  FSCTL_SET_INTEGRITY_INFORMATION,
- true /* is_fsctl */, false /* use_ipc */,
+ true /* is_fsctl */,
  (char *)&integr_info,
  sizeof(struct fsctl_set_integrity_information_req),
  NULL,
@@ -923,7 +920,7 @@ smb3_enum_snapshots(const unsigned int xid, struct cifs_tcon *tcon,
  rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
  cfile->fid.volatile_fid,
  FSCTL_SRV_ENUMERATE_SNAPSHOTS,
- true /* is_fsctl */, false /* use_ipc */,
+ true /* is_fsctl */,
  NULL, 0 /* no input data */,
  (char **)&retbuf,
  &ret_data_len);
@@ -1142,16 +1139,20 @@ smb2_get_dfs_refer(const unsigned int xid, struct cifs_ses *ses,
  cifs_dbg(FYI, "smb2_get_dfs_refer path <%s>\n", search_name);
 
  /*
- * Use any tcon from the current session. Here, the first one.
+ * Try to use the IPC tcon, otherwise just use any
  */
- spin_lock(&cifs_tcp_ses_lock);
- tcon = list_first_entry_or_null(&ses->tcon_list, struct cifs_tcon,
- tcon_list);
- if (tcon)
- tcon->tc_count++;
- spin_unlock(&cifs_tcp_ses_lock);
+ tcon = ses->tcon_ipc;
+ if (tcon == NULL) {
+ spin_lock(&cifs_tcp_ses_lock);
+ tcon = list_first_entry_or_null(&ses->tcon_list,
+ struct cifs_tcon,
+ tcon_list);
+ if (tcon)
+ tcon->tc_count++;
+ spin_unlock(&cifs_tcp_ses_lock);
+ }
 
- if (!tcon) {
+ if (tcon == NULL) {
  cifs_dbg(VFS, "session %p has no tcon available for a dfs referral request\n",
  ses);
  rc = -ENOTCONN;
@@ -1180,20 +1181,11 @@ smb2_get_dfs_refer(const unsigned int xid, struct cifs_ses *ses,
  memcpy(dfs_req->RequestFileName, utf16_path, utf16_path_len);
 
  do {
- /* try first with IPC */
  rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
  FSCTL_DFS_GET_REFERRALS,
- true /* is_fsctl */, true /* use_ipc */,
+ true /* is_fsctl */,
  (char *)dfs_req, dfs_req_size,
  (char **)&dfs_rsp, &dfs_rsp_size);
- if (rc == -ENOTCONN) {
- /* try with normal tcon */
- rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
- FSCTL_DFS_GET_REFERRALS,
- true /* is_fsctl */, false /*use_ipc*/,
- (char *)dfs_req, dfs_req_size,
- (char **)&dfs_rsp, &dfs_rsp_size);
- }
  } while (rc == -EAGAIN);
 
  if (rc) {
@@ -1211,7 +1203,8 @@ smb2_get_dfs_refer(const unsigned int xid, struct cifs_ses *ses,
  }
 
  out:
- if (tcon) {
+ if (tcon && !tcon->ipc) {
+ /* ipc tcons are not refcounted */
  spin_lock(&cifs_tcp_ses_lock);
  tcon->tc_count--;
  spin_unlock(&cifs_tcp_ses_lock);
@@ -1503,8 +1496,7 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
 
  rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
  cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA,
- true /* is_fctl */, false /* use_ipc */,
- (char *)&fsctl_buf,
+ true /* is_fctl */, (char *)&fsctl_buf,
  sizeof(struct file_zero_data_information), NULL, NULL);
  free_xid(xid);
  return rc;
@@ -1538,8 +1530,7 @@ static long smb3_punch_hole(struct file *file, struct cifs_tcon *tcon,
 
  rc = SMB2_ioctl(xid, tcon, cfile->fid.persistent_fid,
  cfile->fid.volatile_fid, FSCTL_SET_ZERO_DATA,
- true /* is_fctl */, false /* use_ipc */,
- (char *)&fsctl_buf,
+ true /* is_fctl */, (char *)&fsctl_buf,
  sizeof(struct file_zero_data_information), NULL, NULL);
  free_xid(xid);
  return rc;
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index bf79e75..6d7c817 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -701,7 +701,6 @@ int smb3_validate_negotiate(const unsigned int xid, struct cifs_tcon *tcon)
 
  rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
  FSCTL_VALIDATE_NEGOTIATE_INFO, true /* is_fsctl */,
- false /* use_ipc */,
  (char *)&vneg_inbuf, sizeof(struct validate_negotiate_info_req),
  (char **)&pneg_rsp, &rsplen);
 
@@ -1847,7 +1846,7 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
  */
 int
 SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon, u64 persistent_fid,
-   u64 volatile_fid, u32 opcode, bool is_fsctl, bool use_ipc,
+   u64 volatile_fid, u32 opcode, bool is_fsctl,
    char *in_data, u32 indatalen,
    char **out_data, u32 *plen /* returned data len */)
 {
@@ -2012,7 +2011,6 @@ SMB2_set_compression(const unsigned int xid, struct cifs_tcon *tcon,
 
  rc = SMB2_ioctl(xid, tcon, persistent_fid, volatile_fid,
  FSCTL_SET_COMPRESSION, true /* is_fsctl */,
- false /* use_ipc */,
  (char *)&fsctl_input /* data input */,
  2 /* in data len */, &ret_data /* out data */, NULL);
 
diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
index 1cadaf9..5103351 100644
--- a/fs/cifs/smb2proto.h
+++ b/fs/cifs/smb2proto.h
@@ -125,8 +125,7 @@ extern int SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms,
      struct smb2_err_rsp **err_buf);
 extern int SMB2_ioctl(const unsigned int xid, struct cifs_tcon *tcon,
      u64 persistent_fid, u64 volatile_fid, u32 opcode,
-     bool is_fsctl, bool use_ipc,
-     char *in_data, u32 indatalen,
+     bool is_fsctl, char *in_data, u32 indatalen,
      char **out_data, u32 *plen /* returned data len */);
 extern int SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,
       u64 persistent_file_id, u64 volatile_file_id);
--
2.7.4


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[SRU][Artful][Bionic][PATCH 3/3] CIFS: dump IPC tcon in debug proc file

Joseph Salisbury-3
In reply to this post by Joseph Salisbury-3
From: Aurelien Aptel <[hidden email]>

BugLink: http://bugs.launchpad.net/bugs/1747572

dump it as first share with an "IPC: " prefix.

Signed-off-by: Aurelien Aptel <[hidden email]>
Signed-off-by: Steve French <[hidden email]>
Reviewed-by: Pavel Shilovsky <[hidden email]>
(cherry picked from commit 02cf5905e35df7e08691b6becda167858486da9a)
Signed-off-by: Joseph Salisbury <[hidden email]>
---
 fs/cifs/cifs_debug.c | 61 ++++++++++++++++++++++++++++++----------------------
 1 file changed, 35 insertions(+), 26 deletions(-)

diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
index 9727e1d..ef75e95 100644
--- a/fs/cifs/cifs_debug.c
+++ b/fs/cifs/cifs_debug.c
@@ -107,6 +107,32 @@ void cifs_dump_mids(struct TCP_Server_Info *server)
 }
 
 #ifdef CONFIG_PROC_FS
+static void cifs_debug_tcon(struct seq_file *m, struct cifs_tcon *tcon)
+{
+ __u32 dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
+
+ seq_printf(m, "%s Mounts: %d ", tcon->treeName, tcon->tc_count);
+ if (tcon->nativeFileSystem)
+ seq_printf(m, "Type: %s ", tcon->nativeFileSystem);
+ seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x\n\tPathComponentMax: %d Status: %d",
+   le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics),
+   le32_to_cpu(tcon->fsAttrInfo.Attributes),
+   le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength),
+   tcon->tidStatus);
+ if (dev_type == FILE_DEVICE_DISK)
+ seq_puts(m, " type: DISK ");
+ else if (dev_type == FILE_DEVICE_CD_ROM)
+ seq_puts(m, " type: CDROM ");
+ else
+ seq_printf(m, " type: %d ", dev_type);
+ if (tcon->ses->server->ops->dump_share_caps)
+ tcon->ses->server->ops->dump_share_caps(m, tcon);
+
+ if (tcon->need_reconnect)
+ seq_puts(m, "\tDISCONNECTED ");
+ seq_putc(m, '\n');
+}
+
 static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
 {
  struct list_head *tmp1, *tmp2, *tmp3;
@@ -115,7 +141,6 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
  struct cifs_ses *ses;
  struct cifs_tcon *tcon;
  int i, j;
- __u32 dev_type;
 
  seq_puts(m,
     "Display Internal CIFS Data Structures for Debugging\n"
@@ -184,35 +209,19 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
 
  seq_puts(m, "\n\tShares:");
  j = 0;
+
+ seq_printf(m, "\n\t%d) IPC: ", j);
+ if (ses->tcon_ipc)
+ cifs_debug_tcon(m, ses->tcon_ipc);
+ else
+ seq_puts(m, "none\n");
+
  list_for_each(tmp3, &ses->tcon_list) {
  tcon = list_entry(tmp3, struct cifs_tcon,
   tcon_list);
  ++j;
- dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
- seq_printf(m, "\n\t%d) %s Mounts: %d ", j,
-   tcon->treeName, tcon->tc_count);
- if (tcon->nativeFileSystem) {
- seq_printf(m, "Type: %s ",
-   tcon->nativeFileSystem);
- }
- seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x"
- "\n\tPathComponentMax: %d Status: %d",
- le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics),
- le32_to_cpu(tcon->fsAttrInfo.Attributes),
- le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength),
- tcon->tidStatus);
- if (dev_type == FILE_DEVICE_DISK)
- seq_puts(m, " type: DISK ");
- else if (dev_type == FILE_DEVICE_CD_ROM)
- seq_puts(m, " type: CDROM ");
- else
- seq_printf(m, " type: %d ", dev_type);
- if (server->ops->dump_share_caps)
- server->ops->dump_share_caps(m, tcon);
-
- if (tcon->need_reconnect)
- seq_puts(m, "\tDISCONNECTED ");
- seq_putc(m, '\n');
+ seq_printf(m, "\n\t%d) ", j);
+ cifs_debug_tcon(m, tcon);
  }
 
  seq_puts(m, "\n\tMIDs:\n");
--
2.7.4


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH 2/3] CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl

Joseph Salisbury-3
In reply to this post by Joseph Salisbury-3
Subject should have included: [Artful][Bionic]

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

ACK/cmnt: [SRU][Artful][Bionic][PATCH 0/3] Fixes for LP:1747572

Stefan Bader-2
In reply to this post by Joseph Salisbury-3
On 09.03.2018 09:33, Joseph Salisbury wrote:

> BugLink: http://bugs.launchpad.net/bugs/1747572
>
> == SRU Justification ==
> CIFS SMB2/SMB3 does not work for domain based DFS.  The bug reporter is
> having problems mounting a domain based DFS share using mount.cifs with the
> parameter vers=2.0 or vers=3.0, even though it works with the deprecated
> version vers=1.0.
>
> This bug was reported and fixed upstream by the requested three commits:
> https://bugzilla.samba.org/show_bug.cgi?id=12917
>
> The three requested commits are all in mainline as of v4.16-rc1.
>
> == Fixes ==
> b327a717e506 ("CIFS: make IPC a regular tcon")
> 63a83b861c47 ("CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl")
> 02cf5905e35d ("CIFS: dump IPC tcon in debug proc file")
>
> == Regression Potential ==
> Low.  Limited to cifs.
I am not sure that this is a low. CIFS is one of the rather more often used
network file systems. And fixing one case may break other use cases. On the pro-
side the suggested picks come from upstream. It was verified to at least fix the
issue. But I still suggest we carefully scan incoming issues for Samba bugs (as
well as keep an eye on 4.15.y upstream stable).

With adjusted risk:

Acked-by: Stefan Bader <[hidden email]>

>
> == Test Case ==
> A test kernel was built with this patch and tested by the original bug reporter.
> The bug reporter states the test kernel resolved the bug.
>
> Aurelien Aptel (3):
>   CIFS: make IPC a regular tcon
>   CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl
>   CIFS: dump IPC tcon in debug proc file
>
>  fs/cifs/cifs_debug.c |  61 ++++++++++++---------
>  fs/cifs/cifsglob.h   |  14 ++---
>  fs/cifs/cifssmb.c    |   7 +--
>  fs/cifs/connect.c    | 150 ++++++++++++++++++++++++++++++++++++++-------------
>  fs/cifs/inode.c      |   2 +-
>  fs/cifs/smb2file.c   |   2 +-
>  fs/cifs/smb2ops.c    |  53 ++++++++----------
>  fs/cifs/smb2pdu.c    |  40 ++++----------
>  fs/cifs/smb2proto.h  |   3 +-
>  9 files changed, 193 insertions(+), 139 deletions(-)
>


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team

signature.asc (836 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

ACK: [SRU][Artful][Bionic][PATCH 0/3] Fixes for LP:1747572

Kleber Souza
In reply to this post by Joseph Salisbury-3
On 03/09/18 09:33, Joseph Salisbury wrote:

> BugLink: http://bugs.launchpad.net/bugs/1747572
>
> == SRU Justification ==
> CIFS SMB2/SMB3 does not work for domain based DFS.  The bug reporter is
> having problems mounting a domain based DFS share using mount.cifs with the
> parameter vers=2.0 or vers=3.0, even though it works with the deprecated
> version vers=1.0.
>
> This bug was reported and fixed upstream by the requested three commits:
> https://bugzilla.samba.org/show_bug.cgi?id=12917
>
> The three requested commits are all in mainline as of v4.16-rc1.
>
> == Fixes ==
> b327a717e506 ("CIFS: make IPC a regular tcon")
> 63a83b861c47 ("CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl")
> 02cf5905e35d ("CIFS: dump IPC tcon in debug proc file")
>
> == Regression Potential ==
> Low.  Limited to cifs.
>
> == Test Case ==
> A test kernel was built with this patch and tested by the original bug reporter.
> The bug reporter states the test kernel resolved the bug.
>
> Aurelien Aptel (3):
>   CIFS: make IPC a regular tcon
>   CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl
>   CIFS: dump IPC tcon in debug proc file
>
>  fs/cifs/cifs_debug.c |  61 ++++++++++++---------
>  fs/cifs/cifsglob.h   |  14 ++---
>  fs/cifs/cifssmb.c    |   7 +--
>  fs/cifs/connect.c    | 150 ++++++++++++++++++++++++++++++++++++++-------------
>  fs/cifs/inode.c      |   2 +-
>  fs/cifs/smb2file.c   |   2 +-
>  fs/cifs/smb2ops.c    |  53 ++++++++----------
>  fs/cifs/smb2pdu.c    |  40 ++++----------
>  fs/cifs/smb2proto.h  |   3 +-
>  9 files changed, 193 insertions(+), 139 deletions(-)
>

Acked-by: Kleber Sacilotto de Souza <[hidden email]>

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

APPLIED[Artful/backlog]: [SRU][Artful][Bionic][PATCH 0/3] Fixes for LP:1747572

Kleber Souza
In reply to this post by Joseph Salisbury-3
On 03/09/18 09:33, Joseph Salisbury wrote:

> BugLink: http://bugs.launchpad.net/bugs/1747572
>
> == SRU Justification ==
> CIFS SMB2/SMB3 does not work for domain based DFS.  The bug reporter is
> having problems mounting a domain based DFS share using mount.cifs with the
> parameter vers=2.0 or vers=3.0, even though it works with the deprecated
> version vers=1.0.
>
> This bug was reported and fixed upstream by the requested three commits:
> https://bugzilla.samba.org/show_bug.cgi?id=12917
>
> The three requested commits are all in mainline as of v4.16-rc1.
>
> == Fixes ==
> b327a717e506 ("CIFS: make IPC a regular tcon")
> 63a83b861c47 ("CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl")
> 02cf5905e35d ("CIFS: dump IPC tcon in debug proc file")
>
> == Regression Potential ==
> Low.  Limited to cifs.
>
> == Test Case ==
> A test kernel was built with this patch and tested by the original bug reporter.
> The bug reporter states the test kernel resolved the bug.
>
> Aurelien Aptel (3):
>   CIFS: make IPC a regular tcon
>   CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl
>   CIFS: dump IPC tcon in debug proc file
>
>  fs/cifs/cifs_debug.c |  61 ++++++++++++---------
>  fs/cifs/cifsglob.h   |  14 ++---
>  fs/cifs/cifssmb.c    |   7 +--
>  fs/cifs/connect.c    | 150 ++++++++++++++++++++++++++++++++++++++-------------
>  fs/cifs/inode.c      |   2 +-
>  fs/cifs/smb2file.c   |   2 +-
>  fs/cifs/smb2ops.c    |  53 ++++++++----------
>  fs/cifs/smb2pdu.c    |  40 ++++----------
>  fs/cifs/smb2proto.h  |   3 +-
>  9 files changed, 193 insertions(+), 139 deletions(-)
>

Applied to artful/master-next-backlog branch.

Thanks,
Kleber

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

APPLIED[bionic]: [SRU][Artful][Bionic][PATCH 0/3] Fixes for LP:1747572

Seth Forshee
In reply to this post by Joseph Salisbury-3
On Fri, Mar 09, 2018 at 09:33:51AM +0100, Joseph Salisbury wrote:

> BugLink: http://bugs.launchpad.net/bugs/1747572
>
> == SRU Justification ==
> CIFS SMB2/SMB3 does not work for domain based DFS.  The bug reporter is
> having problems mounting a domain based DFS share using mount.cifs with the
> parameter vers=2.0 or vers=3.0, even though it works with the deprecated
> version vers=1.0.
>
> This bug was reported and fixed upstream by the requested three commits:
> https://bugzilla.samba.org/show_bug.cgi?id=12917
>
> The three requested commits are all in mainline as of v4.16-rc1.
>
> == Fixes ==
> b327a717e506 ("CIFS: make IPC a regular tcon")
> 63a83b861c47 ("CIFS: use tcon_ipc instead of use_ipc parameter of SMB2_ioctl")
> 02cf5905e35d ("CIFS: dump IPC tcon in debug proc file")
>
> == Regression Potential ==
> Low.  Limited to cifs.
>
> == Test Case ==
> A test kernel was built with this patch and tested by the original bug reporter.
> The bug reporter states the test kernel resolved the bug.

Applied to bionic/master-next, thanks!

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team