void udf_data_alloc(int nblk, struct long_ad *pos) { memset(pos, 0, sizeof(*pos)); pos->len = udf_rw32(nblk * context.sector_size); pos->loc.lb_num = udf_rw32(context.data_alloc_pos); pos->loc.part_num = udf_rw16(context.data_part); udf_mark_allocated(context.data_alloc_pos, context.data_part, nblk); context.data_alloc_pos += nblk; if (context.metadata_part == context.data_part) context.metadata_alloc_pos = context.data_alloc_pos; }
int udf_write_dscr_virt(union dscrptr *dscr, uint32_t location, uint32_t vpart, uint32_t sects) { struct file_entry *fe; struct extfile_entry *efe; struct extattrhdr_desc *extattrhdr; uint32_t phys; extattrhdr = NULL; if (udf_rw16(dscr->tag.id) == TAGID_FENTRY) { fe = (struct file_entry *) dscr; if (udf_rw32(fe->l_ea) > 0) extattrhdr = (struct extattrhdr_desc *) fe->data; } if (udf_rw16(dscr->tag.id) == TAGID_EXTFENTRY) { efe = (struct extfile_entry *) dscr; if (udf_rw32(efe->l_ea) > 0) extattrhdr = (struct extattrhdr_desc *) efe->data; } if (extattrhdr) { extattrhdr->tag.tag_loc = udf_rw32(location); udf_validate_tag_and_crc_sums((union dscrptr *) extattrhdr); } dscr->tag.tag_loc = udf_rw32(location); udf_validate_tag_and_crc_sums(dscr); /* determine physical location */ phys = context.vtop_offset[vpart]; if (context.vtop_tp[vpart] == UDF_VTOP_TYPE_VIRT) { udf_vat_update(location, context.data_alloc_pos); phys += context.data_alloc_pos++; } else { phys += location; } return udf_write_phys(dscr, phys, sects); }
static int udf_write_logvol_dscr_seq(struct udf_strat_args *args) { union dscrptr *dscr = args->dscr; struct udf_mount *ump = args->ump; struct udf_node *udf_node = args->udf_node; struct long_ad *icb = args->icb; int waitfor = args->waitfor; uint32_t logsectornr, sectornr, dummy; int error, vpart; /* * we have to decide if we write it out sequential or at its fixed * position by examining the partition its (to be) written on. */ vpart = udf_rw16(udf_node->loc.loc.part_num); logsectornr = udf_rw32(icb->loc.lb_num); sectornr = 0; if (ump->vtop_tp[vpart] != UDF_VTOP_TYPE_VIRT) { error = udf_translate_vtop(ump, icb, §ornr, &dummy); if (error) goto out; } /* add reference to the vnode to prevent recycling */ vhold(udf_node->vnode); if (waitfor) { DPRINTF(WRITE, ("udf_write_logvol_dscr: sync write\n")); error = udf_write_phys_dscr_sync(ump, udf_node, UDF_C_NODE, dscr, sectornr, logsectornr); } else { DPRINTF(WRITE, ("udf_write_logvol_dscr: no wait, async write\n")); error = udf_write_phys_dscr_async(ump, udf_node, UDF_C_NODE, dscr, sectornr, logsectornr, udf_wr_nodedscr_callback); /* will be UNLOCKED in call back */ return error; } holdrele(udf_node->vnode); out: udf_node->outstanding_nodedscr--; if (udf_node->outstanding_nodedscr == 0) { UDF_UNLOCK_NODE(udf_node, 0); wakeup(&udf_node->outstanding_nodedscr); } return error; }