eerb 104 drivers/s390/block/dasd_eer.c static int dasd_eer_get_free_bytes(struct eerbuffer *eerb) eerb 106 drivers/s390/block/dasd_eer.c if (eerb->head < eerb->tail) eerb 107 drivers/s390/block/dasd_eer.c return eerb->tail - eerb->head - 1; eerb 108 drivers/s390/block/dasd_eer.c return eerb->buffersize - eerb->head + eerb->tail -1; eerb 115 drivers/s390/block/dasd_eer.c static int dasd_eer_get_filled_bytes(struct eerbuffer *eerb) eerb 118 drivers/s390/block/dasd_eer.c if (eerb->head >= eerb->tail) eerb 119 drivers/s390/block/dasd_eer.c return eerb->head - eerb->tail; eerb 120 drivers/s390/block/dasd_eer.c return eerb->buffersize - eerb->tail + eerb->head; eerb 129 drivers/s390/block/dasd_eer.c static void dasd_eer_write_buffer(struct eerbuffer *eerb, eerb 140 drivers/s390/block/dasd_eer.c headindex = eerb->head / PAGE_SIZE; eerb 141 drivers/s390/block/dasd_eer.c localhead = eerb->head % PAGE_SIZE; eerb 143 drivers/s390/block/dasd_eer.c memcpy(eerb->buffer[headindex]+localhead, nextdata, len); eerb 146 drivers/s390/block/dasd_eer.c eerb->head += len; eerb 147 drivers/s390/block/dasd_eer.c if (eerb->head == eerb->buffersize) eerb 148 drivers/s390/block/dasd_eer.c eerb->head = 0; /* wrap around */ eerb 149 drivers/s390/block/dasd_eer.c BUG_ON(eerb->head > eerb->buffersize); eerb 156 drivers/s390/block/dasd_eer.c static int dasd_eer_read_buffer(struct eerbuffer *eerb, char *data, int count) eerb 163 drivers/s390/block/dasd_eer.c finalcount = min(count, dasd_eer_get_filled_bytes(eerb)); eerb 167 drivers/s390/block/dasd_eer.c tailindex = eerb->tail / PAGE_SIZE; eerb 168 drivers/s390/block/dasd_eer.c localtail = eerb->tail % PAGE_SIZE; eerb 170 drivers/s390/block/dasd_eer.c memcpy(nextdata, eerb->buffer[tailindex] + localtail, len); eerb 173 drivers/s390/block/dasd_eer.c eerb->tail += len; eerb 174 drivers/s390/block/dasd_eer.c if (eerb->tail == eerb->buffersize) eerb 175 drivers/s390/block/dasd_eer.c eerb->tail = 0; /* wrap around */ eerb 176 drivers/s390/block/dasd_eer.c BUG_ON(eerb->tail > eerb->buffersize); eerb 188 drivers/s390/block/dasd_eer.c static int dasd_eer_start_record(struct eerbuffer *eerb, int count) eerb 192 drivers/s390/block/dasd_eer.c if (count + sizeof(count) > eerb->buffersize) eerb 194 drivers/s390/block/dasd_eer.c while (dasd_eer_get_free_bytes(eerb) < count + sizeof(count)) { eerb 195 drivers/s390/block/dasd_eer.c if (eerb->residual > 0) { eerb 196 drivers/s390/block/dasd_eer.c eerb->tail += eerb->residual; eerb 197 drivers/s390/block/dasd_eer.c if (eerb->tail >= eerb->buffersize) eerb 198 drivers/s390/block/dasd_eer.c eerb->tail -= eerb->buffersize; eerb 199 drivers/s390/block/dasd_eer.c eerb->residual = -1; eerb 201 drivers/s390/block/dasd_eer.c dasd_eer_read_buffer(eerb, (char *) &tailcount, eerb 203 drivers/s390/block/dasd_eer.c eerb->tail += tailcount; eerb 204 drivers/s390/block/dasd_eer.c if (eerb->tail >= eerb->buffersize) eerb 205 drivers/s390/block/dasd_eer.c eerb->tail -= eerb->buffersize; eerb 207 drivers/s390/block/dasd_eer.c dasd_eer_write_buffer(eerb, (char*) &count, sizeof(count)); eerb 302 drivers/s390/block/dasd_eer.c struct eerbuffer *eerb; eerb 320 drivers/s390/block/dasd_eer.c list_for_each_entry(eerb, &bufferlist, list) { eerb 321 drivers/s390/block/dasd_eer.c dasd_eer_start_record(eerb, header.total_size); eerb 322 drivers/s390/block/dasd_eer.c dasd_eer_write_buffer(eerb, (char *) &header, sizeof(header)); eerb 326 drivers/s390/block/dasd_eer.c dasd_eer_write_buffer(eerb, sense, 32); eerb 328 drivers/s390/block/dasd_eer.c dasd_eer_write_buffer(eerb, "EOR", 4); eerb 346 drivers/s390/block/dasd_eer.c struct eerbuffer *eerb; eerb 363 drivers/s390/block/dasd_eer.c list_for_each_entry(eerb, &bufferlist, list) { eerb 364 drivers/s390/block/dasd_eer.c dasd_eer_start_record(eerb, header.total_size); eerb 365 drivers/s390/block/dasd_eer.c dasd_eer_write_buffer(eerb, (char *) &header , sizeof(header)); eerb 367 drivers/s390/block/dasd_eer.c dasd_eer_write_buffer(eerb, cqr->data, SNSS_DATA_SIZE); eerb 368 drivers/s390/block/dasd_eer.c dasd_eer_write_buffer(eerb, "EOR", 4); eerb 549 drivers/s390/block/dasd_eer.c struct eerbuffer *eerb; eerb 552 drivers/s390/block/dasd_eer.c eerb = kzalloc(sizeof(struct eerbuffer), GFP_KERNEL); eerb 553 drivers/s390/block/dasd_eer.c if (!eerb) eerb 555 drivers/s390/block/dasd_eer.c eerb->buffer_page_count = eer_pages; eerb 556 drivers/s390/block/dasd_eer.c if (eerb->buffer_page_count < 1 || eerb 557 drivers/s390/block/dasd_eer.c eerb->buffer_page_count > INT_MAX / PAGE_SIZE) { eerb 558 drivers/s390/block/dasd_eer.c kfree(eerb); eerb 564 drivers/s390/block/dasd_eer.c eerb->buffersize = eerb->buffer_page_count * PAGE_SIZE; eerb 565 drivers/s390/block/dasd_eer.c eerb->buffer = kmalloc_array(eerb->buffer_page_count, sizeof(char *), eerb 567 drivers/s390/block/dasd_eer.c if (!eerb->buffer) { eerb 568 drivers/s390/block/dasd_eer.c kfree(eerb); eerb 571 drivers/s390/block/dasd_eer.c if (dasd_eer_allocate_buffer_pages(eerb->buffer, eerb 572 drivers/s390/block/dasd_eer.c eerb->buffer_page_count)) { eerb 573 drivers/s390/block/dasd_eer.c kfree(eerb->buffer); eerb 574 drivers/s390/block/dasd_eer.c kfree(eerb); eerb 577 drivers/s390/block/dasd_eer.c filp->private_data = eerb; eerb 579 drivers/s390/block/dasd_eer.c list_add(&eerb->list, &bufferlist); eerb 587 drivers/s390/block/dasd_eer.c struct eerbuffer *eerb; eerb 590 drivers/s390/block/dasd_eer.c eerb = (struct eerbuffer *) filp->private_data; eerb 592 drivers/s390/block/dasd_eer.c list_del(&eerb->list); eerb 594 drivers/s390/block/dasd_eer.c dasd_eer_free_buffer_pages(eerb->buffer, eerb->buffer_page_count); eerb 595 drivers/s390/block/dasd_eer.c kfree(eerb->buffer); eerb 596 drivers/s390/block/dasd_eer.c kfree(eerb); eerb 607 drivers/s390/block/dasd_eer.c struct eerbuffer *eerb; eerb 609 drivers/s390/block/dasd_eer.c eerb = (struct eerbuffer *) filp->private_data; eerb 615 drivers/s390/block/dasd_eer.c if (eerb->residual < 0) { /* the remainder of this record */ eerb 617 drivers/s390/block/dasd_eer.c eerb->residual = 0; eerb 621 drivers/s390/block/dasd_eer.c } else if (eerb->residual > 0) { eerb 623 drivers/s390/block/dasd_eer.c effective_count = min(eerb->residual, (int) count); eerb 624 drivers/s390/block/dasd_eer.c eerb->residual -= effective_count; eerb 628 drivers/s390/block/dasd_eer.c tc = dasd_eer_read_buffer(eerb, (char *) &tailcount, eerb 638 drivers/s390/block/dasd_eer.c eerb->head != eerb->tail); eerb 648 drivers/s390/block/dasd_eer.c eerb->residual = tailcount - effective_count; eerb 651 drivers/s390/block/dasd_eer.c tc = dasd_eer_read_buffer(eerb, readbuffer, effective_count); eerb 669 drivers/s390/block/dasd_eer.c struct eerbuffer *eerb; eerb 671 drivers/s390/block/dasd_eer.c eerb = (struct eerbuffer *) filp->private_data; eerb 674 drivers/s390/block/dasd_eer.c if (eerb->head != eerb->tail)