Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jan 2017 10:33:37 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r311873 - head/sys/cam/ctl
Message-ID:  <201701101033.v0AAXb90020128@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Tue Jan 10 10:33:36 2017
New Revision: 311873
URL: https://svnweb.freebsd.org/changeset/base/311873

Log:
  Fix malloc(M_WAITOK) under mutex, introduced at r311787.
  
  MFC after:	13 days

Modified:
  head/sys/cam/ctl/ctl.c

Modified: head/sys/cam/ctl/ctl.c
==============================================================================
--- head/sys/cam/ctl/ctl.c	Tue Jan 10 10:27:09 2017	(r311872)
+++ head/sys/cam/ctl/ctl.c	Tue Jan 10 10:33:36 2017	(r311873)
@@ -4593,6 +4593,8 @@ ctl_alloc_lun(struct ctl_softc *ctl_soft
 				printf("ctl: requested LUN ID %d is already "
 				       "in use\n", be_lun->req_lun_id);
 			}
+fail:
+			free(lun->lun_devid, M_CTL);
 			if (lun->flags & CTL_LUN_MALLOCED)
 				free(lun, M_CTL);
 			be_lun->lun_config_status(be_lun->be_lun,
@@ -4605,14 +4607,11 @@ ctl_alloc_lun(struct ctl_softc *ctl_soft
 		if (lun_number == -1) {
 			mtx_unlock(&ctl_softc->ctl_lock);
 			printf("ctl: can't allocate LUN, out of LUNs\n");
-			if (lun->flags & CTL_LUN_MALLOCED)
-				free(lun, M_CTL);
-			be_lun->lun_config_status(be_lun->be_lun,
-						  CTL_LUN_CONFIG_FAILURE);
-			return (ENOSPC);
+			goto fail;
 		}
 	}
 	ctl_set_mask(ctl_softc->ctl_lun_mask, lun_number);
+	mtx_unlock(&ctl_softc->ctl_lock);
 
 	mtx_init(&lun->lun_lock, "CTL LUN", NULL, MTX_DEF);
 	lun->lun = lun_number;
@@ -4664,22 +4663,6 @@ ctl_alloc_lun(struct ctl_softc *ctl_soft
 	ctl_init_page_index(lun);
 	ctl_init_log_page_index(lun);
 
-	/*
-	 * Now, before we insert this lun on the lun list, set the lun
-	 * inventory changed UA for all other luns.
-	 */
-	STAILQ_FOREACH(nlun, &ctl_softc->lun_list, links) {
-		mtx_lock(&nlun->lun_lock);
-		ctl_est_ua_all(nlun, -1, CTL_UA_LUN_CHANGE);
-		mtx_unlock(&nlun->lun_lock);
-	}
-
-	STAILQ_INSERT_TAIL(&ctl_softc->lun_list, lun, links);
-
-	ctl_softc->ctl_luns[lun_number] = lun;
-
-	ctl_softc->num_luns++;
-
 	/* Setup statistics gathering */
 #ifdef CTL_LEGACY_STATS
 	lun->legacy_stats.device_type = be_lun->lun_type;
@@ -4692,6 +4675,19 @@ ctl_alloc_lun(struct ctl_softc *ctl_soft
 #endif /* CTL_LEGACY_STATS */
 	lun->stats.item = lun_number;
 
+	/*
+	 * Now, before we insert this lun on the lun list, set the lun
+	 * inventory changed UA for all other luns.
+	 */
+	mtx_lock(&ctl_softc->ctl_lock);
+	STAILQ_FOREACH(nlun, &ctl_softc->lun_list, links) {
+		mtx_lock(&nlun->lun_lock);
+		ctl_est_ua_all(nlun, -1, CTL_UA_LUN_CHANGE);
+		mtx_unlock(&nlun->lun_lock);
+	}
+	STAILQ_INSERT_TAIL(&ctl_softc->lun_list, lun, links);
+	ctl_softc->ctl_luns[lun_number] = lun;
+	ctl_softc->num_luns++;
 	mtx_unlock(&ctl_softc->ctl_lock);
 
 	lun->be_lun->lun_config_status(lun->be_lun->be_lun, CTL_LUN_CONFIG_OK);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201701101033.v0AAXb90020128>