@@ -63,6 +63,7 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
63
63
64
64
dev_info (dev , "stub up\n" );
65
65
66
+ mutex_lock (& sdev -> ud .sysfs_lock );
66
67
spin_lock_irq (& sdev -> ud .lock );
67
68
68
69
if (sdev -> ud .status != SDEV_ST_AVAILABLE ) {
@@ -87,13 +88,13 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
87
88
tcp_rx = kthread_create (stub_rx_loop , & sdev -> ud , "stub_rx" );
88
89
if (IS_ERR (tcp_rx )) {
89
90
sockfd_put (socket );
90
- return - EINVAL ;
91
+ goto unlock_mutex ;
91
92
}
92
93
tcp_tx = kthread_create (stub_tx_loop , & sdev -> ud , "stub_tx" );
93
94
if (IS_ERR (tcp_tx )) {
94
95
kthread_stop (tcp_rx );
95
96
sockfd_put (socket );
96
- return - EINVAL ;
97
+ goto unlock_mutex ;
97
98
}
98
99
99
100
/* get task structs now */
@@ -112,6 +113,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
112
113
wake_up_process (sdev -> ud .tcp_rx );
113
114
wake_up_process (sdev -> ud .tcp_tx );
114
115
116
+ mutex_unlock (& sdev -> ud .sysfs_lock );
117
+
115
118
} else {
116
119
dev_info (dev , "stub down\n" );
117
120
@@ -122,6 +125,7 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
122
125
spin_unlock_irq (& sdev -> ud .lock );
123
126
124
127
usbip_event_add (& sdev -> ud , SDEV_EVENT_DOWN );
128
+ mutex_unlock (& sdev -> ud .sysfs_lock );
125
129
}
126
130
127
131
return count ;
@@ -130,6 +134,8 @@ static ssize_t usbip_sockfd_store(struct device *dev, struct device_attribute *a
130
134
sockfd_put (socket );
131
135
err :
132
136
spin_unlock_irq (& sdev -> ud .lock );
137
+ unlock_mutex :
138
+ mutex_unlock (& sdev -> ud .sysfs_lock );
133
139
return - EINVAL ;
134
140
}
135
141
static DEVICE_ATTR_WO (usbip_sockfd );
@@ -270,6 +276,7 @@ static struct stub_device *stub_device_alloc(struct usb_device *udev)
270
276
sdev -> ud .side = USBIP_STUB ;
271
277
sdev -> ud .status = SDEV_ST_AVAILABLE ;
272
278
spin_lock_init (& sdev -> ud .lock );
279
+ mutex_init (& sdev -> ud .sysfs_lock );
273
280
sdev -> ud .tcp_socket = NULL ;
274
281
sdev -> ud .sockfd = -1 ;
275
282
0 commit comments