diff options
Diffstat (limited to 'drivers/s390/block/dasd_ioctl.c')
-rw-r--r-- | drivers/s390/block/dasd_ioctl.c | 38 |
1 files changed, 34 insertions, 4 deletions
diff --git a/drivers/s390/block/dasd_ioctl.c b/drivers/s390/block/dasd_ioctl.c index 72261e4c516..eb4e034378c 100644 --- a/drivers/s390/block/dasd_ioctl.c +++ b/drivers/s390/block/dasd_ioctl.c | |||
@@ -239,7 +239,7 @@ dasd_ioctl_format(struct block_device *bdev, void __user *argp) | |||
239 | */ | 239 | */ |
240 | static int dasd_ioctl_reset_profile(struct dasd_block *block) | 240 | static int dasd_ioctl_reset_profile(struct dasd_block *block) |
241 | { | 241 | { |
242 | memset(&block->profile, 0, sizeof(struct dasd_profile_info_t)); | 242 | dasd_profile_reset(&block->profile); |
243 | return 0; | 243 | return 0; |
244 | } | 244 | } |
245 | 245 | ||
@@ -248,10 +248,40 @@ static int dasd_ioctl_reset_profile(struct dasd_block *block) | |||
248 | */ | 248 | */ |
249 | static int dasd_ioctl_read_profile(struct dasd_block *block, void __user *argp) | 249 | static int dasd_ioctl_read_profile(struct dasd_block *block, void __user *argp) |
250 | { | 250 | { |
251 | if (dasd_profile_level == DASD_PROFILE_OFF) | 251 | struct dasd_profile_info_t *data; |
252 | |||
253 | data = kmalloc(sizeof(*data), GFP_KERNEL); | ||
254 | if (!data) | ||
255 | return -ENOMEM; | ||
256 | |||
257 | spin_lock_bh(&block->profile.lock); | ||
258 | if (block->profile.data) { | ||
259 | data->dasd_io_reqs = block->profile.data->dasd_io_reqs; | ||
260 | data->dasd_io_sects = block->profile.data->dasd_io_sects; | ||
261 | memcpy(data->dasd_io_secs, block->profile.data->dasd_io_secs, | ||
262 | sizeof(data->dasd_io_secs)); | ||
263 | memcpy(data->dasd_io_times, block->profile.data->dasd_io_times, | ||
264 | sizeof(data->dasd_io_times)); | ||
265 | memcpy(data->dasd_io_timps, block->profile.data->dasd_io_timps, | ||
266 | sizeof(data->dasd_io_timps)); | ||
267 | memcpy(data->dasd_io_time1, block->profile.data->dasd_io_time1, | ||
268 | sizeof(data->dasd_io_time1)); | ||
269 | memcpy(data->dasd_io_time2, block->profile.data->dasd_io_time2, | ||
270 | sizeof(data->dasd_io_time2)); | ||
271 | memcpy(data->dasd_io_time2ps, | ||
272 | block->profile.data->dasd_io_time2ps, | ||
273 | sizeof(data->dasd_io_time2ps)); | ||
274 | memcpy(data->dasd_io_time3, block->profile.data->dasd_io_time3, | ||
275 | sizeof(data->dasd_io_time3)); | ||
276 | memcpy(data->dasd_io_nr_req, | ||
277 | block->profile.data->dasd_io_nr_req, | ||
278 | sizeof(data->dasd_io_nr_req)); | ||
279 | spin_unlock_bh(&block->profile.lock); | ||
280 | } else { | ||
281 | spin_unlock_bh(&block->profile.lock); | ||
252 | return -EIO; | 282 | return -EIO; |
253 | if (copy_to_user(argp, &block->profile, | 283 | } |
254 | sizeof(struct dasd_profile_info_t))) | 284 | if (copy_to_user(argp, data, sizeof(*data))) |
255 | return -EFAULT; | 285 | return -EFAULT; |
256 | return 0; | 286 | return 0; |
257 | } | 287 | } |