summaryrefslogtreecommitdiffstats
path: root/sys/cam/scsi
diff options
context:
space:
mode:
Diffstat (limited to 'sys/cam/scsi')
-rw-r--r--sys/cam/scsi/scsi_ch.c20
-rw-r--r--sys/cam/scsi/scsi_enc.c16
-rw-r--r--sys/cam/scsi/scsi_pass.c26
-rw-r--r--sys/cam/scsi/scsi_pt.c4
-rw-r--r--sys/cam/scsi/scsi_sg.c25
5 files changed, 22 insertions, 69 deletions
diff --git a/sys/cam/scsi/scsi_ch.c b/sys/cam/scsi/scsi_ch.c
index 8b04b4f..a82576f 100644
--- a/sys/cam/scsi/scsi_ch.c
+++ b/sys/cam/scsi/scsi_ch.c
@@ -107,8 +107,7 @@ static const u_int32_t CH_TIMEOUT_SEND_VOLTAG = 10000;
static const u_int32_t CH_TIMEOUT_INITIALIZE_ELEMENT_STATUS = 500000;
typedef enum {
- CH_FLAG_INVALID = 0x001,
- CH_FLAG_OPEN = 0x002
+ CH_FLAG_INVALID = 0x001
} ch_flags;
typedef enum {
@@ -211,7 +210,7 @@ PERIPHDRIVER_DECLARE(ch, chdriver);
static struct cdevsw ch_cdevsw = {
.d_version = D_VERSION,
- .d_flags = 0,
+ .d_flags = D_TRACKCLOSE,
.d_open = chopen,
.d_close = chclose,
.d_ioctl = chioctl,
@@ -404,16 +403,11 @@ chopen(struct cdev *dev, int flags, int fmt, struct thread *td)
cam_periph_lock(periph);
if (softc->flags & CH_FLAG_INVALID) {
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return(ENXIO);
}
- if ((softc->flags & CH_FLAG_OPEN) == 0)
- softc->flags |= CH_FLAG_OPEN;
- else
- cam_periph_release(periph);
-
if ((error = cam_periph_hold(periph, PRIBIO | PCATCH)) != 0) {
cam_periph_unlock(periph);
cam_periph_release(periph);
@@ -424,9 +418,8 @@ chopen(struct cdev *dev, int flags, int fmt, struct thread *td)
* Load information about this changer device into the softc.
*/
if ((error = chgetparams(periph)) != 0) {
- softc->flags &= ~CH_FLAG_OPEN;
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return(error);
}
@@ -451,11 +444,6 @@ chclose(struct cdev *dev, int flag, int fmt, struct thread *td)
softc = (struct ch_softc *)periph->softc;
- cam_periph_lock(periph);
-
- softc->flags &= ~CH_FLAG_OPEN;
-
- cam_periph_unlock(periph);
cam_periph_release(periph);
return(0);
diff --git a/sys/cam/scsi/scsi_enc.c b/sys/cam/scsi/scsi_enc.c
index b1868a6..b4d2025 100644
--- a/sys/cam/scsi/scsi_enc.c
+++ b/sys/cam/scsi/scsi_enc.c
@@ -93,7 +93,7 @@ static struct cdevsw enc_cdevsw = {
.d_close = enc_close,
.d_ioctl = enc_ioctl,
.d_name = "ses",
- .d_flags = 0,
+ .d_flags = D_TRACKCLOSE,
};
static void
@@ -254,12 +254,12 @@ enc_open(struct cdev *dev, int flags, int fmt, struct thread *td)
error = ENXIO;
goto out;
}
-
out:
+ if (error != 0)
+ cam_periph_release_locked(periph);
+
cam_periph_unlock(periph);
- if (error) {
- cam_periph_release(periph);
- }
+
return (error);
}
@@ -267,17 +267,11 @@ static int
enc_close(struct cdev *dev, int flag, int fmt, struct thread *td)
{
struct cam_periph *periph;
- struct enc_softc *softc;
periph = (struct cam_periph *)dev->si_drv1;
if (periph == NULL)
return (ENXIO);
- cam_periph_lock(periph);
-
- softc = (struct enc_softc *)periph->softc;
-
- cam_periph_unlock(periph);
cam_periph_release(periph);
return (0);
diff --git a/sys/cam/scsi/scsi_pass.c b/sys/cam/scsi/scsi_pass.c
index a124468..5b81ba8 100644
--- a/sys/cam/scsi/scsi_pass.c
+++ b/sys/cam/scsi/scsi_pass.c
@@ -111,7 +111,7 @@ PERIPHDRIVER_DECLARE(pass, passdriver);
static struct cdevsw pass_cdevsw = {
.d_version = D_VERSION,
- .d_flags = 0,
+ .d_flags = D_TRACKCLOSE,
.d_open = passopen,
.d_close = passclose,
.d_ioctl = passioctl,
@@ -377,8 +377,8 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td)
softc = (struct pass_softc *)periph->softc;
if (softc->flags & PASS_FLAG_INVALID) {
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return(ENXIO);
}
@@ -387,8 +387,8 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td)
*/
error = securelevel_gt(td->td_ucred, 1);
if (error) {
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return(error);
}
@@ -396,8 +396,8 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td)
* Only allow read-write access.
*/
if (((flags & FWRITE) == 0) || ((flags & FREAD) == 0)) {
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return(EPERM);
}
@@ -406,19 +406,12 @@ passopen(struct cdev *dev, int flags, int fmt, struct thread *td)
*/
if ((flags & O_NONBLOCK) != 0) {
xpt_print(periph->path, "can't do nonblocking access\n");
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return(EINVAL);
}
- if ((softc->flags & PASS_FLAG_OPEN) == 0) {
- softc->flags |= PASS_FLAG_OPEN;
- cam_periph_unlock(periph);
- } else {
- /* Device closes aren't symmertical, so fix up the refcount */
- cam_periph_unlock(periph);
- cam_periph_release(periph);
- }
+ cam_periph_unlock(periph);
return (error);
}
@@ -427,18 +420,11 @@ static int
passclose(struct cdev *dev, int flag, int fmt, struct thread *td)
{
struct cam_periph *periph;
- struct pass_softc *softc;
periph = (struct cam_periph *)dev->si_drv1;
if (periph == NULL)
return (ENXIO);
- cam_periph_lock(periph);
-
- softc = (struct pass_softc *)periph->softc;
- softc->flags &= ~PASS_FLAG_OPEN;
-
- cam_periph_unlock(periph);
cam_periph_release(periph);
return (0);
diff --git a/sys/cam/scsi/scsi_pt.c b/sys/cam/scsi/scsi_pt.c
index 1abb45e..67e7ecd 100644
--- a/sys/cam/scsi/scsi_pt.c
+++ b/sys/cam/scsi/scsi_pt.c
@@ -148,8 +148,8 @@ ptopen(struct cdev *dev, int flags, int fmt, struct thread *td)
cam_periph_lock(periph);
if (softc->flags & PT_FLAG_DEVICE_INVALID) {
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return(ENXIO);
}
@@ -182,8 +182,8 @@ ptclose(struct cdev *dev, int flag, int fmt, struct thread *td)
cam_periph_lock(periph);
softc->flags &= ~PT_FLAG_OPEN;
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return (0);
}
diff --git a/sys/cam/scsi/scsi_sg.c b/sys/cam/scsi/scsi_sg.c
index b8d2a48..e8ccecd 100644
--- a/sys/cam/scsi/scsi_sg.c
+++ b/sys/cam/scsi/scsi_sg.c
@@ -61,9 +61,8 @@ __FBSDID("$FreeBSD$");
#include <compat/linux/linux_ioctl.h>
typedef enum {
- SG_FLAG_OPEN = 0x01,
- SG_FLAG_LOCKED = 0x02,
- SG_FLAG_INVALID = 0x04
+ SG_FLAG_LOCKED = 0x01,
+ SG_FLAG_INVALID = 0x02
} sg_flags;
typedef enum {
@@ -141,7 +140,7 @@ PERIPHDRIVER_DECLARE(sg, sgdriver);
static struct cdevsw sg_cdevsw = {
.d_version = D_VERSION,
- .d_flags = D_NEEDGIANT,
+ .d_flags = D_NEEDGIANT | D_TRACKCLOSE,
.d_open = sgopen,
.d_close = sgclose,
.d_ioctl = sgioctl,
@@ -415,19 +414,12 @@ sgopen(struct cdev *dev, int flags, int fmt, struct thread *td)
softc = (struct sg_softc *)periph->softc;
if (softc->flags & SG_FLAG_INVALID) {
+ cam_periph_release_locked(periph);
cam_periph_unlock(periph);
- cam_periph_release(periph);
return (ENXIO);
}
- if ((softc->flags & SG_FLAG_OPEN) == 0) {
- softc->flags |= SG_FLAG_OPEN;
- cam_periph_unlock(periph);
- } else {
- /* Device closes aren't symmetrical, fix up the refcount. */
- cam_periph_unlock(periph);
- cam_periph_release(periph);
- }
+ cam_periph_unlock(periph);
return (error);
}
@@ -436,18 +428,11 @@ static int
sgclose(struct cdev *dev, int flag, int fmt, struct thread *td)
{
struct cam_periph *periph;
- struct sg_softc *softc;
periph = (struct cam_periph *)dev->si_drv1;
if (periph == NULL)
return (ENXIO);
- cam_periph_lock(periph);
-
- softc = (struct sg_softc *)periph->softc;
- softc->flags &= ~SG_FLAG_OPEN;
-
- cam_periph_unlock(periph);
cam_periph_release(periph);
return (0);
OpenPOWER on IntegriCloud