On Thu, Feb 08, 2018 at 06:07:37PM +0300, Kirill Tkhai wrote: > The new code is under CONFIG_CHECKPOINT_RESTORE #define, so small system > may exclude it. The only change in generic inotify part is idr_alloc_cyclic() > end argument. We had 0 there, and idr subsystem replaced it with INT_MAX > in idr_get_free(). So, the max possible id was INT_MAX (see idr_get_free() > again). > > Since I need INOTIFY_IDR_END to check ioctl's third argument, it's better > it's defined as positive number. But when not-zero value is passed > to idr_get_free(), this function decrements it. Also, idr_alloc_cyclic() > defined @end as int argument. So, it's impossible to pass positive @end > argument to idr_alloc_cyclic() to get INT_MAX id. And after this patch > inotify watch descriptors ids will take numbers [1, INT_MAX-1], INT_MAX > will be unavailable. Ummm. Why not just do: +#ifdef CONFIG_CHECKPOINT_RESTORE + case INOTIFY_IOC_SETNEXTWD: + ret = -EINVAL; + if (arg >= 1 && arg <= INT_MAX) { + spin_lock(&data->idr_lock); + idr_set_cursor(&data->idr, (unsigned int)arg); + spin_unlock(&data->idr_lock); + ret = 0; + } + break; +#endif /* CONFIG_CHECKPOINT_RESTORE */