mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	ntp: Add ADJ_SETOFFSET mode bit
This patch adds a new mode bit into the timex structure. When set, the bit instructs the kernel to add the given time value to the current time. Signed-off-by: Richard Cochran <richard.cochran@omicron.at> Acked-by: John Stultz <johnstul@us.ibm.com> LKML-Reference: <20110201134320.688829863@linutronix.de> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
		
							parent
							
								
									c528f7c6c2
								
							
						
					
					
						commit
						094aa1881f
					
				
					 2 changed files with 13 additions and 1 deletions
				
			
		| 
						 | 
					@ -73,7 +73,7 @@ struct timex {
 | 
				
			||||||
	long tolerance;		/* clock frequency tolerance (ppm)
 | 
						long tolerance;		/* clock frequency tolerance (ppm)
 | 
				
			||||||
				 * (read only)
 | 
									 * (read only)
 | 
				
			||||||
				 */
 | 
									 */
 | 
				
			||||||
	struct timeval time;	/* (read only) */
 | 
						struct timeval time;	/* (read only, except for ADJ_SETOFFSET) */
 | 
				
			||||||
	long tick;		/* (modified) usecs between clock ticks */
 | 
						long tick;		/* (modified) usecs between clock ticks */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	long ppsfreq;           /* pps frequency (scaled ppm) (ro) */
 | 
						long ppsfreq;           /* pps frequency (scaled ppm) (ro) */
 | 
				
			||||||
| 
						 | 
					@ -102,6 +102,7 @@ struct timex {
 | 
				
			||||||
#define ADJ_STATUS		0x0010	/* clock status */
 | 
					#define ADJ_STATUS		0x0010	/* clock status */
 | 
				
			||||||
#define ADJ_TIMECONST		0x0020	/* pll time constant */
 | 
					#define ADJ_TIMECONST		0x0020	/* pll time constant */
 | 
				
			||||||
#define ADJ_TAI			0x0080	/* set TAI offset */
 | 
					#define ADJ_TAI			0x0080	/* set TAI offset */
 | 
				
			||||||
 | 
					#define ADJ_SETOFFSET		0x0100  /* add 'time' to current time */
 | 
				
			||||||
#define ADJ_MICRO		0x1000	/* select microsecond resolution */
 | 
					#define ADJ_MICRO		0x1000	/* select microsecond resolution */
 | 
				
			||||||
#define ADJ_NANO		0x2000	/* select nanosecond resolution */
 | 
					#define ADJ_NANO		0x2000	/* select nanosecond resolution */
 | 
				
			||||||
#define ADJ_TICK		0x4000	/* tick value */
 | 
					#define ADJ_TICK		0x4000	/* tick value */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -648,6 +648,17 @@ int do_adjtimex(struct timex *txc)
 | 
				
			||||||
			hrtimer_cancel(&leap_timer);
 | 
								hrtimer_cancel(&leap_timer);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (txc->modes & ADJ_SETOFFSET) {
 | 
				
			||||||
 | 
							struct timespec delta;
 | 
				
			||||||
 | 
							if ((unsigned long)txc->time.tv_usec >= NSEC_PER_SEC)
 | 
				
			||||||
 | 
								return -EINVAL;
 | 
				
			||||||
 | 
							delta.tv_sec  = txc->time.tv_sec;
 | 
				
			||||||
 | 
							delta.tv_nsec = txc->time.tv_usec;
 | 
				
			||||||
 | 
							if (!(txc->modes & ADJ_NANO))
 | 
				
			||||||
 | 
								delta.tv_nsec *= 1000;
 | 
				
			||||||
 | 
							timekeeping_inject_offset(&delta);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	getnstimeofday(&ts);
 | 
						getnstimeofday(&ts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	write_seqlock_irq(&xtime_lock);
 | 
						write_seqlock_irq(&xtime_lock);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue