diff options
| author | oster <oster@NetBSD.org> | 2006-06-12 22:49:35 +0000 |
|---|---|---|
| committer | oster <oster@NetBSD.org> | 2006-06-12 22:49:35 +0000 |
| commit | 8c090abdfc90beeb72a6bb74553e103851d4af68 (patch) | |
| tree | 826060e28e770f0e2c54b21d2353f747c67cf6dc /sys/dev/raidframe | |
| parent | e487cf62f5958a4609ef5bb6e0a884efd29e77b3 (diff) | |
Do the "don't allocate > 1K on the stack" thing for raidioctl().
Diffstat (limited to 'sys/dev/raidframe')
| -rw-r--r-- | sys/dev/raidframe/rf_netbsdkintf.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/sys/dev/raidframe/rf_netbsdkintf.c b/sys/dev/raidframe/rf_netbsdkintf.c index 1d621440c5f..f3d6e15a889 100644 --- a/sys/dev/raidframe/rf_netbsdkintf.c +++ b/sys/dev/raidframe/rf_netbsdkintf.c @@ -1,4 +1,4 @@ -/* $NetBSD: rf_netbsdkintf.c,v 1.208 2006/05/14 21:45:00 elad Exp $ */ +/* $NetBSD: rf_netbsdkintf.c,v 1.209 2006/06/12 22:49:35 oster Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. * All rights reserved. @@ -146,7 +146,7 @@ ***********************************************************/ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.208 2006/05/14 21:45:00 elad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.209 2006/06/12 22:49:35 oster Exp $"); #include <sys/param.h> #include <sys/errno.h> @@ -795,10 +795,9 @@ raidioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct lwp *l) int raidid; struct rf_recon_req *rrcopy, *rr; RF_ComponentLabel_t *clabel; - RF_ComponentLabel_t ci_label; + RF_ComponentLabel_t *ci_label; RF_ComponentLabel_t **clabel_ptr; RF_SingleComponent_t *sparePtr,*componentPtr; - RF_SingleComponent_t hot_spare; RF_SingleComponent_t component; RF_ProgressInfo_t progressInfo, **progressInfoPtr; int i, j, d; @@ -1079,22 +1078,28 @@ raidioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct lwp *l) raidPtr->serial_number = clabel->serial_number; - raid_init_component_label(raidPtr, &ci_label); - ci_label.serial_number = clabel->serial_number; - ci_label.row = 0; /* we dont' pretend to support more */ + RF_Malloc(ci_label, sizeof(RF_ComponentLabel_t), + (RF_ComponentLabel_t *)); + if (ci_label == NULL) + return (ENOMEM); + + raid_init_component_label(raidPtr, ci_label); + ci_label->serial_number = clabel->serial_number; + ci_label->row = 0; /* we dont' pretend to support more */ for(column=0;column<raidPtr->numCol;column++) { diskPtr = &raidPtr->Disks[column]; if (!RF_DEAD_DISK(diskPtr->status)) { - ci_label.partitionSize = diskPtr->partitionSize; - ci_label.column = column; + ci_label->partitionSize = diskPtr->partitionSize; + ci_label->column = column; raidwrite_component_label( raidPtr->Disks[column].dev, raidPtr->raid_cinfo[column].ci_vp, - &ci_label ); + ci_label ); } } - + RF_Free(ci_label, sizeof(RF_ComponentLabel_t)); + return (retcode); case RAIDFRAME_SET_AUTOCONFIG: d = rf_set_autoconfig(raidPtr, *(int *) data); @@ -1132,8 +1137,8 @@ raidioctl(dev_t dev, u_long cmd, caddr_t data, int flag, struct lwp *l) case RAIDFRAME_ADD_HOT_SPARE: sparePtr = (RF_SingleComponent_t *) data; - memcpy( &hot_spare, sparePtr, sizeof(RF_SingleComponent_t)); - retcode = rf_add_hot_spare(raidPtr, &hot_spare); + memcpy( &component, sparePtr, sizeof(RF_SingleComponent_t)); + retcode = rf_add_hot_spare(raidPtr, &component); return(retcode); case RAIDFRAME_REMOVE_HOT_SPARE: |
