rem: (char *)buffer += bytes;
add: buffer = (char *)buffer + bytes;
context: copy_sg_data(scsi_ccb *request, uint offset, uint allocation_length,	void *buffer, int size, bool to_buffer){	const physical_entry *sg_list = request->sg_list;	int sg_cnt = request->sg_cnt;	int req_size;	SHOW_FLOW(3, "offset=%u, req_size_limit=%d, size=%d, sg_list=%p, sg_cnt=%d, %s buffer", 		offset, allocation_length, size, sg_list, sg_cnt, to_buffer ? "to" : "from");	// skip unused S/G entries	while (sg_cnt > 0 && offset >= sg_list->size) {		offset -= sg_list->size;		++sg_list;		--sg_cnt;	}	if (sg_cnt == 0)		return 0;	// remaining bytes we are allowed to copy from/to request 			req_size = min(allocation_length, request->data_len) - offset;	// copy one S/G entry at a time	for (; size > 0 && req_size > 0 && sg_cnt > 0; ++sg_list, --sg_cnt) {		size_t bytes;		void *virt_addr;		bytes = min(size, req_size);		bytes = min(bytes, sg_list->size);		if (map_mainmemory((addr_t)sg_list->address, &virt_addr) != B_OK) 			return false;		SHOW_FLOW(4, "buffer=%p, virt_addr=%p, bytes=%d, to_buffer=%d",			buffer, (void *)((addr_t)virt_addr + offset), (int)bytes, to_buffer);		if (to_buffer)			memcpy(buffer, (void *)((addr_t)virt_addr + offset), bytes);		else			memcpy((void *)((addr_t)virt_addr + offset), buffer, bytes);		unmap_mainmemory(virt_addr);		(char *)buffer += bytes;		size -= bytes;		offset = 0;	}	return size == 0;}