mirror of
https://github.com/torvalds/linux.git
synced 2024-11-29 07:31:29 +00:00
s390/cmf: simplify copy_block
cmf_copy_block tries to ensure data consistency by copying the channel measurement block twice and comparing the data. This was needed on very old machines only. Nowadays we guarantee consistency by copying the data when the channel is idle. Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com> Reviewed-by: Peter Oberparleiter <oberpar@linux.vnet.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
parent
60f3eac3a1
commit
81b050b564
@ -280,12 +280,9 @@ void retry_set_schib(struct ccw_device *cdev)
|
||||
|
||||
static int cmf_copy_block(struct ccw_device *cdev)
|
||||
{
|
||||
struct subchannel *sch;
|
||||
void *reference_buf;
|
||||
void *hw_block;
|
||||
struct subchannel *sch = to_subchannel(cdev->dev.parent);
|
||||
struct cmb_data *cmb_data;
|
||||
|
||||
sch = to_subchannel(cdev->dev.parent);
|
||||
void *hw_block;
|
||||
|
||||
if (cio_update_schib(sch))
|
||||
return -ENODEV;
|
||||
@ -300,19 +297,8 @@ static int cmf_copy_block(struct ccw_device *cdev)
|
||||
}
|
||||
cmb_data = cdev->private->cmb;
|
||||
hw_block = cmb_data->hw_block;
|
||||
if (!memcmp(cmb_data->last_block, hw_block, cmb_data->size))
|
||||
/* No need to copy. */
|
||||
return 0;
|
||||
reference_buf = kzalloc(cmb_data->size, GFP_ATOMIC);
|
||||
if (!reference_buf)
|
||||
return -ENOMEM;
|
||||
/* Ensure consistency of block copied from hardware. */
|
||||
do {
|
||||
memcpy(cmb_data->last_block, hw_block, cmb_data->size);
|
||||
memcpy(reference_buf, hw_block, cmb_data->size);
|
||||
} while (memcmp(cmb_data->last_block, reference_buf, cmb_data->size));
|
||||
memcpy(cmb_data->last_block, hw_block, cmb_data->size);
|
||||
cmb_data->last_update = get_tod_clock();
|
||||
kfree(reference_buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user