• Nicolas Schichan's avatar
    md: check command validity early in md_ioctl(). · cb335f88
    Nicolas Schichan authored
    Verify that the cmd parameter passed to md_ioctl() is valid before
    doing anything.
    
    This fixes mddev->hold_active being set to 0 when an invalid ioctl
    command is passed to md_ioctl() before the array has been configured.
    
    Clearing mddev->hold_active in that case can lead to a livelock
    situation when an invalid ioctl number is given to md_ioctl() by a
    process when the mddev is currently being opened by another process:
    
    Process 1				Process 2
    ---------				---------
    
    md_alloc()
      mddev_find()
      -> returns a new mddev with
         hold_active == UNTIL_IOCTL
      add_disk()
      -> sends KOBJ_ADD uevent
    
    					(sees KOBJ_ADD uevent for device)
                        			md_open()
                        			md_ioctl(INVALID_IOCTL)
                        			-> returns ENODEV and clears
                           			   mddev->hold_active
                        			md_release()
                          			md_put()
                          			-> deletes the mddev as
                             		   hold_active is 0
    
    md_open()
      mddev_find()
      -> returns a newly
        allocated mddev with
        mddev->gendisk == NULL
    -> returns with ERESTARTSYS
       (kernel restarts the open syscall)
    Signed-off-by: default avatarNicolas Schichan <nschichan@freebox.fr>
    Signed-off-by: default avatarNeilBrown <neilb@suse.de>
    cb335f88
md.c 226 KB