@@ -356,18 +356,54 @@ static long ptp_sys_offset_extended(struct ptp_clock *ptp, void __user *arg)
356
356
return copy_to_user (arg , extoff , sizeof (* extoff )) ? - EFAULT : 0 ;
357
357
}
358
358
359
+ static long ptp_sys_offset (struct ptp_clock * ptp , void __user * arg )
360
+ {
361
+ struct ptp_sys_offset * sysoff __free (kfree ) = NULL ;
362
+ struct ptp_clock_time * pct ;
363
+ struct timespec64 ts ;
364
+
365
+ sysoff = memdup_user (arg , sizeof (* sysoff ));
366
+ if (IS_ERR (sysoff ))
367
+ return PTR_ERR (sysoff );
368
+
369
+ if (sysoff -> n_samples > PTP_MAX_SAMPLES )
370
+ return - EINVAL ;
371
+
372
+ pct = & sysoff -> ts [0 ];
373
+ for (unsigned int i = 0 ; i < sysoff -> n_samples ; i ++ ) {
374
+ struct ptp_clock_info * ops = ptp -> info ;
375
+ int err ;
376
+
377
+ ktime_get_real_ts64 (& ts );
378
+ pct -> sec = ts .tv_sec ;
379
+ pct -> nsec = ts .tv_nsec ;
380
+ pct ++ ;
381
+ if (ops -> gettimex64 )
382
+ err = ops -> gettimex64 (ops , & ts , NULL );
383
+ else
384
+ err = ops -> gettime64 (ops , & ts );
385
+ if (err )
386
+ return err ;
387
+ pct -> sec = ts .tv_sec ;
388
+ pct -> nsec = ts .tv_nsec ;
389
+ pct ++ ;
390
+ }
391
+ ktime_get_real_ts64 (& ts );
392
+ pct -> sec = ts .tv_sec ;
393
+ pct -> nsec = ts .tv_nsec ;
394
+
395
+ return copy_to_user (arg , sysoff , sizeof (* sysoff )) ? - EFAULT : 0 ;
396
+ }
397
+
359
398
long ptp_ioctl (struct posix_clock_context * pccontext , unsigned int cmd ,
360
399
unsigned long arg )
361
400
{
362
401
struct ptp_clock * ptp =
363
402
container_of (pccontext -> clk , struct ptp_clock , clock );
364
403
struct ptp_clock_info * ops = ptp -> info ;
365
- struct ptp_sys_offset * sysoff = NULL ;
366
404
struct timestamp_event_queue * tsevq ;
367
- struct ptp_clock_time * pct ;
368
405
unsigned int i , pin_index ;
369
406
struct ptp_pin_desc pd ;
370
- struct timespec64 ts ;
371
407
void __user * argptr ;
372
408
int err = 0 ;
373
409
@@ -410,38 +446,7 @@ long ptp_ioctl(struct posix_clock_context *pccontext, unsigned int cmd,
410
446
411
447
case PTP_SYS_OFFSET :
412
448
case PTP_SYS_OFFSET2 :
413
- sysoff = memdup_user ((void __user * )arg , sizeof (* sysoff ));
414
- if (IS_ERR (sysoff )) {
415
- err = PTR_ERR (sysoff );
416
- sysoff = NULL ;
417
- break ;
418
- }
419
- if (sysoff -> n_samples > PTP_MAX_SAMPLES ) {
420
- err = - EINVAL ;
421
- break ;
422
- }
423
- pct = & sysoff -> ts [0 ];
424
- for (i = 0 ; i < sysoff -> n_samples ; i ++ ) {
425
- ktime_get_real_ts64 (& ts );
426
- pct -> sec = ts .tv_sec ;
427
- pct -> nsec = ts .tv_nsec ;
428
- pct ++ ;
429
- if (ops -> gettimex64 )
430
- err = ops -> gettimex64 (ops , & ts , NULL );
431
- else
432
- err = ops -> gettime64 (ops , & ts );
433
- if (err )
434
- goto out ;
435
- pct -> sec = ts .tv_sec ;
436
- pct -> nsec = ts .tv_nsec ;
437
- pct ++ ;
438
- }
439
- ktime_get_real_ts64 (& ts );
440
- pct -> sec = ts .tv_sec ;
441
- pct -> nsec = ts .tv_nsec ;
442
- if (copy_to_user ((void __user * )arg , sysoff , sizeof (* sysoff )))
443
- err = - EFAULT ;
444
- break ;
449
+ return ptp_sys_offset (ptp , argptr );
445
450
446
451
case PTP_PIN_GETFUNC :
447
452
case PTP_PIN_GETFUNC2 :
@@ -529,9 +534,6 @@ long ptp_ioctl(struct posix_clock_context *pccontext, unsigned int cmd,
529
534
err = - ENOTTY ;
530
535
break ;
531
536
}
532
-
533
- out :
534
- kfree (sysoff );
535
537
return err ;
536
538
}
537
539
0 commit comments