Hi Logan, On 1/30/18 5:26 PM, Logan Gunthorpe wrote: > > > On 30/01/18 05:56 PM, Srivatsa S. Bhat wrote: >> If the restriction on the major number was intentional, perhaps we >> should get the LTP testcase modified for kernel versions >= 4.14. >> Otherwise, we should fix register_blkdev to preserve the old behavior. >> (I guess the same thing applies to commit 8a932f73e5b "char_dev: order >> /proc/devices by major number" as well). > > The restriction was put in place so the code that prints the devices doesn't > have to run through every integer in order to print the devices in order. > > Given the existing documented fixed numbers in [1] and that future new char > devices should be using dynamic allocation, this seemed like a reasonable > restriction. > > It would be pretty trivial to increase the limit but, IMO, setting it to > UINT_MAX seems a bit much. Especially given that a lot of the documentation > and code still very much has remnants of the 256 limit. (The series that > included this patch only just expanded the char dynamic range to above 256). > So, I'd suggest the LTP test should change. >
Sounds good! Thank you! By the way, I happened to notice a few minor issues with the find_dynamic_major() function added by this patch series: static int find_dynamic_major(void) { int i; struct char_device_struct *cd; for (i = ARRAY_SIZE(chrdevs)-1; i > CHRDEV_MAJOR_DYN_END; i--) { ^^^^ As far as I can see, _DYN_END is inclusive, so shouldn't this be >= ? if (chrdevs[i] == NULL) return i; } for (i = CHRDEV_MAJOR_DYN_EXT_START; i > CHRDEV_MAJOR_DYN_EXT_END; i--) { ^^^^ Same here; I believe this should be >= for (cd = chrdevs[major_to_index(i)]; cd; cd = cd->next) if (cd->major == i) break; if (cd == NULL || cd->major != i) ^^^^^^^^ It seems that this latter condition is unnecessary, as it will never be true. (We'll reach here only if cd == NULL or cd->major == i). return i; } return -EBUSY; } Regards, Srivatsa