[PATCH] 2.2: Support O_NONBLOCK for SCSI disks

From: Chip Salzenberg (chip@valinux.com)
Date: Tue Aug 29 2000 - 21:32:10 EDT

  • Next message: Chip Salzenberg: "[PATCH] 2.2: Magic patch for older Symbios SCSI"

    Unless I misunderstood Eric Youngdale's reply, he agrees that the
    below patch is OK.

    Index: drivers/scsi/sd.c
    --- drivers/scsi/sd.c.prev
    +++ drivers/scsi/sd.c Fri Jun 23 12:50:23 2000
    @@ -151,34 +151,41 @@ static int sd_open(struct inode * inode,
          * is being re-read.
          */
    -
         while (rscsi_disks[target].device->busy)
             barrier();
    - if(rscsi_disks[target].device->removable) {
    +
    + /*
    + * When opening removable disks, we check media...
    + * ... unless media don't matter, due to O_NONBLOCK.
    + */
    + if ( rscsi_disks[target].device->removable
    + && !(filp->f_flags & O_NONBLOCK) )
    + {
    + /*
    + * Note disk change and/or removal.
    + * Also try to read new partition table (if any).
    + */
             check_disk_change(inode->i_rdev);
     
    - /*
    - * If the drive is empty, just let the open fail.
    - */
    + /*
    + * If the drive is empty, let the open fail.
    + */
             if ( !rscsi_disks[target].ready )
    - return -ENXIO;
    + return -ENXIO;
     
    - /*
    - * Similarly, if the device has the write protect tab set,
    - * have the open fail if the user expects to be able to write
    - * to the thing.
    - */
    - if ( (rscsi_disks[target].write_prot) && (filp->f_mode & 2) )
    - return -EROFS;
    + /*
    + * If the device has the write protect tab set,
    + * let the open fail if the user expects to be able to write.
    + */
    + if ( (rscsi_disks[target].write_prot) && (filp->f_mode & 2) )
    + return -EROFS;
         }
     
         /*
    - * It is possible that the disk changing stuff resulted in the device being taken
    - * offline. If this is the case, report this to the user, and don't pretend that
    - * the open actually succeeded.
    + * It is possible that the disk changing stuff (or something
    + * else?) resulted in the device being taken offline.
    + * If so, let the open fail.
          */
    - if( !rscsi_disks[target].device->online )
    - {
    + if ( !rscsi_disks[target].device->online )
             return -ENXIO;
    - }
     
         /*
    @@ -1069,5 +1076,4 @@ static int check_scsidisk_media_change(k
         int target;
         struct inode inode;
    - int flag = 0;
     
         target = DEVICE_NR(full_dev);
    @@ -1121,9 +1127,9 @@ static int check_scsidisk_media_change(k
          * struct and tested at open ! Daniel Roche ( dan@lectra.fr )
          */
    -
         rscsi_disks[target].ready = 1; /* FLOPTICAL */
     
         retval = rscsi_disks[target].device->changed;
    - if(!flag) rscsi_disks[target].device->changed = 0;
    + rscsi_disks[target].device->changed = 0;
    +
         return retval;
     }

    -- 
    Chip Salzenberg              - a.k.a. -              <chip@valinux.com>
    "I wanted to play hopscotch with the impenetrable mystery of existence,
        but he stepped in a wormhole and had to go in early."  // MST3K
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    Please read the FAQ at http://www.tux.org/lkml/
    



    This archive was generated by hypermail 2b29 : Tue Aug 29 2000 - 21:34:11 EDT