Hi Long,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on cifs/for-next]
[also build test ERROR on v4.17-rc4 next-20180507]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Long-Li/cifs-smbd-Make-upper-layer-decide-when-to-destroy-the-transport/20180508-110150
base:   git://git.samba.org/sfrench/cifs-2.6.git for-next
config: i386-randconfig-x013-201818 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=i386 

All errors (new ones prefixed by >>):

   fs//cifs/connect.c: In function 'cifs_reconnect':
>> fs//cifs/connect.c:381:16: error: passing argument 1 of 'smbd_destroy' from 
>> incompatible pointer type [-Werror=incompatible-pointer-types]
      smbd_destroy(server);
                   ^~~~~~
   In file included from fs//cifs/connect.c:58:0:
   fs//cifs/smbdirect.h:334:20: note: expected 'struct smbd_connection *' but 
argument is of type 'struct TCP_Server_Info *'
    static inline void smbd_destroy(struct smbd_connection *info) {}
                       ^~~~~~~~~~~~
   fs//cifs/connect.c: In function 'clean_demultiplex_info':
   fs//cifs/connect.c:715:16: error: passing argument 1 of 'smbd_destroy' from 
incompatible pointer type [-Werror=incompatible-pointer-types]
      smbd_destroy(server);
                   ^~~~~~
   In file included from fs//cifs/connect.c:58:0:
   fs//cifs/smbdirect.h:334:20: note: expected 'struct smbd_connection *' but 
argument is of type 'struct TCP_Server_Info *'
    static inline void smbd_destroy(struct smbd_connection *info) {}
                       ^~~~~~~~~~~~
   Cyclomatic Complexity 5 include/linux/compiler.h:__read_once_size
   Cyclomatic Complexity 5 include/linux/compiler.h:__write_once_size
   Cyclomatic Complexity 1 include/linux/kasan-checks.h:kasan_check_read
   Cyclomatic Complexity 1 include/linux/kasan-checks.h:kasan_check_write
   Cyclomatic Complexity 2 arch/x86/include/asm/bitops.h:set_bit
   Cyclomatic Complexity 2 arch/x86/include/asm/bitops.h:clear_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:test_and_set_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:constant_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:variable_test_bit
   Cyclomatic Complexity 1 arch/x86/include/asm/bitops.h:fls
   Cyclomatic Complexity 1 
include/uapi/linux/byteorder/little_endian.h:__le16_to_cpup
   Cyclomatic Complexity 1 include/linux/log2.h:__ilog2_u32
   Cyclomatic Complexity 1 include/linux/list.h:INIT_LIST_HEAD
   Cyclomatic Complexity 1 include/linux/list.h:__list_add_valid
   Cyclomatic Complexity 1 include/linux/list.h:__list_del_entry_valid
   Cyclomatic Complexity 2 include/linux/list.h:__list_add
   Cyclomatic Complexity 1 include/linux/list.h:list_add
   Cyclomatic Complexity 1 include/linux/list.h:__list_del
   Cyclomatic Complexity 2 include/linux/list.h:__list_del_entry
   Cyclomatic Complexity 1 include/linux/list.h:list_del_init
   Cyclomatic Complexity 1 include/linux/list.h:list_move
   Cyclomatic Complexity 1 include/linux/list.h:list_empty
   Cyclomatic Complexity 1 arch/x86/include/asm/current.h:get_current
   Cyclomatic Complexity 1 include/linux/string.h:strnlen
   Cyclomatic Complexity 4 include/linux/string.h:strlen
   Cyclomatic Complexity 6 include/linux/string.h:strlcpy
   Cyclomatic Complexity 3 include/linux/string.h:memset
   Cyclomatic Complexity 4 include/linux/string.h:memcpy
   Cyclomatic Complexity 2 include/linux/string.h:strcpy
   Cyclomatic Complexity 1 include/asm-generic/getorder.h:__get_order
   Cyclomatic Complexity 1 include/linux/err.h:ERR_PTR
   Cyclomatic Complexity 1 include/linux/err.h:PTR_ERR
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_read
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_inc
   Cyclomatic Complexity 1 
arch/x86/include/asm/atomic.h:arch_atomic_dec_and_test
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_add_return
   Cyclomatic Complexity 1 arch/x86/include/asm/atomic.h:arch_atomic_sub_return
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_read
   Cyclomatic Complexity 1 include/asm-generic/atomic-instrumented.h:atomic_inc
   Cyclomatic Complexity 1 
include/asm-generic/atomic-instrumented.h:atomic_inc_return
   Cyclomatic Complexity 1 
include/asm-generic/atomic-instrumented.h:atomic_dec_return
   Cyclomatic Complexity 1 
include/asm-generic/atomic-instrumented.h:atomic_dec_and_test
   Cyclomatic Complexity 5 arch/x86/include/asm/preempt.h:__preempt_count_sub
   Cyclomatic Complexity 1 include/linux/spinlock.h:spinlock_check
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_lock
   Cyclomatic Complexity 1 include/linux/spinlock.h:spin_unlock
   Cyclomatic Complexity 1 include/linux/uidgid.h:__kuid_val
   Cyclomatic Complexity 1 include/linux/uidgid.h:__kgid_val
   Cyclomatic Complexity 1 include/linux/uidgid.h:uid_eq
   Cyclomatic Complexity 1 include/linux/uidgid.h:gid_eq
   Cyclomatic Complexity 1 include/linux/uidgid.h:uid_gt
   Cyclomatic Complexity 1 include/linux/uidgid.h:uid_lt
   Cyclomatic Complexity 1 include/linux/uidgid.h:uid_valid
   Cyclomatic Complexity 1 include/linux/uidgid.h:gid_valid
   Cyclomatic Complexity 1 include/linux/uidgid.h:make_kuid
   Cyclomatic Complexity 1 include/linux/uidgid.h:make_kgid
   Cyclomatic Complexity 1 include/linux/uidgid.h:from_kuid
   Cyclomatic Complexity 1 include/linux/rbtree.h:rb_link_node
   Cyclomatic Complexity 1 include/linux/debug_locks.h:debug_check_no_locks_held
   Cyclomatic Complexity 1 include/linux/workqueue.h:__init_work
   Cyclomatic Complexity 1 include/linux/uio.h:iov_iter_count
   Cyclomatic Complexity 1 include/linux/socket.h:msg_data_left
   Cyclomatic Complexity 1 include/linux/sched.h:task_pid_nr
   Cyclomatic Complexity 1 include/linux/sched.h:task_thread_info
   Cyclomatic Complexity 1 include/linux/cred.h:current_user_ns
   Cyclomatic Complexity 1 include/linux/kasan.h:kasan_kmalloc
   Cyclomatic Complexity 28 include/linux/slab.h:kmalloc_index
   Cyclomatic Complexity 1 include/linux/slab.h:kmem_cache_alloc_trace
   Cyclomatic Complexity 1 include/linux/slab.h:kmalloc_order_trace
   Cyclomatic Complexity 67 include/linux/slab.h:kmalloc_large
   Cyclomatic Complexity 5 include/linux/slab.h:kmalloc
   Cyclomatic Complexity 1 include/linux/slab.h:kzalloc
   Cyclomatic Complexity 2 include/linux/ctype.h:__toupper
   Cyclomatic Complexity 1 include/linux/utsname.h:utsname
   Cyclomatic Complexity 1 include/net/net_namespace.h:get_net
   Cyclomatic Complexity 1 include/net/net_namespace.h:put_net
   Cyclomatic Complexity 1 include/net/net_namespace.h:net_eq
   Cyclomatic Complexity 1 include/linux/module.h:__module_get
   Cyclomatic Complexity 1 include/linux/module.h:module_put
   Cyclomatic Complexity 1 include/keys/user-type.h:user_key_payload_locked
   Cyclomatic Complexity 1 include/net/ipv6.h:ipv6_addr_equal
   Cyclomatic Complexity 1 
include/linux/unaligned/access_ok.h:get_unaligned_le16
   Cyclomatic Complexity 1 fs//cifs/cifspdu.h:BCC
   Cyclomatic Complexity 1 fs//cifs/cifspdu.h:get_bcc
   Cyclomatic Complexity 1 fs//cifs/cifsglob.h:set_credits
   Cyclomatic Complexity 1 fs//cifs/cifsglob.h:get_next_mid

vim +/smbd_destroy +381 fs//cifs/connect.c

   312  
   313  static int ip_connect(struct TCP_Server_Info *server);
   314  static int generic_ip_connect(struct TCP_Server_Info *server);
   315  static void tlink_rb_insert(struct rb_root *root, struct tcon_link 
*new_tlink);
   316  static void cifs_prune_tlinks(struct work_struct *work);
   317  static int cifs_setup_volume_info(struct smb_vol *volume_info, char 
*mount_data,
   318                                          const char *devname);
   319  
   320  /*
   321   * cifs tcp session reconnection
   322   *
   323   * mark tcp session as reconnecting so temporarily locked
   324   * mark all smb sessions as reconnecting for tcp session
   325   * reconnect tcp session
   326   * wake up waiters on reconnection? - (not needed currently)
   327   */
   328  int
   329  cifs_reconnect(struct TCP_Server_Info *server)
   330  {
   331          int rc = 0;
   332          struct list_head *tmp, *tmp2;
   333          struct cifs_ses *ses;
   334          struct cifs_tcon *tcon;
   335          struct mid_q_entry *mid_entry;
   336          struct list_head retry_list;
   337  
   338          spin_lock(&GlobalMid_Lock);
   339          if (server->tcpStatus == CifsExiting) {
   340                  /* the demux thread will exit normally
   341                  next time through the loop */
   342                  spin_unlock(&GlobalMid_Lock);
   343                  return rc;
   344          } else
   345                  server->tcpStatus = CifsNeedReconnect;
   346          spin_unlock(&GlobalMid_Lock);
   347          server->maxBuf = 0;
   348          server->max_read = 0;
   349  
   350          cifs_dbg(FYI, "Reconnecting tcp session\n");
   351  
   352          /* before reconnecting the tcp session, mark the smb session 
(uid)
   353                  and the tid bad so they are not used until reconnected 
*/
   354          cifs_dbg(FYI, "%s: marking sessions and tcons for reconnect\n",
   355                   __func__);
   356          spin_lock(&cifs_tcp_ses_lock);
   357          list_for_each(tmp, &server->smb_ses_list) {
   358                  ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
   359                  ses->need_reconnect = true;
   360                  list_for_each(tmp2, &ses->tcon_list) {
   361                          tcon = list_entry(tmp2, struct cifs_tcon, 
tcon_list);
   362                          tcon->need_reconnect = true;
   363                  }
   364                  if (ses->tcon_ipc)
   365                          ses->tcon_ipc->need_reconnect = true;
   366          }
   367          spin_unlock(&cifs_tcp_ses_lock);
   368  
   369          /* do not want to be sending data on a socket we are freeing */
   370          cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
   371          mutex_lock(&server->srv_mutex);
   372          if (server->ssocket) {
   373                  cifs_dbg(FYI, "State: 0x%x Flags: 0x%lx\n",
   374                           server->ssocket->state, 
server->ssocket->flags);
   375                  kernel_sock_shutdown(server->ssocket, SHUT_WR);
   376                  cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 
0x%lx\n",
   377                           server->ssocket->state, 
server->ssocket->flags);
   378                  sock_release(server->ssocket);
   379                  server->ssocket = NULL;
   380          } else if (cifs_rdma_enabled(server))
 > 381                  smbd_destroy(server);
   382          server->sequence_number = 0;
   383          server->session_estab = false;
   384          kfree(server->session_key.response);
   385          server->session_key.response = NULL;
   386          server->session_key.len = 0;
   387          server->lstrp = jiffies;
   388  
   389          /* mark submitted MIDs for retry and issue callback */
   390          INIT_LIST_HEAD(&retry_list);
   391          cifs_dbg(FYI, "%s: moving mids to private list\n", __func__);
   392          spin_lock(&GlobalMid_Lock);
   393          list_for_each_safe(tmp, tmp2, &server->pending_mid_q) {
   394                  mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
   395                  if (mid_entry->mid_state == MID_REQUEST_SUBMITTED)
   396                          mid_entry->mid_state = MID_RETRY_NEEDED;
   397                  list_move(&mid_entry->qhead, &retry_list);
   398          }
   399          spin_unlock(&GlobalMid_Lock);
   400          mutex_unlock(&server->srv_mutex);
   401  
   402          cifs_dbg(FYI, "%s: issuing mid callbacks\n", __func__);
   403          list_for_each_safe(tmp, tmp2, &retry_list) {
   404                  mid_entry = list_entry(tmp, struct mid_q_entry, qhead);
   405                  list_del_init(&mid_entry->qhead);
   406                  mid_entry->callback(mid_entry);
   407          }
   408  
   409          do {
   410                  try_to_freeze();
   411  
   412                  /* we should try only the port we connected to before */
   413                  mutex_lock(&server->srv_mutex);
   414                  if (cifs_rdma_enabled(server))
   415                          rc = smbd_reconnect(server);
   416                  else
   417                          rc = generic_ip_connect(server);
   418                  if (rc) {
   419                          cifs_dbg(FYI, "reconnect error %d\n", rc);
   420                          mutex_unlock(&server->srv_mutex);
   421                          msleep(3000);
   422                  } else {
   423                          atomic_inc(&tcpSesReconnectCount);
   424                          spin_lock(&GlobalMid_Lock);
   425                          if (server->tcpStatus != CifsExiting)
   426                                  server->tcpStatus = CifsNeedNegotiate;
   427                          spin_unlock(&GlobalMid_Lock);
   428                          mutex_unlock(&server->srv_mutex);
   429                  }
   430          } while (server->tcpStatus == CifsNeedReconnect);
   431  
   432          if (server->tcpStatus == CifsNeedNegotiate)
   433                  mod_delayed_work(cifsiod_wq, &server->echo, 0);
   434  
   435          return rc;
   436  }
   437  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip

Reply via email to