]> Pileus Git - ~andy/linux/commit
md: check command validity early in md_ioctl().
authorNicolas Schichan <nschichan@freebox.fr>
Wed, 15 Jan 2014 15:58:52 +0000 (16:58 +0100)
committerNeilBrown <neilb@suse.de>
Wed, 15 Jan 2014 21:55:00 +0000 (08:55 +1100)
commitcb335f88eb35af712d1f4171642d0487f7bb2e7e
treefba070397b84f40067bf5d12aded18672eea3ebf
parent830778a180f268ac106f072b8aad793a79088c87
md: check command validity early in md_ioctl().

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: Nicolas Schichan <nschichan@freebox.fr>
Signed-off-by: NeilBrown <neilb@suse.de>
drivers/md/md.c