GSOC: Device mapper mirror target

Venkatesh Srinivas me at endeavour.zapto.org
Mon Apr 11 08:21:16 PDT 2011


On Mon, Apr 11, 2011 at 9:22 AM, Adam Hoka <adam.hoka at gmail.com> wrote:
> On Sun, 10 Apr 2011 18:08:33 -0400
> Venkatesh Srinivas <me at endeavour.zapto.org> 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. :-)

Heh, totally agree there.

We have an interface called MPIPE (very similar to NetBSD's pool(9))
that would allow us to reserve some transactions/groups for write-path
I/O. I believe that is what the dm crypt target does. I think that'd
be okay for this.

-- vs






More information about the Kernel mailing list