@@ -150,7 +150,7 @@ static char preaction[16] = "pre_none";
150150static unsigned char preop_val = WDOG_PREOP_NONE ;
151151
152152static char preop [16 ] = "preop_none" ;
153- static DEFINE_SPINLOCK ( ipmi_read_lock );
153+ static DEFINE_MUTEX ( ipmi_read_mutex );
154154static char data_to_read ;
155155static DECLARE_WAIT_QUEUE_HEAD (read_q );
156156static struct fasync_struct * fasync_q ;
@@ -793,7 +793,7 @@ static ssize_t ipmi_read(struct file *file,
793793 * Reading returns if the pretimeout has gone off, and it only does
794794 * it once per pretimeout.
795795 */
796- spin_lock_irq ( & ipmi_read_lock );
796+ mutex_lock ( & ipmi_read_mutex );
797797 if (!data_to_read ) {
798798 if (file -> f_flags & O_NONBLOCK ) {
799799 rv = - EAGAIN ;
@@ -804,9 +804,9 @@ static ssize_t ipmi_read(struct file *file,
804804 add_wait_queue (& read_q , & wait );
805805 while (!data_to_read && !signal_pending (current )) {
806806 set_current_state (TASK_INTERRUPTIBLE );
807- spin_unlock_irq ( & ipmi_read_lock );
807+ mutex_unlock ( & ipmi_read_mutex );
808808 schedule ();
809- spin_lock_irq ( & ipmi_read_lock );
809+ mutex_lock ( & ipmi_read_mutex );
810810 }
811811 remove_wait_queue (& read_q , & wait );
812812
@@ -818,7 +818,7 @@ static ssize_t ipmi_read(struct file *file,
818818 data_to_read = 0 ;
819819
820820 out :
821- spin_unlock_irq ( & ipmi_read_lock );
821+ mutex_unlock ( & ipmi_read_mutex );
822822
823823 if (rv == 0 ) {
824824 if (copy_to_user (buf , & data_to_read , 1 ))
@@ -856,10 +856,10 @@ static __poll_t ipmi_poll(struct file *file, poll_table *wait)
856856
857857 poll_wait (file , & read_q , wait );
858858
859- spin_lock_irq ( & ipmi_read_lock );
859+ mutex_lock ( & ipmi_read_mutex );
860860 if (data_to_read )
861861 mask |= (EPOLLIN | EPOLLRDNORM );
862- spin_unlock_irq ( & ipmi_read_lock );
862+ mutex_unlock ( & ipmi_read_mutex );
863863
864864 return mask ;
865865}
@@ -932,13 +932,11 @@ static void ipmi_wdog_pretimeout_handler(void *handler_data)
932932 if (atomic_inc_and_test (& preop_panic_excl ))
933933 panic ("Watchdog pre-timeout" );
934934 } else if (preop_val == WDOG_PREOP_GIVE_DATA ) {
935- unsigned long flags ;
936-
937- spin_lock_irqsave (& ipmi_read_lock , flags );
935+ mutex_lock (& ipmi_read_mutex );
938936 data_to_read = 1 ;
939937 wake_up_interruptible (& read_q );
940938 kill_fasync (& fasync_q , SIGIO , POLL_IN );
941- spin_unlock_irqrestore ( & ipmi_read_lock , flags );
939+ mutex_unlock ( & ipmi_read_mutex );
942940 }
943941 }
944942
0 commit comments