summaryrefslogtreecommitdiffstats
path: root/sys/dev/slice/mbr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/slice/mbr.c')
-rw-r--r--sys/dev/slice/mbr.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/sys/dev/slice/mbr.c b/sys/dev/slice/mbr.c
index 29e8b01..5558775 100644
--- a/sys/dev/slice/mbr.c
+++ b/sys/dev/slice/mbr.c
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: mbr.c,v 1.1 1998/04/19 23:31:05 julian Exp $
+ * $Id: mbr.c,v 1.2 1998/04/22 10:25:09 julian Exp $
*/
#include <sys/param.h>
@@ -825,11 +825,42 @@ static int
mbr_upconfig(struct slice *slice, int cmd, caddr_t addr,
int flag, struct proc * p)
{
+ int error;
+
RR;
switch (cmd) {
case SLCIOCRESET:
return (0);
+ case SLCIOCTRANSBAD:
+ {
+ struct private_data *pd;
+ struct subdev *sdp;
+ daddr_t blkno;
+ int part;
+
+ blkno = *(daddr_t *)addr;
+ pd = slice->private_up;
+ sdp = pd->subdevs;
+ for (part = 0; part < NDOSPART; part++, sdp++) {
+ if (!sdp->slice)
+ continue;
+ if (blkno < sdp->offset)
+ continue;
+ if (blkno >= sdp->offset +
+ sdp->limit.slicesize / sdp->limit.blksize)
+ continue;
+ blkno -= sdp->offset;
+ slice = sdp->slice;
+ error = (*slice->handler_up->upconf)(slice, cmd,
+ (caddr_t)&blkno, flag, p);
+ if (!error)
+ *(daddr_t *)addr = blkno + sdp->offset;
+ return (error);
+ }
+ return (0);
+ }
+
/* These don't really make sense. keep the headers for a reminder */
default:
return (ENOIOCTL);
OpenPOWER on IntegriCloud