logo       

[PATCH] sg O_EXCL on open() lk 2.6.0-test9: msg#00245

Subject: [PATCH] sg O_EXCL on open() lk 2.6.0-test9
While on the subject of bugs in sg, one came
to light recently (only in lk 2.6, not lk 2.4).

Changelog:
  When detecting a locked sg device (O_EXCL) return
  -EBUSY (rather than 0) from sg_open()

Doug Gilbert
--- linux/drivers/scsi/sg.c     2003-10-28 09:18:32.000000000 +1000
+++ linux/drivers/scsi/sg.c260t9ma      2003-11-14 20:15:20.000000000 +1000
@@ -243,7 +243,7 @@
        Sg_device *sdp;
        Sg_fd *sfp;
        int res;
-       int retval = -EBUSY;
+       int retval;
 
        SCSI_LOG_TIMEOUT(3, printk("sg_open: dev=%d, flags=0x%x\n", dev, 
flags));
        sdp = sg_get_dev(dev);
@@ -270,8 +270,10 @@
                        retval = -EPERM; /* Can't lock it with read only access 
*/
                        goto error_out;
                }
-               if (sdp->headfp && (flags & O_NONBLOCK))
+               if (sdp->headfp && (flags & O_NONBLOCK)) {
+                       retval = -EBUSY;
                        goto error_out;
+               }
                res = 0;
                __wait_event_interruptible(sdp->o_excl_wait,
                        ((sdp->headfp || sdp->exclude) ? 0 : (sdp->exclude = 
1)), res);
@@ -280,8 +282,10 @@
                        goto error_out;
                }
        } else if (sdp->exclude) {      /* some other fd has an exclusive lock 
on dev */
-               if (flags & O_NONBLOCK)
+               if (flags & O_NONBLOCK) {
+                       retval = -EBUSY;
                        goto error_out;
+               }
                res = 0;
                __wait_event_interruptible(sdp->o_excl_wait, (!sdp->exclude),
                                           res);
<Prev in Thread] Current Thread [Next in Thread>