> + struct semaphore or_sem; /* protect co-incident opens and releases */ Seems like this should be a mutex. > sfds_list_empty(Sg_device *sdp) > { > unsigned long flags; > int ret; > > + spin_lock_irqsave(&sdp->sfd_lock, flags); > + ret = list_empty(&sdp->sfds); > + spin_unlock_irqrestore(&sdp->sfd_lock, flags); > return ret; Protecting just a list_empty check with a local will give you racy results. Seems like you should take the look over the check and the resulting action that modifies the list. That'd also mean replacing the wait_event* calls with open coded prepare_wait / finish_wait loops. > + down(&sdp->or_sem); > + alone = sfds_list_empty(sdp); > + if ((flags & O_EXCL) && (O_RDONLY == (flags & O_ACCMODE))) { > + retval = -EPERM; /* Don't allow O_EXCL with read only access */ > + goto error_out; > + } Seems like the pure flags check should move to the beginning of the function before taking any locks. -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html