On Sun, 10 Apr 2011 18:08:33 -0400
Venkatesh Srinivas <[email protected]> wrote:

> static int
> dmirror_strategy(dm_table_entry_t *table_en, struct buf *bp)
> {
>       struct bio *bio;
>       struct dmirror_pdev *pdev;
>       struct dmirror_dev *dmcfg;
>       struct dmirror_write_group *wg;
>       struct dmirror_write_tx *tx;
>       int ndevs;
>       int i;  
> 
>       dmcfg = table_en->target_config;
> 
>       switch (bp->b_cmd) {
>       case (BUF_CMD_READ):
>               pdev = dmirror_read_pick(dmcfg, &bp->b_bio1);   
>               if (pdev == NULL) {
>                       bp->b_flags |= B_ERROR | B_INVAL;
>                       bp->b_resid = 0;
>                       biodone(&bp->b_bio1);
>                       break;
>               }
>               
>               disk_issue_read(dmcfg, pdev, &bp->b_bio1);
>               break;
>       case (BUF_CMD_WRITE):
>               /* Allocate a write group */
>               wg = kmalloc(sizeof(struct dmirror_write_group), M_DMIRROR_WG,
>                            M_WAITOK);
>               dmirror_wg_ctor(dmcfg, &bp->b_bio1, wg);
>               
>               /* Allocate one transaction per device */
>               for (i = 0; i < ndevs; i++) {
>                       tx = kmalloc(sizeof(struct dmirror_write_tx),
>                                       M_DMIRROR_TX, M_WAITOK);
>                       dmirror_write_tx_ctor(wg, tx);
> 
>               }       
>       
>               /* Setup transactions */
>               
>               /* Issue requests */
>               // do some stuff, then call vn_strategy() on each tx->bio
> 
>               break;
>       case (BUF_CMD_FLUSH):
>       default:
>               break;
>       }
> }
> 

A bit off topic, but I dont think its a good idea to allocate memory
during I/O. :-)

-- 
Adam Hoka <[email protected]>

Reply via email to