Lines Matching refs:ch

137 	struct chunk *ch;
139 ch = (last != NULL && last->ch_block <= blk)
141 while (ch != NULL) {
142 if (ch->ch_block <= blk &&
143 (lba_t)(ch->ch_block + (ch->ch_size / secsz)) > blk) {
144 last = ch;
147 ch = TAILQ_NEXT(ch, ch_list);
149 return (ch);
153 image_chunk_grow(struct chunk *ch, size_t sz)
157 newsz = ch->ch_size + sz;
158 if (newsz > ch->ch_size) {
159 ch->ch_size = newsz;
163 dsz = SIZE_MAX - ch->ch_size;
165 ch->ch_size = SIZE_MAX;
170 image_chunk_memory(struct chunk *ch, lba_t blk)
179 if (ch->ch_block < blk) {
185 memcpy(new, ch, sizeof(*new));
186 ch->ch_size = (blk - ch->ch_block) * secsz;
188 new->ch_size -= ch->ch_size;
189 TAILQ_INSERT_AFTER(&image_chunks, ch, new, ch_list);
191 ch = new;
194 if (ch->ch_size > secsz) {
200 memcpy(new, ch, sizeof(*new));
201 ch->ch_size = secsz;
204 TAILQ_INSERT_AFTER(&image_chunks, ch, new, ch_list);
208 ch->ch_type = CH_TYPE_MEMORY;
209 ch->ch_u.mem.ptr = ptr;
210 return (ch);
216 struct chunk *ch;
220 ch = TAILQ_LAST(&image_chunks, chunk_head);
221 from = (ch != NULL) ? ch->ch_block + (ch->ch_size / secsz) : 0LL;
232 if (ch != NULL && ch->ch_type == CH_TYPE_ZEROES) {
233 sz = image_chunk_grow(ch, sz);
236 from = ch->ch_block + (ch->ch_size / secsz);
238 ch = malloc(sizeof(*ch));
239 if (ch == NULL)
241 memset(ch, 0, sizeof(*ch));
242 ch->ch_block = from;
243 ch->ch_size = sz;
244 ch->ch_type = CH_TYPE_ZEROES;
245 TAILQ_INSERT_TAIL(&image_chunks, ch, ch_list);
253 struct chunk *ch;
255 ch = TAILQ_LAST(&image_chunks, chunk_head);
256 if (ch != NULL && ch->ch_type == CH_TYPE_FILE) {
257 if (fd == ch->ch_u.file.fd &&
258 blk == (lba_t)(ch->ch_block + (ch->ch_size / secsz)) &&
259 ofs == (off_t)(ch->ch_u.file.ofs + ch->ch_size)) {
260 sz = image_chunk_grow(ch, sz);
263 blk = ch->ch_block + (ch->ch_size / secsz);
264 ofs = ch->ch_u.file.ofs + ch->ch_size;
267 ch = malloc(sizeof(*ch));
268 if (ch == NULL)
270 memset(ch, 0, sizeof(*ch));
271 ch->ch_block = blk;
272 ch->ch_size = sz;
273 ch->ch_type = CH_TYPE_FILE;
274 ch->ch_u.file.ofs = ofs;
275 ch->ch_u.file.fd = fd;
276 TAILQ_INSERT_TAIL(&image_chunks, ch, ch_list);
591 struct chunk *ch;
599 ch = image_chunk_find(blk);
600 if (ch == NULL) {
604 ofs = (blk - ch->ch_block) * secsz;
605 sz = ch->ch_size - ofs;
607 switch (ch->ch_type) {
612 error = image_copyout_file(fd, sz, ch->ch_u.file.fd,
613 ch->ch_u.file.ofs + ofs);
616 error = image_copyout_memory(fd, sz, ch->ch_u.mem.ptr);
630 struct chunk *ch;
634 ch = image_chunk_find(blk);
635 if (ch == NULL)
637 if (ch->ch_type != CH_TYPE_ZEROES)
639 lim = ch->ch_block + (ch->ch_size / secsz);
669 struct chunk *ch;
673 ch = image_chunk_find(blk);
674 if (ch == NULL)
677 if (ch->ch_type == CH_TYPE_FILE)
679 if (ch->ch_type == CH_TYPE_ZEROES) {
680 ch = image_chunk_memory(ch, blk);
681 if (ch == NULL)
684 assert(ch->ch_type == CH_TYPE_MEMORY);
685 memcpy(ch->ch_u.mem.ptr, buf, secsz);
697 struct chunk *ch;
699 while ((ch = TAILQ_FIRST(&image_chunks)) != NULL) {
700 switch (ch->ch_type) {
703 if (ch->ch_u.file.fd != -1)
704 close(ch->ch_u.file.fd);
707 free(ch->ch_u.mem.ptr);
712 TAILQ_REMOVE(&image_chunks, ch, ch_list);
713 free(ch);