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)