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

Reply via email to