/* write data to the underlying device */ static int blkmtd_write(struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf) { struct blkmtd_dev *dev = mtd->priv; int err; if(!len) return 0; DEBUG(2, "blkmtd: write: dev = `%s' to = %ld len = %d buf = %p\n", mtd->name+9, (long int)to, len, buf); if(to >= mtd->size) { return -ENOSPC; } if(to + len > mtd->size) { len = mtd->size - to; } err = write_pages(dev, buf, to, len, retlen); if(err > 0) err = 0; DEBUG(2, "blkmtd: write: end, err = %d\n", err); return err; }
/* erase a specified part of the device */ static int blkmtd_erase(struct mtd_info *mtd, struct erase_info *instr) { struct blkmtd_dev *dev = mtd->priv; struct mtd_erase_region_info *einfo = mtd->eraseregions; int numregions = mtd->numeraseregions; size_t from; u_long len; int err = -EIO; int retlen; instr->state = MTD_ERASING; from = instr->addr; len = instr->len; /* check erase region has valid start and length */ DEBUG(2, "blkmtd: erase: dev = `%s' from = 0x%x len = 0x%lx\n", mtd->name+9, from, len); while(numregions) { DEBUG(3, "blkmtd: checking erase region = 0x%08X size = 0x%X num = 0x%x\n", einfo->offset, einfo->erasesize, einfo->numblocks); if(from >= einfo->offset && from < einfo->offset + (einfo->erasesize * einfo->numblocks)) { if(len == einfo->erasesize && ( (from - einfo->offset) % einfo->erasesize == 0)) break; } numregions--; einfo++; } if(!numregions) { /* Not a valid erase block */ err("erase: invalid erase request 0x%lX @ 0x%08X", len, from); instr->state = MTD_ERASE_FAILED; err = -EIO; } if(instr->state != MTD_ERASE_FAILED) { /* do the erase */ DEBUG(3, "Doing erase from = %d len = %ld\n", from, len); err = write_pages(dev, NULL, from, len, &retlen); if(err || retlen != len) { err("erase failed err = %d", err); instr->state = MTD_ERASE_FAILED; } else { instr->state = MTD_ERASE_DONE; } } DEBUG(3, "blkmtd: erase: checking callback\n"); if (instr->callback) { (*(instr->callback))(instr); } DEBUG(2, "blkmtd: erase: finished (err = %d)\n", err); return err; }
void xtr_oggbase_c::write_queued_frame(bool eos) { if (-1 == m_queued_granulepos) return; ogg_packet op; op.b_o_s = 0; op.e_o_s = eos ? 1 : 0; op.packetno = m_packetno; op.packet = m_queued_frame->get_buffer(); op.bytes = m_queued_frame->get_size(); op.granulepos = m_queued_granulepos; ++m_packetno; ogg_stream_packetin(&m_os, &op); write_pages(); m_queued_granulepos = -1; m_queued_frame.reset(); }