tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
master
head:   449dc8c97089a6e09fb2dac4d92b1b7ac0eb7c1e
commit: 69cea0d45a618ad4ae74f36386ef1af5128b2b19 dm mpath: changes from initial 
m->flags locking audit
date:   4 weeks ago
config: arm-randconfig-m031-20200808 (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>

New smatch warnings:
drivers/md/dm-mpath.c:432 choose_pgpath() error: double unlocked 'm->lock' 
(orig line 402)

Old smatch warnings:
drivers/md/dm-mpath.c:443 choose_pgpath() error: double unlocked 'm->lock' 
(orig line 389)
drivers/md/dm-mpath.c:593 __map_bio() error: double unlocked 'm->lock' (orig 
line 589)
drivers/md/dm-mpath.c:1574 pg_init_done() error: double unlocked 'm->lock' 
(orig line 1527)

vim +432 drivers/md/dm-mpath.c

   378  
   379  static struct pgpath *choose_pgpath(struct multipath *m, size_t 
nr_bytes)
   380  {
   381          unsigned long flags;
   382          struct priority_group *pg;
   383          struct pgpath *pgpath;
   384          unsigned bypassed = 1;
   385  
   386          if (!atomic_read(&m->nr_valid_paths)) {
   387                  spin_lock_irqsave(&m->lock, flags);
   388                  clear_bit(MPATHF_QUEUE_IO, &m->flags);
   389                  spin_unlock_irqrestore(&m->lock, flags);
   390                  goto failed;
   391          }
   392  
   393          /* Were we instructed to switch PG? */
   394          if (READ_ONCE(m->next_pg)) {
   395                  spin_lock_irqsave(&m->lock, flags);
   396                  pg = m->next_pg;
   397                  if (!pg) {
   398                          spin_unlock_irqrestore(&m->lock, flags);
   399                          goto check_current_pg;
   400                  }
   401                  m->next_pg = NULL;
 > 402                  spin_unlock_irqrestore(&m->lock, flags);
   403                  pgpath = choose_path_in_pg(m, pg, nr_bytes);
   404                  if (!IS_ERR_OR_NULL(pgpath))
   405                          return pgpath;
   406          }
   407  
   408          /* Don't change PG until it has no remaining paths */
   409  check_current_pg:
   410          pg = READ_ONCE(m->current_pg);
   411          if (pg) {
   412                  pgpath = choose_path_in_pg(m, pg, nr_bytes);
   413                  if (!IS_ERR_OR_NULL(pgpath))
   414                          return pgpath;
   415          }
   416  
   417          /*
   418           * Loop through priority groups until we find a valid path.
   419           * First time we skip PGs marked 'bypassed'.
   420           * Second time we only try the ones we skipped, but set
   421           * pg_init_delay_retry so we do not hammer controllers.
   422           */
   423          do {
   424                  list_for_each_entry(pg, &m->priority_groups, list) {
   425                          if (pg->bypassed == !!bypassed)
   426                                  continue;
   427                          pgpath = choose_path_in_pg(m, pg, nr_bytes);
   428                          if (!IS_ERR_OR_NULL(pgpath)) {
   429                                  if (!bypassed) {
   430                                          spin_lock_irqsave(&m->lock, 
flags);
   431                                          
set_bit(MPATHF_PG_INIT_DELAY_RETRY, &m->flags);
 > 432                                          
 > spin_unlock_irqrestore(&m->lock, flags);
   433                                  }
   434                                  return pgpath;
   435                          }
   436                  }
   437          } while (bypassed--);
   438  
   439  failed:
   440          spin_lock_irqsave(&m->lock, flags);
   441          m->current_pgpath = NULL;
   442          m->current_pg = NULL;
   443          spin_unlock_irqrestore(&m->lock, flags);
   444  
   445          return NULL;
   446  }
   447  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

Reply via email to