All of lore.kernel.org
 help / color / mirror / Atom feed
* [hare-scsi-devel:reserved-tags.v4 4/22] drivers/scsi/fnic/fnic_scsi.c:2500 fnic_device_reset() error: we previously assumed 'reset_sc' could be null (see line 2336)
@ 2020-07-07 14:30 ` Dan Carpenter
  0 siblings, 0 replies; 3+ messages in thread
From: Dan Carpenter @ 2020-07-07 14:30 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 20239 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git reserved-tags.v4
head:   2a2c3155f8291828f41350cf90a0c8a37cdd263c
commit: 3b695cc5f04ad6099906a94408410af8078704bf [4/22] fnic: use internal commands
config: i386-randconfig-m021-20200705 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-14) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
drivers/scsi/fnic/fnic_scsi.c:2500 fnic_device_reset() error: we previously assumed 'reset_sc' could be null (see line 2336)

# https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git/commit/?id=3b695cc5f04ad6099906a94408410af8078704bf
git remote add hare-scsi-devel https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git
git remote update hare-scsi-devel
git checkout 3b695cc5f04ad6099906a94408410af8078704bf
vim +/reset_sc +2500 drivers/scsi/fnic/fnic_scsi.c

5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2290  int fnic_device_reset(struct scsi_cmnd *sc)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2291  {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2292  	struct fc_lport *lp;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2293  	struct fnic *fnic;
4d7007b49d523d Hiral Patel       2013-02-12  2294  	struct fnic_io_req *io_req = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2295  	struct fc_rport *rport;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2296  	int status;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2297  	int ret = FAILED;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2298  	spinlock_t *io_lock;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2299  	unsigned long flags;
14eb5d905d16ec Hiral Patel       2013-02-12  2300  	unsigned long start_time = 0;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2301  	struct scsi_device *sdev = sc->device;
03298552cba38f Hiral Patel       2013-02-12  2302  	struct scsi_lun fc_lun;
67125b0287a9e6 Hiral Patel       2013-09-12  2303  	struct fnic_stats *fnic_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2304  	struct reset_stats *reset_stats;
4d7007b49d523d Hiral Patel       2013-02-12  2305  	int tag = 0;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2306  	DECLARE_COMPLETION_ONSTACK(tm_done);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2307  	struct scsi_cmnd *reset_sc = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2308  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2309  	/* Wait for rport to unblock */
65d430fa99cbd0 Christof Schmitt  2009-10-30  2310  	fc_block_scsi_eh(sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2311  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2312  	/* Get local-port, check ready and link up */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2313  	lp = shost_priv(sdev->host);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2314  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2315  	fnic = lport_priv(lp);
67125b0287a9e6 Hiral Patel       2013-09-12  2316  	fnic_stats = &fnic->fnic_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2317  	reset_stats = &fnic->fnic_stats.reset_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2318  
67125b0287a9e6 Hiral Patel       2013-09-12  2319  	atomic64_inc(&reset_stats->device_resets);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2320  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2321  	rport = starget_to_rport(scsi_target(sdev));
0db6f4353d68c0 Roel Kluin        2010-06-11  2322  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
9cb78c16f5dade Hannes Reinecke   2014-06-25  2323  		      "Device reset called FCID 0x%x, LUN 0x%llx sc 0x%p\n",
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2324  		      rport->port_id, sdev->lun, sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2325  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2326  	if (lp->state != LPORT_ST_READY || !(lp->link_up))
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2327  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2328  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2329  	/* Check if remote port up */
67125b0287a9e6 Hiral Patel       2013-09-12  2330  	if (fc_remote_port_chkready(rport)) {
67125b0287a9e6 Hiral Patel       2013-09-12  2331  		atomic64_inc(&fnic_stats->misc_stats.rport_not_ready);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2332  		goto fnic_device_reset_end;
67125b0287a9e6 Hiral Patel       2013-09-12  2333  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2334  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2335  	reset_sc = scsi_get_internal_cmd(sdev, DMA_NONE, REQ_NOWAIT);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11 @2336  	if (unlikely(!reset_sc))
03298552cba38f Hiral Patel       2013-02-12  2337  		goto fnic_device_reset_end;
                                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
NULL on this path.

3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2338  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2339  	CMD_FLAGS(reset_sc) = FNIC_DEVICE_RESET;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2340  	tag = reset_sc->request->tag;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2341  	io_lock = fnic_io_lock_hash(fnic, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2342  	spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2343  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2344  	/*
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2345  	 * Allocate a new io_req.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2346  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2347  	io_req = mempool_alloc(fnic->io_req_pool, GFP_ATOMIC);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2348  	if (!io_req) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2349  		spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2350  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2351  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2352  	memset(io_req, 0, sizeof(*io_req));
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2353  	io_req->port_id = rport->port_id;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2354  	CMD_SP(reset_sc) = (char *)io_req;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2355  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2356  	io_req->dr_done = &tm_done;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2357  	CMD_STATE(reset_sc) = FNIC_IOREQ_CMD_PENDING;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2358  	CMD_LR_STATUS(reset_sc) = FCPIO_INVALID_CODE;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2359  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2360  
03298552cba38f Hiral Patel       2013-02-12  2361  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host, "TAG %x\n", tag);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2362  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2363  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2364  	 * issue the device reset, if enqueue failed, clean up the ioreq
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2365  	 * and break assoc with scsi cmd
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2366  	 */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2367  	if (fnic_queue_dr_io_req(fnic, reset_sc, io_req)) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2368  		spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2369  		io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2370  		if (io_req)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2371  			io_req->dr_done = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2372  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2373  	}
03298552cba38f Hiral Patel       2013-02-12  2374  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2375  	CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_ISSUED;
03298552cba38f Hiral Patel       2013-02-12  2376  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2377  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2378  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2379  	 * Wait on the local completion for LUN reset.  The io_req may be
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2380  	 * freed while we wait since we hold no lock.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2381  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2382  	wait_for_completion_timeout(&tm_done,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2383  				    msecs_to_jiffies(FNIC_LUN_RESET_TIMEOUT));
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2384  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2385  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2386  	io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2387  	if (!io_req) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2388  		spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2389  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2390  				"io_req is null tag 0x%x sc 0x%p\n", tag, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2391  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2392  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2393  	io_req->dr_done = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2394  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2395  	status = CMD_LR_STATUS(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2396  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2397  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2398  	 * If lun reset not completed, bail out with failed. io_req
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2399  	 * gets cleaned up during higher levels of EH
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2400  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2401  	if (status == FCPIO_INVALID_CODE) {
67125b0287a9e6 Hiral Patel       2013-09-12  2402  		atomic64_inc(&reset_stats->device_reset_timeouts);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2403  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2404  			      "Device reset timed out\n");
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2405  		CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_TIMED_OUT;
03298552cba38f Hiral Patel       2013-02-12  2406  		spin_unlock_irqrestore(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2407  		int_to_scsilun(sdev->lun, &fc_lun);
03298552cba38f Hiral Patel       2013-02-12  2408  		/*
1259c5dc752474 Sesidhar Beddel   2013-09-09  2409  		 * Issue abort and terminate on device reset request.
1259c5dc752474 Sesidhar Beddel   2013-09-09  2410  		 * If q'ing of terminate fails, retry it after a delay.
03298552cba38f Hiral Patel       2013-02-12  2411  		 */
03298552cba38f Hiral Patel       2013-02-12  2412  		while (1) {
03298552cba38f Hiral Patel       2013-02-12  2413  			spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2414  			if (CMD_FLAGS(reset_sc) & FNIC_DEV_RST_TERM_ISSUED) {
03298552cba38f Hiral Patel       2013-02-12  2415  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2416  				break;
03298552cba38f Hiral Patel       2013-02-12  2417  			}
03298552cba38f Hiral Patel       2013-02-12  2418  			spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2419  			if (fnic_queue_abort_io_req(fnic,
03298552cba38f Hiral Patel       2013-02-12  2420  				tag | FNIC_TAG_DEV_RST,
03298552cba38f Hiral Patel       2013-02-12  2421  				FCPIO_ITMF_ABT_TASK_TERM,
03298552cba38f Hiral Patel       2013-02-12  2422  				fc_lun.scsi_lun, io_req)) {
03298552cba38f Hiral Patel       2013-02-12  2423  				wait_for_completion_timeout(&tm_done,
03298552cba38f Hiral Patel       2013-02-12  2424  				msecs_to_jiffies(FNIC_ABT_TERM_DELAY_TIMEOUT));
03298552cba38f Hiral Patel       2013-02-12  2425  			} else {
03298552cba38f Hiral Patel       2013-02-12  2426  				spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2427  				CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_TERM_ISSUED;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2428  				CMD_STATE(reset_sc) = FNIC_IOREQ_ABTS_PENDING;
03298552cba38f Hiral Patel       2013-02-12  2429  				io_req->abts_done = &tm_done;
03298552cba38f Hiral Patel       2013-02-12  2430  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2431  				FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
03298552cba38f Hiral Patel       2013-02-12  2432  				"Abort and terminate issued on Device reset "
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2433  				"tag 0x%x sc 0x%p\n", tag, reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2434  				break;
03298552cba38f Hiral Patel       2013-02-12  2435  			}
03298552cba38f Hiral Patel       2013-02-12  2436  		}
03298552cba38f Hiral Patel       2013-02-12  2437  		while (1) {
03298552cba38f Hiral Patel       2013-02-12  2438  			spin_lock_irqsave(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2439  			if (!(CMD_FLAGS(sc) & FNIC_DEV_RST_DONE)) {
03298552cba38f Hiral Patel       2013-02-12  2440  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2441  				wait_for_completion_timeout(&tm_done,
03298552cba38f Hiral Patel       2013-02-12  2442  				msecs_to_jiffies(FNIC_LUN_RESET_TIMEOUT));
03298552cba38f Hiral Patel       2013-02-12  2443  				break;
03298552cba38f Hiral Patel       2013-02-12  2444  			} else {
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2445  				io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2446  				io_req->abts_done = NULL;
03298552cba38f Hiral Patel       2013-02-12  2447  				goto fnic_device_reset_clean;
03298552cba38f Hiral Patel       2013-02-12  2448  			}
03298552cba38f Hiral Patel       2013-02-12  2449  		}
03298552cba38f Hiral Patel       2013-02-12  2450  	} else {
03298552cba38f Hiral Patel       2013-02-12  2451  		spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2452  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2453  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2454  	/* Completed, but not successful, clean up the io_req, return fail */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2455  	if (status != FCPIO_SUCCESS) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2456  		spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2457  		FNIC_SCSI_DBG(KERN_DEBUG,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2458  			      fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2459  			      "Device reset completed - failed\n");
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2460  		io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2461  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2462  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2463  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2464  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2465  	 * Clean up any aborts on this lun that have still not
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2466  	 * completed. If any of these fail, then LUN reset fails.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2467  	 * clean_pending_aborts cleans all cmds on this lun except
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2468  	 * the lun reset cmd. If all cmds get cleaned, the lun reset
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2469  	 * succeeds
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2470  	 */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2471  	if (fnic_clean_pending_aborts(fnic, reset_sc)) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2472  		spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2473  		io_req = (struct fnic_io_req *)CMD_SP(sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2474  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2475  			      "Device reset failed"
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2476  			      " since could not abort all IOs\n");
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2477  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2478  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2479  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2480  	/* Clean lun reset command */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2481  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2482  	io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2483  	if (io_req)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2484  		/* Completed, and successful */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2485  		ret = SUCCESS;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2486  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2487  fnic_device_reset_clean:
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2488  	if (io_req)
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2489  		CMD_SP(reset_sc) = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2490  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2491  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2492  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2493  	if (io_req) {
14eb5d905d16ec Hiral Patel       2013-02-12  2494  		start_time = io_req->start_time;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2495  		fnic_release_ioreq_buf(fnic, io_req, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2496  		mempool_free(io_req, fnic->io_req_pool);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2497  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2498  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2499  fnic_device_reset_end:
3b695cc5f04ad6 Hannes Reinecke   2020-03-11 @2500  	FNIC_TRACE(fnic_device_reset, sdev->host->host_no,
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2501  		   reset_sc->request->tag, reset_sc,
                                                                   ^^^^^^^^^^^^^^^^^
Unchecked dereference.

4d7007b49d523d Hiral Patel       2013-02-12  2502  		  jiffies_to_msecs(jiffies - start_time),
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2503  		  0, ((u64)reset_sc->cmnd[0] << 32 |
4d7007b49d523d Hiral Patel       2013-02-12  2504  		  (u64)sc->cmnd[2] << 24 | (u64)sc->cmnd[3] << 16 |
4d7007b49d523d Hiral Patel       2013-02-12  2505  		  (u64)sc->cmnd[4] << 8 | sc->cmnd[5]),
4d7007b49d523d Hiral Patel       2013-02-12  2506  		  (((u64)CMD_FLAGS(sc) << 32) | CMD_STATE(sc)));
4d7007b49d523d Hiral Patel       2013-02-12  2507  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2508  	/* free internal command if it is allocated */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2509  	if (reset_sc)
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2510  		scsi_put_internal_cmd(reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2511  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2512  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2513  		      "Returning from device reset %s\n",
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2514  		      (ret == SUCCESS) ?
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2515  		      "SUCCESS" : "FAILED");
67125b0287a9e6 Hiral Patel       2013-09-12  2516  
67125b0287a9e6 Hiral Patel       2013-09-12  2517  	if (ret == FAILED)
67125b0287a9e6 Hiral Patel       2013-09-12  2518  		atomic64_inc(&reset_stats->device_reset_failures);
67125b0287a9e6 Hiral Patel       2013-09-12  2519  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2520  	return ret;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2521  }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 37076 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [hare-scsi-devel:reserved-tags.v4 4/22] drivers/scsi/fnic/fnic_scsi.c:2500 fnic_device_reset() error: we previously assumed 'reset_sc' could be null (see line 2336)
@ 2020-07-07 14:30 ` Dan Carpenter
  0 siblings, 0 replies; 3+ messages in thread
From: Dan Carpenter @ 2020-07-07 14:30 UTC (permalink / raw)
  To: kbuild-all

[-- Attachment #1: Type: text/plain, Size: 20239 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git reserved-tags.v4
head:   2a2c3155f8291828f41350cf90a0c8a37cdd263c
commit: 3b695cc5f04ad6099906a94408410af8078704bf [4/22] fnic: use internal commands
config: i386-randconfig-m021-20200705 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-14) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
drivers/scsi/fnic/fnic_scsi.c:2500 fnic_device_reset() error: we previously assumed 'reset_sc' could be null (see line 2336)

# https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git/commit/?id=3b695cc5f04ad6099906a94408410af8078704bf
git remote add hare-scsi-devel https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git
git remote update hare-scsi-devel
git checkout 3b695cc5f04ad6099906a94408410af8078704bf
vim +/reset_sc +2500 drivers/scsi/fnic/fnic_scsi.c

5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2290  int fnic_device_reset(struct scsi_cmnd *sc)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2291  {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2292  	struct fc_lport *lp;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2293  	struct fnic *fnic;
4d7007b49d523d Hiral Patel       2013-02-12  2294  	struct fnic_io_req *io_req = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2295  	struct fc_rport *rport;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2296  	int status;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2297  	int ret = FAILED;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2298  	spinlock_t *io_lock;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2299  	unsigned long flags;
14eb5d905d16ec Hiral Patel       2013-02-12  2300  	unsigned long start_time = 0;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2301  	struct scsi_device *sdev = sc->device;
03298552cba38f Hiral Patel       2013-02-12  2302  	struct scsi_lun fc_lun;
67125b0287a9e6 Hiral Patel       2013-09-12  2303  	struct fnic_stats *fnic_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2304  	struct reset_stats *reset_stats;
4d7007b49d523d Hiral Patel       2013-02-12  2305  	int tag = 0;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2306  	DECLARE_COMPLETION_ONSTACK(tm_done);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2307  	struct scsi_cmnd *reset_sc = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2308  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2309  	/* Wait for rport to unblock */
65d430fa99cbd0 Christof Schmitt  2009-10-30  2310  	fc_block_scsi_eh(sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2311  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2312  	/* Get local-port, check ready and link up */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2313  	lp = shost_priv(sdev->host);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2314  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2315  	fnic = lport_priv(lp);
67125b0287a9e6 Hiral Patel       2013-09-12  2316  	fnic_stats = &fnic->fnic_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2317  	reset_stats = &fnic->fnic_stats.reset_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2318  
67125b0287a9e6 Hiral Patel       2013-09-12  2319  	atomic64_inc(&reset_stats->device_resets);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2320  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2321  	rport = starget_to_rport(scsi_target(sdev));
0db6f4353d68c0 Roel Kluin        2010-06-11  2322  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
9cb78c16f5dade Hannes Reinecke   2014-06-25  2323  		      "Device reset called FCID 0x%x, LUN 0x%llx sc 0x%p\n",
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2324  		      rport->port_id, sdev->lun, sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2325  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2326  	if (lp->state != LPORT_ST_READY || !(lp->link_up))
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2327  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2328  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2329  	/* Check if remote port up */
67125b0287a9e6 Hiral Patel       2013-09-12  2330  	if (fc_remote_port_chkready(rport)) {
67125b0287a9e6 Hiral Patel       2013-09-12  2331  		atomic64_inc(&fnic_stats->misc_stats.rport_not_ready);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2332  		goto fnic_device_reset_end;
67125b0287a9e6 Hiral Patel       2013-09-12  2333  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2334  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2335  	reset_sc = scsi_get_internal_cmd(sdev, DMA_NONE, REQ_NOWAIT);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11 @2336  	if (unlikely(!reset_sc))
03298552cba38f Hiral Patel       2013-02-12  2337  		goto fnic_device_reset_end;
                                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^
NULL on this path.

3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2338  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2339  	CMD_FLAGS(reset_sc) = FNIC_DEVICE_RESET;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2340  	tag = reset_sc->request->tag;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2341  	io_lock = fnic_io_lock_hash(fnic, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2342  	spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2343  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2344  	/*
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2345  	 * Allocate a new io_req.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2346  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2347  	io_req = mempool_alloc(fnic->io_req_pool, GFP_ATOMIC);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2348  	if (!io_req) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2349  		spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2350  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2351  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2352  	memset(io_req, 0, sizeof(*io_req));
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2353  	io_req->port_id = rport->port_id;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2354  	CMD_SP(reset_sc) = (char *)io_req;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2355  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2356  	io_req->dr_done = &tm_done;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2357  	CMD_STATE(reset_sc) = FNIC_IOREQ_CMD_PENDING;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2358  	CMD_LR_STATUS(reset_sc) = FCPIO_INVALID_CODE;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2359  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2360  
03298552cba38f Hiral Patel       2013-02-12  2361  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host, "TAG %x\n", tag);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2362  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2363  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2364  	 * issue the device reset, if enqueue failed, clean up the ioreq
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2365  	 * and break assoc with scsi cmd
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2366  	 */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2367  	if (fnic_queue_dr_io_req(fnic, reset_sc, io_req)) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2368  		spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2369  		io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2370  		if (io_req)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2371  			io_req->dr_done = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2372  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2373  	}
03298552cba38f Hiral Patel       2013-02-12  2374  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2375  	CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_ISSUED;
03298552cba38f Hiral Patel       2013-02-12  2376  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2377  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2378  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2379  	 * Wait on the local completion for LUN reset.  The io_req may be
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2380  	 * freed while we wait since we hold no lock.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2381  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2382  	wait_for_completion_timeout(&tm_done,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2383  				    msecs_to_jiffies(FNIC_LUN_RESET_TIMEOUT));
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2384  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2385  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2386  	io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2387  	if (!io_req) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2388  		spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2389  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2390  				"io_req is null tag 0x%x sc 0x%p\n", tag, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2391  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2392  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2393  	io_req->dr_done = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2394  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2395  	status = CMD_LR_STATUS(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2396  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2397  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2398  	 * If lun reset not completed, bail out with failed. io_req
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2399  	 * gets cleaned up during higher levels of EH
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2400  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2401  	if (status == FCPIO_INVALID_CODE) {
67125b0287a9e6 Hiral Patel       2013-09-12  2402  		atomic64_inc(&reset_stats->device_reset_timeouts);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2403  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2404  			      "Device reset timed out\n");
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2405  		CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_TIMED_OUT;
03298552cba38f Hiral Patel       2013-02-12  2406  		spin_unlock_irqrestore(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2407  		int_to_scsilun(sdev->lun, &fc_lun);
03298552cba38f Hiral Patel       2013-02-12  2408  		/*
1259c5dc752474 Sesidhar Beddel   2013-09-09  2409  		 * Issue abort and terminate on device reset request.
1259c5dc752474 Sesidhar Beddel   2013-09-09  2410  		 * If q'ing of terminate fails, retry it after a delay.
03298552cba38f Hiral Patel       2013-02-12  2411  		 */
03298552cba38f Hiral Patel       2013-02-12  2412  		while (1) {
03298552cba38f Hiral Patel       2013-02-12  2413  			spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2414  			if (CMD_FLAGS(reset_sc) & FNIC_DEV_RST_TERM_ISSUED) {
03298552cba38f Hiral Patel       2013-02-12  2415  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2416  				break;
03298552cba38f Hiral Patel       2013-02-12  2417  			}
03298552cba38f Hiral Patel       2013-02-12  2418  			spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2419  			if (fnic_queue_abort_io_req(fnic,
03298552cba38f Hiral Patel       2013-02-12  2420  				tag | FNIC_TAG_DEV_RST,
03298552cba38f Hiral Patel       2013-02-12  2421  				FCPIO_ITMF_ABT_TASK_TERM,
03298552cba38f Hiral Patel       2013-02-12  2422  				fc_lun.scsi_lun, io_req)) {
03298552cba38f Hiral Patel       2013-02-12  2423  				wait_for_completion_timeout(&tm_done,
03298552cba38f Hiral Patel       2013-02-12  2424  				msecs_to_jiffies(FNIC_ABT_TERM_DELAY_TIMEOUT));
03298552cba38f Hiral Patel       2013-02-12  2425  			} else {
03298552cba38f Hiral Patel       2013-02-12  2426  				spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2427  				CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_TERM_ISSUED;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2428  				CMD_STATE(reset_sc) = FNIC_IOREQ_ABTS_PENDING;
03298552cba38f Hiral Patel       2013-02-12  2429  				io_req->abts_done = &tm_done;
03298552cba38f Hiral Patel       2013-02-12  2430  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2431  				FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
03298552cba38f Hiral Patel       2013-02-12  2432  				"Abort and terminate issued on Device reset "
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2433  				"tag 0x%x sc 0x%p\n", tag, reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2434  				break;
03298552cba38f Hiral Patel       2013-02-12  2435  			}
03298552cba38f Hiral Patel       2013-02-12  2436  		}
03298552cba38f Hiral Patel       2013-02-12  2437  		while (1) {
03298552cba38f Hiral Patel       2013-02-12  2438  			spin_lock_irqsave(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2439  			if (!(CMD_FLAGS(sc) & FNIC_DEV_RST_DONE)) {
03298552cba38f Hiral Patel       2013-02-12  2440  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2441  				wait_for_completion_timeout(&tm_done,
03298552cba38f Hiral Patel       2013-02-12  2442  				msecs_to_jiffies(FNIC_LUN_RESET_TIMEOUT));
03298552cba38f Hiral Patel       2013-02-12  2443  				break;
03298552cba38f Hiral Patel       2013-02-12  2444  			} else {
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2445  				io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2446  				io_req->abts_done = NULL;
03298552cba38f Hiral Patel       2013-02-12  2447  				goto fnic_device_reset_clean;
03298552cba38f Hiral Patel       2013-02-12  2448  			}
03298552cba38f Hiral Patel       2013-02-12  2449  		}
03298552cba38f Hiral Patel       2013-02-12  2450  	} else {
03298552cba38f Hiral Patel       2013-02-12  2451  		spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2452  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2453  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2454  	/* Completed, but not successful, clean up the io_req, return fail */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2455  	if (status != FCPIO_SUCCESS) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2456  		spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2457  		FNIC_SCSI_DBG(KERN_DEBUG,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2458  			      fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2459  			      "Device reset completed - failed\n");
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2460  		io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2461  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2462  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2463  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2464  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2465  	 * Clean up any aborts on this lun that have still not
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2466  	 * completed. If any of these fail, then LUN reset fails.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2467  	 * clean_pending_aborts cleans all cmds on this lun except
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2468  	 * the lun reset cmd. If all cmds get cleaned, the lun reset
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2469  	 * succeeds
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2470  	 */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2471  	if (fnic_clean_pending_aborts(fnic, reset_sc)) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2472  		spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2473  		io_req = (struct fnic_io_req *)CMD_SP(sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2474  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2475  			      "Device reset failed"
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2476  			      " since could not abort all IOs\n");
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2477  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2478  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2479  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2480  	/* Clean lun reset command */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2481  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2482  	io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2483  	if (io_req)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2484  		/* Completed, and successful */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2485  		ret = SUCCESS;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2486  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2487  fnic_device_reset_clean:
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2488  	if (io_req)
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2489  		CMD_SP(reset_sc) = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2490  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2491  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2492  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2493  	if (io_req) {
14eb5d905d16ec Hiral Patel       2013-02-12  2494  		start_time = io_req->start_time;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2495  		fnic_release_ioreq_buf(fnic, io_req, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2496  		mempool_free(io_req, fnic->io_req_pool);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2497  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2498  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2499  fnic_device_reset_end:
3b695cc5f04ad6 Hannes Reinecke   2020-03-11 @2500  	FNIC_TRACE(fnic_device_reset, sdev->host->host_no,
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2501  		   reset_sc->request->tag, reset_sc,
                                                                   ^^^^^^^^^^^^^^^^^
Unchecked dereference.

4d7007b49d523d Hiral Patel       2013-02-12  2502  		  jiffies_to_msecs(jiffies - start_time),
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2503  		  0, ((u64)reset_sc->cmnd[0] << 32 |
4d7007b49d523d Hiral Patel       2013-02-12  2504  		  (u64)sc->cmnd[2] << 24 | (u64)sc->cmnd[3] << 16 |
4d7007b49d523d Hiral Patel       2013-02-12  2505  		  (u64)sc->cmnd[4] << 8 | sc->cmnd[5]),
4d7007b49d523d Hiral Patel       2013-02-12  2506  		  (((u64)CMD_FLAGS(sc) << 32) | CMD_STATE(sc)));
4d7007b49d523d Hiral Patel       2013-02-12  2507  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2508  	/* free internal command if it is allocated */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2509  	if (reset_sc)
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2510  		scsi_put_internal_cmd(reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2511  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2512  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2513  		      "Returning from device reset %s\n",
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2514  		      (ret == SUCCESS) ?
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2515  		      "SUCCESS" : "FAILED");
67125b0287a9e6 Hiral Patel       2013-09-12  2516  
67125b0287a9e6 Hiral Patel       2013-09-12  2517  	if (ret == FAILED)
67125b0287a9e6 Hiral Patel       2013-09-12  2518  		atomic64_inc(&reset_stats->device_reset_failures);
67125b0287a9e6 Hiral Patel       2013-09-12  2519  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2520  	return ret;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2521  }

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 37076 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [hare-scsi-devel:reserved-tags.v4 4/22] drivers/scsi/fnic/fnic_scsi.c:2500 fnic_device_reset() error: we previously assumed 'reset_sc' could be null (see line 2336)
@ 2020-07-05  5:56 kernel test robot
  0 siblings, 0 replies; 3+ messages in thread
From: kernel test robot @ 2020-07-05  5:56 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 20685 bytes --]

CC: kbuild-all(a)lists.01.org
TO: Hannes Reinecke <hare@suse.de>

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git reserved-tags.v4
head:   2a2c3155f8291828f41350cf90a0c8a37cdd263c
commit: 3b695cc5f04ad6099906a94408410af8078704bf [4/22] fnic: use internal commands
:::::: branch date: 10 days ago
:::::: commit date: 2 weeks ago
config: i386-randconfig-m021-20200705 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-14) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

smatch warnings:
drivers/scsi/fnic/fnic_scsi.c:2500 fnic_device_reset() error: we previously assumed 'reset_sc' could be null (see line 2336)

# https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git/commit/?id=3b695cc5f04ad6099906a94408410af8078704bf
git remote add hare-scsi-devel https://git.kernel.org/pub/scm/linux/kernel/git/hare/scsi-devel.git
git remote update hare-scsi-devel
git checkout 3b695cc5f04ad6099906a94408410af8078704bf
vim +/reset_sc +2500 drivers/scsi/fnic/fnic_scsi.c

5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2284  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2285  /*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2286   * SCSI Eh thread issues a Lun Reset when one or more commands on a LUN
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2287   * fail to get aborted. It calls driver's eh_device_reset with a SCSI command
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2288   * on the LUN.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2289   */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2290  int fnic_device_reset(struct scsi_cmnd *sc)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2291  {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2292  	struct fc_lport *lp;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2293  	struct fnic *fnic;
4d7007b49d523d Hiral Patel       2013-02-12  2294  	struct fnic_io_req *io_req = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2295  	struct fc_rport *rport;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2296  	int status;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2297  	int ret = FAILED;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2298  	spinlock_t *io_lock;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2299  	unsigned long flags;
14eb5d905d16ec Hiral Patel       2013-02-12  2300  	unsigned long start_time = 0;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2301  	struct scsi_device *sdev = sc->device;
03298552cba38f Hiral Patel       2013-02-12  2302  	struct scsi_lun fc_lun;
67125b0287a9e6 Hiral Patel       2013-09-12  2303  	struct fnic_stats *fnic_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2304  	struct reset_stats *reset_stats;
4d7007b49d523d Hiral Patel       2013-02-12  2305  	int tag = 0;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2306  	DECLARE_COMPLETION_ONSTACK(tm_done);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2307  	struct scsi_cmnd *reset_sc = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2308  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2309  	/* Wait for rport to unblock */
65d430fa99cbd0 Christof Schmitt  2009-10-30  2310  	fc_block_scsi_eh(sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2311  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2312  	/* Get local-port, check ready and link up */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2313  	lp = shost_priv(sdev->host);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2314  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2315  	fnic = lport_priv(lp);
67125b0287a9e6 Hiral Patel       2013-09-12  2316  	fnic_stats = &fnic->fnic_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2317  	reset_stats = &fnic->fnic_stats.reset_stats;
67125b0287a9e6 Hiral Patel       2013-09-12  2318  
67125b0287a9e6 Hiral Patel       2013-09-12  2319  	atomic64_inc(&reset_stats->device_resets);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2320  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2321  	rport = starget_to_rport(scsi_target(sdev));
0db6f4353d68c0 Roel Kluin        2010-06-11  2322  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
9cb78c16f5dade Hannes Reinecke   2014-06-25  2323  		      "Device reset called FCID 0x%x, LUN 0x%llx sc 0x%p\n",
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2324  		      rport->port_id, sdev->lun, sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2325  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2326  	if (lp->state != LPORT_ST_READY || !(lp->link_up))
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2327  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2328  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2329  	/* Check if remote port up */
67125b0287a9e6 Hiral Patel       2013-09-12  2330  	if (fc_remote_port_chkready(rport)) {
67125b0287a9e6 Hiral Patel       2013-09-12  2331  		atomic64_inc(&fnic_stats->misc_stats.rport_not_ready);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2332  		goto fnic_device_reset_end;
67125b0287a9e6 Hiral Patel       2013-09-12  2333  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2334  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2335  	reset_sc = scsi_get_internal_cmd(sdev, DMA_NONE, REQ_NOWAIT);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11 @2336  	if (unlikely(!reset_sc))
03298552cba38f Hiral Patel       2013-02-12  2337  		goto fnic_device_reset_end;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2338  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2339  	CMD_FLAGS(reset_sc) = FNIC_DEVICE_RESET;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2340  	tag = reset_sc->request->tag;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2341  	io_lock = fnic_io_lock_hash(fnic, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2342  	spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2343  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2344  	/*
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2345  	 * Allocate a new io_req.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2346  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2347  	io_req = mempool_alloc(fnic->io_req_pool, GFP_ATOMIC);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2348  	if (!io_req) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2349  		spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2350  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2351  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2352  	memset(io_req, 0, sizeof(*io_req));
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2353  	io_req->port_id = rport->port_id;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2354  	CMD_SP(reset_sc) = (char *)io_req;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2355  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2356  	io_req->dr_done = &tm_done;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2357  	CMD_STATE(reset_sc) = FNIC_IOREQ_CMD_PENDING;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2358  	CMD_LR_STATUS(reset_sc) = FCPIO_INVALID_CODE;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2359  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2360  
03298552cba38f Hiral Patel       2013-02-12  2361  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host, "TAG %x\n", tag);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2362  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2363  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2364  	 * issue the device reset, if enqueue failed, clean up the ioreq
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2365  	 * and break assoc with scsi cmd
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2366  	 */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2367  	if (fnic_queue_dr_io_req(fnic, reset_sc, io_req)) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2368  		spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2369  		io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2370  		if (io_req)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2371  			io_req->dr_done = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2372  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2373  	}
03298552cba38f Hiral Patel       2013-02-12  2374  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2375  	CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_ISSUED;
03298552cba38f Hiral Patel       2013-02-12  2376  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2377  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2378  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2379  	 * Wait on the local completion for LUN reset.  The io_req may be
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2380  	 * freed while we wait since we hold no lock.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2381  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2382  	wait_for_completion_timeout(&tm_done,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2383  				    msecs_to_jiffies(FNIC_LUN_RESET_TIMEOUT));
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2384  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2385  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2386  	io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2387  	if (!io_req) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2388  		spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2389  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2390  				"io_req is null tag 0x%x sc 0x%p\n", tag, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2391  		goto fnic_device_reset_end;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2392  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2393  	io_req->dr_done = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2394  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2395  	status = CMD_LR_STATUS(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2396  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2397  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2398  	 * If lun reset not completed, bail out with failed. io_req
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2399  	 * gets cleaned up during higher levels of EH
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2400  	 */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2401  	if (status == FCPIO_INVALID_CODE) {
67125b0287a9e6 Hiral Patel       2013-09-12  2402  		atomic64_inc(&reset_stats->device_reset_timeouts);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2403  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2404  			      "Device reset timed out\n");
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2405  		CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_TIMED_OUT;
03298552cba38f Hiral Patel       2013-02-12  2406  		spin_unlock_irqrestore(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2407  		int_to_scsilun(sdev->lun, &fc_lun);
03298552cba38f Hiral Patel       2013-02-12  2408  		/*
1259c5dc752474 Sesidhar Beddel   2013-09-09  2409  		 * Issue abort and terminate on device reset request.
1259c5dc752474 Sesidhar Beddel   2013-09-09  2410  		 * If q'ing of terminate fails, retry it after a delay.
03298552cba38f Hiral Patel       2013-02-12  2411  		 */
03298552cba38f Hiral Patel       2013-02-12  2412  		while (1) {
03298552cba38f Hiral Patel       2013-02-12  2413  			spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2414  			if (CMD_FLAGS(reset_sc) & FNIC_DEV_RST_TERM_ISSUED) {
03298552cba38f Hiral Patel       2013-02-12  2415  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2416  				break;
03298552cba38f Hiral Patel       2013-02-12  2417  			}
03298552cba38f Hiral Patel       2013-02-12  2418  			spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2419  			if (fnic_queue_abort_io_req(fnic,
03298552cba38f Hiral Patel       2013-02-12  2420  				tag | FNIC_TAG_DEV_RST,
03298552cba38f Hiral Patel       2013-02-12  2421  				FCPIO_ITMF_ABT_TASK_TERM,
03298552cba38f Hiral Patel       2013-02-12  2422  				fc_lun.scsi_lun, io_req)) {
03298552cba38f Hiral Patel       2013-02-12  2423  				wait_for_completion_timeout(&tm_done,
03298552cba38f Hiral Patel       2013-02-12  2424  				msecs_to_jiffies(FNIC_ABT_TERM_DELAY_TIMEOUT));
03298552cba38f Hiral Patel       2013-02-12  2425  			} else {
03298552cba38f Hiral Patel       2013-02-12  2426  				spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2427  				CMD_FLAGS(reset_sc) |= FNIC_DEV_RST_TERM_ISSUED;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2428  				CMD_STATE(reset_sc) = FNIC_IOREQ_ABTS_PENDING;
03298552cba38f Hiral Patel       2013-02-12  2429  				io_req->abts_done = &tm_done;
03298552cba38f Hiral Patel       2013-02-12  2430  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2431  				FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
03298552cba38f Hiral Patel       2013-02-12  2432  				"Abort and terminate issued on Device reset "
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2433  				"tag 0x%x sc 0x%p\n", tag, reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2434  				break;
03298552cba38f Hiral Patel       2013-02-12  2435  			}
03298552cba38f Hiral Patel       2013-02-12  2436  		}
03298552cba38f Hiral Patel       2013-02-12  2437  		while (1) {
03298552cba38f Hiral Patel       2013-02-12  2438  			spin_lock_irqsave(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2439  			if (!(CMD_FLAGS(sc) & FNIC_DEV_RST_DONE)) {
03298552cba38f Hiral Patel       2013-02-12  2440  				spin_unlock_irqrestore(io_lock, flags);
03298552cba38f Hiral Patel       2013-02-12  2441  				wait_for_completion_timeout(&tm_done,
03298552cba38f Hiral Patel       2013-02-12  2442  				msecs_to_jiffies(FNIC_LUN_RESET_TIMEOUT));
03298552cba38f Hiral Patel       2013-02-12  2443  				break;
03298552cba38f Hiral Patel       2013-02-12  2444  			} else {
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2445  				io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2446  				io_req->abts_done = NULL;
03298552cba38f Hiral Patel       2013-02-12  2447  				goto fnic_device_reset_clean;
03298552cba38f Hiral Patel       2013-02-12  2448  			}
03298552cba38f Hiral Patel       2013-02-12  2449  		}
03298552cba38f Hiral Patel       2013-02-12  2450  	} else {
03298552cba38f Hiral Patel       2013-02-12  2451  		spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2452  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2453  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2454  	/* Completed, but not successful, clean up the io_req, return fail */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2455  	if (status != FCPIO_SUCCESS) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2456  		spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2457  		FNIC_SCSI_DBG(KERN_DEBUG,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2458  			      fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2459  			      "Device reset completed - failed\n");
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2460  		io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2461  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2462  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2463  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2464  	/*
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2465  	 * Clean up any aborts on this lun that have still not
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2466  	 * completed. If any of these fail, then LUN reset fails.
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2467  	 * clean_pending_aborts cleans all cmds on this lun except
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2468  	 * the lun reset cmd. If all cmds get cleaned, the lun reset
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2469  	 * succeeds
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2470  	 */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2471  	if (fnic_clean_pending_aborts(fnic, reset_sc)) {
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2472  		spin_lock_irqsave(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2473  		io_req = (struct fnic_io_req *)CMD_SP(sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2474  		FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2475  			      "Device reset failed"
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2476  			      " since could not abort all IOs\n");
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2477  		goto fnic_device_reset_clean;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2478  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2479  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2480  	/* Clean lun reset command */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2481  	spin_lock_irqsave(io_lock, flags);
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2482  	io_req = (struct fnic_io_req *)CMD_SP(reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2483  	if (io_req)
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2484  		/* Completed, and successful */
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2485  		ret = SUCCESS;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2486  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2487  fnic_device_reset_clean:
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2488  	if (io_req)
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2489  		CMD_SP(reset_sc) = NULL;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2490  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2491  	spin_unlock_irqrestore(io_lock, flags);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2492  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2493  	if (io_req) {
14eb5d905d16ec Hiral Patel       2013-02-12  2494  		start_time = io_req->start_time;
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2495  		fnic_release_ioreq_buf(fnic, io_req, reset_sc);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2496  		mempool_free(io_req, fnic->io_req_pool);
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2497  	}
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2498  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2499  fnic_device_reset_end:
3b695cc5f04ad6 Hannes Reinecke   2020-03-11 @2500  	FNIC_TRACE(fnic_device_reset, sdev->host->host_no,
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2501  		   reset_sc->request->tag, reset_sc,
4d7007b49d523d Hiral Patel       2013-02-12  2502  		  jiffies_to_msecs(jiffies - start_time),
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2503  		  0, ((u64)reset_sc->cmnd[0] << 32 |
4d7007b49d523d Hiral Patel       2013-02-12  2504  		  (u64)sc->cmnd[2] << 24 | (u64)sc->cmnd[3] << 16 |
4d7007b49d523d Hiral Patel       2013-02-12  2505  		  (u64)sc->cmnd[4] << 8 | sc->cmnd[5]),
4d7007b49d523d Hiral Patel       2013-02-12  2506  		  (((u64)CMD_FLAGS(sc) << 32) | CMD_STATE(sc)));
4d7007b49d523d Hiral Patel       2013-02-12  2507  
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2508  	/* free internal command if it is allocated */
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2509  	if (reset_sc)
3b695cc5f04ad6 Hannes Reinecke   2020-03-11  2510  		scsi_put_internal_cmd(reset_sc);
03298552cba38f Hiral Patel       2013-02-12  2511  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2512  	FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2513  		      "Returning from device reset %s\n",
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2514  		      (ret == SUCCESS) ?
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2515  		      "SUCCESS" : "FAILED");
67125b0287a9e6 Hiral Patel       2013-09-12  2516  
67125b0287a9e6 Hiral Patel       2013-09-12  2517  	if (ret == FAILED)
67125b0287a9e6 Hiral Patel       2013-09-12  2518  		atomic64_inc(&reset_stats->device_reset_failures);
67125b0287a9e6 Hiral Patel       2013-09-12  2519  
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2520  	return ret;
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2521  }
5df6d737dd4b0f Abhijeet Joglekar 2009-04-17  2522  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 37076 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-07-07 14:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-07 14:30 [hare-scsi-devel:reserved-tags.v4 4/22] drivers/scsi/fnic/fnic_scsi.c:2500 fnic_device_reset() error: we previously assumed 'reset_sc' could be null (see line 2336) Dan Carpenter
2020-07-07 14:30 ` Dan Carpenter
  -- strict thread matches above, loose matches on Subject: below --
2020-07-05  5:56 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.