@@ -450,18 +450,18 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
450
450
mutex_lock (& dev -> lock_printer_io );
451
451
spin_lock_irqsave (& dev -> lock , flags );
452
452
453
- if (dev -> interface < 0 ) {
454
- spin_unlock_irqrestore (& dev -> lock , flags );
455
- mutex_unlock (& dev -> lock_printer_io );
456
- return - ENODEV ;
457
- }
453
+ if (dev -> interface < 0 )
454
+ goto out_disabled ;
458
455
459
456
/* We will use this flag later to check if a printer reset happened
460
457
* after we turn interrupts back on.
461
458
*/
462
459
dev -> reset_printer = 0 ;
463
460
464
461
setup_rx_reqs (dev );
462
+ /* this dropped the lock - need to retest */
463
+ if (dev -> interface < 0 )
464
+ goto out_disabled ;
465
465
466
466
bytes_copied = 0 ;
467
467
current_rx_req = dev -> current_rx_req ;
@@ -495,6 +495,8 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
495
495
wait_event_interruptible (dev -> rx_wait ,
496
496
(likely (!list_empty (& dev -> rx_buffers ))));
497
497
spin_lock_irqsave (& dev -> lock , flags );
498
+ if (dev -> interface < 0 )
499
+ goto out_disabled ;
498
500
}
499
501
500
502
/* We have data to return then copy it to the caller's buffer.*/
@@ -538,6 +540,9 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
538
540
return - EAGAIN ;
539
541
}
540
542
543
+ if (dev -> interface < 0 )
544
+ goto out_disabled ;
545
+
541
546
/* If we not returning all the data left in this RX request
542
547
* buffer then adjust the amount of data left in the buffer.
543
548
* Othewise if we are done with this RX request buffer then
@@ -567,6 +572,11 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
567
572
return bytes_copied ;
568
573
else
569
574
return - EAGAIN ;
575
+
576
+ out_disabled :
577
+ spin_unlock_irqrestore (& dev -> lock , flags );
578
+ mutex_unlock (& dev -> lock_printer_io );
579
+ return - ENODEV ;
570
580
}
571
581
572
582
static ssize_t
@@ -587,11 +597,8 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
587
597
mutex_lock (& dev -> lock_printer_io );
588
598
spin_lock_irqsave (& dev -> lock , flags );
589
599
590
- if (dev -> interface < 0 ) {
591
- spin_unlock_irqrestore (& dev -> lock , flags );
592
- mutex_unlock (& dev -> lock_printer_io );
593
- return - ENODEV ;
594
- }
600
+ if (dev -> interface < 0 )
601
+ goto out_disabled ;
595
602
596
603
/* Check if a printer reset happens while we have interrupts on */
597
604
dev -> reset_printer = 0 ;
@@ -614,6 +621,8 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
614
621
wait_event_interruptible (dev -> tx_wait ,
615
622
(likely (!list_empty (& dev -> tx_reqs ))));
616
623
spin_lock_irqsave (& dev -> lock , flags );
624
+ if (dev -> interface < 0 )
625
+ goto out_disabled ;
617
626
}
618
627
619
628
while (likely (!list_empty (& dev -> tx_reqs )) && len ) {
@@ -663,6 +672,9 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
663
672
return - EAGAIN ;
664
673
}
665
674
675
+ if (dev -> interface < 0 )
676
+ goto out_disabled ;
677
+
666
678
list_add (& req -> list , & dev -> tx_reqs_active );
667
679
668
680
/* here, we unlock, and only unlock, to avoid deadlock. */
@@ -675,6 +687,8 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
675
687
mutex_unlock (& dev -> lock_printer_io );
676
688
return - EAGAIN ;
677
689
}
690
+ if (dev -> interface < 0 )
691
+ goto out_disabled ;
678
692
}
679
693
680
694
spin_unlock_irqrestore (& dev -> lock , flags );
@@ -686,6 +700,11 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
686
700
return bytes_copied ;
687
701
else
688
702
return - EAGAIN ;
703
+
704
+ out_disabled :
705
+ spin_unlock_irqrestore (& dev -> lock , flags );
706
+ mutex_unlock (& dev -> lock_printer_io );
707
+ return - ENODEV ;
689
708
}
690
709
691
710
static int
0 commit comments