Module Name: src Committed By: riz Date: Wed Oct 31 15:17:53 UTC 2012
Modified Files: src/sys/dev/scsipi [netbsd-5]: sd.c Log Message: sys/dev/scsipi/sd.c patch Allow disk strategy to be queried and changed at runtime for sd(4) disks. [buhrow, ticket #1807] To generate a diff of this commit: cvs rdiff -u -r1.275 -r1.275.4.1 src/sys/dev/scsipi/sd.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/scsipi/sd.c diff -u src/sys/dev/scsipi/sd.c:1.275 src/sys/dev/scsipi/sd.c:1.275.4.1 --- src/sys/dev/scsipi/sd.c:1.275 Wed Jul 16 18:54:09 2008 +++ src/sys/dev/scsipi/sd.c Wed Oct 31 15:17:53 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: sd.c,v 1.275 2008/07/16 18:54:09 drochner Exp $ */ +/* $NetBSD: sd.c,v 1.275.4.1 2012/10/31 15:17:53 riz Exp $ */ /*- * Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc. @@ -47,7 +47,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.275 2008/07/16 18:54:09 drochner Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.275.4.1 2012/10/31 15:17:53 riz Exp $"); #include "opt_scsi.h" #include "rnd.h" @@ -1003,7 +1003,7 @@ sdioctl(dev_t dev, u_long cmd, void *add struct sd_softc *sd = device_lookup_private(&sd_cd, SDUNIT(dev)); struct scsipi_periph *periph = sd->sc_periph; int part = SDPART(dev); - int error = 0; + int error = 0, s; #ifdef __HAVE_OLD_DISKLABEL struct disklabel *newlabel = NULL; #endif @@ -1027,6 +1027,8 @@ sdioctl(dev_t dev, u_long cmd, void *add case OSCIOCIDENTIFY: case SCIOCCOMMAND: case SCIOCDEBUG: + case DIOCGSTRATEGY: + case DIOCSSTRATEGY: if (part == RAW_PART) break; /* FALLTHROUGH */ @@ -1237,6 +1239,47 @@ sdioctl(dev_t dev, u_long cmd, void *add return (dkwedge_list(&sd->sc_dk, dkwl, l)); } + case DIOCGSTRATEGY: + { + struct disk_strategy *dks = (void *)addr; + + s = splbio(); + strlcpy(dks->dks_name, bufq_getstrategyname(sd->buf_queue), + sizeof(dks->dks_name)); + splx(s); + dks->dks_paramlen = 0; + + return 0; + } + + case DIOCSSTRATEGY: + { + struct disk_strategy *dks = (void *)addr; + struct bufq_state *new; + struct bufq_state *old; + + if ((flag & FWRITE) == 0) { + return EBADF; + } + if (dks->dks_param != NULL) { + return EINVAL; + } + dks->dks_name[sizeof(dks->dks_name) - 1] = 0; /* ensure term */ + error = bufq_alloc(&new, dks->dks_name, + BUFQ_EXACT|BUFQ_SORT_RAWBLOCK); + if (error) { + return error; + } + s = splbio(); + old = sd->buf_queue; + bufq_move(new, old); + sd->buf_queue = new; + splx(s); + bufq_free(old); + + return 0; + } + default: if (part != RAW_PART) return (ENOTTY);