1. 10 Aug, 2002 9 commits
    • Alexander Viro's avatar
      [PATCH] fix check_disk_change() deadlocks · 951f4be9
      Alexander Viro authored
      Small, but tricky: fix for check_disk_change() deadlocks.
      What we do is
      	a) opening block device shifted from check_partition() to
      	   grok_partitions(); check_partitions() takes opened
      	   struct block_device.
      	b) all callers of check_disk_change() fall in two groups -
      	   ones that are called only from some ->open() and ones
      	   that are _never_ called from ->open().  There is no
      	   middle ground.  We split the thing in two functions -
      	   check_disk_change() for the first class and full_check_....
      	   for the second.  The former (ones inside ->open()) doesn't
      	   touch partition tables but marks the bdev as "had been
      	   invalidated".  In the end of do_open() we check if
      	   bdev is marked and call wipe_partitions()/check_partition()
      	   if it is - at that point bdev is fully set up and ready.
      	c) ->bd_part_sem kludge is gone - we use ->bd_sem instead.
      	   That is, do_open() on a partition grabs ->bd_sem on entire
      	   disk and picks partition data while under it; do_open() on
      	   entire disk rereads partition if needed before dropping
      	   ->bd_sem (right before dropping it); BLKRRPART does
      	   trylock on ->bd_sem and then checks ->bd_part_count -
      	   same logics as before, except that we use ->bd_sem instead
      	   of ->bd_part_sem.
      
      That kills recursive open(), gives us the same exclusion rules as
      we had and makes sure that actual IO (including rereading partition
      tables) is done only when we are ready to do it.
      
      It actually sounds a lot nastier than it is.  do_open() is a one sick
      puppy right now, but we have everything in one place and _out_ of drivers
      (and 20-odd equally sick puppies are gone from them, along with about
      the same number of races).
      
      Now we are almost ready to clean it up for good - all that remains to
      do before that is to get the rest of drivers (cciss, DAC960, i2o and
      a couple of ancients - xd and acsi) using per-disk gendisks.  Then
      most of that crap will disappear.
      
      BTW, the only generic ioctl remaining in the drivers is HDIO_GETGEO -
      a lot of foo_ioctl() starts with if (cmd != HDIO_GETGEO) return -EINVAL; ;-)
      951f4be9
    • Alexander Viro's avatar
      [PATCH] ps2esdi.c per-disk gendisks · 9804df6c
      Alexander Viro authored
      ps2esdi.c switched to per-disk gendisks
      9804df6c
    • Alexander Viro's avatar
      [PATCH] cpqarray.c per-disk gendisks · ea309121
      Alexander Viro authored
      cpqarray.c switched to per-disk gendisks
      ea309121
    • Alexander Viro's avatar
      [PATCH] partition table flush/read cleanup · 816ab591
      Alexander Viro authored
      Big One.  Flushing/rereading partition tables is taken from
      ->revalidate() for partitioned devices; now it's done in the
      caller (check_disk_change()).  BLKRRPART handling also moved
      out of drivers - they are still allowed to override it (DAC960
      and i2o are the only remaining ones), but common case is handled
      in fs/block_dev.c.
      
      Note: we are still only shifting stuff - bd_sem deadlocks in
      check_disk_change() are still there.  However, now we have all
      relevant code outside of drivers and that will allow to fix the
      thing (see next patches).
      816ab591
    • Alexander Viro's avatar
      [PATCH] ide subdrivers attach() cleanup · fc4dfb65
      Alexander Viro authored
      ->attach() for ide subdrivers explicitly calls register_disk()
      instead of ata_revalidate() now; revalidate_drives() is gone -
      it's not needed anymore (we _know_ that we'll read partition
      table as soon as driver claims the drive; no need to mess with
      bogus rereading).
      fc4dfb65
    • Alexander Viro's avatar
      [PATCH] clean up major_name · 7e06e792
      Alexander Viro authored
      ->major_name for per-disk gendisks set to full name - i.e.
      IDE gendisks have "hda", "hdb", etc. instead of "hd".
      As the result, we kill a lot of crap in check.c::disk_name().
      In particular, now we can afford ->minor_shift set to 0
      for ide-cd (disk_name() was the only obstacle)
      7e06e792
    • Alexander Viro's avatar
      [PATCH] make check_disk_change() use struct block_device · 814bd2ba
      Alexander Viro authored
      check_disk_change() converted to passing struct block_device.
      
      Old variant is still needed for a couple of places; wrapper
      is provided (__check_disk_change(kdev)).  do_open() logics
      with setting ->bd_op sanitized - now we do that before calling
      ->open().
      814bd2ba
    • Alexander Viro's avatar
      [PATCH] fix /proc/partitions braino · 5c2f6403
      Alexander Viro authored
      fix for embarrassing braino in /proc/partitions - size in kilobytes
      is _half_ the size in secotrs, not twice that size...
      5c2f6403
    • Alexander Viro's avatar
      [PATCH] seq_read() fix · 4f4b6a13
      Alexander Viro authored
      Present both in 2.4 and 2.5 ;-/
      4f4b6a13
  2. 01 Aug, 2002 31 commits