@@ -136,8 +136,8 @@ static int p9_xen_request(struct p9_client *client, struct p9_req_t *p9_req)
136136 ring = & priv -> rings [num ];
137137
138138again :
139- while (wait_event_killable (ring -> wq ,
140- p9_xen_write_todo (ring , size )) != 0 )
139+ while (io_wait_event_killable (ring -> wq ,
140+ p9_xen_write_todo (ring , size )) != 0 )
141141 ;
142142
143143 spin_lock_irqsave (& ring -> lock , flags );
@@ -277,45 +277,52 @@ static void xen_9pfs_front_free(struct xen_9pfs_front_priv *priv)
277277{
278278 int i , j ;
279279
280- write_lock (& xen_9pfs_lock );
281- list_del (& priv -> list );
282- write_unlock (& xen_9pfs_lock );
283-
284- for (i = 0 ; i < XEN_9PFS_NUM_RINGS ; i ++ ) {
285- struct xen_9pfs_dataring * ring = & priv -> rings [i ];
286-
287- cancel_work_sync (& ring -> work );
288-
289- if (!priv -> rings [i ].intf )
290- break ;
291- if (priv -> rings [i ].irq > 0 )
292- unbind_from_irqhandler (priv -> rings [i ].irq , ring );
293- if (priv -> rings [i ].data .in ) {
294- for (j = 0 ;
295- j < (1 << priv -> rings [i ].intf -> ring_order );
296- j ++ ) {
297- grant_ref_t ref ;
298-
299- ref = priv -> rings [i ].intf -> ref [j ];
300- gnttab_end_foreign_access (ref , NULL );
301- }
302- free_pages_exact (priv -> rings [i ].data .in ,
280+ if (priv -> rings ) {
281+ for (i = 0 ; i < XEN_9PFS_NUM_RINGS ; i ++ ) {
282+ struct xen_9pfs_dataring * ring = & priv -> rings [i ];
283+
284+ cancel_work_sync (& ring -> work );
285+
286+ if (!priv -> rings [i ].intf )
287+ break ;
288+ if (priv -> rings [i ].irq > 0 )
289+ unbind_from_irqhandler (priv -> rings [i ].irq , ring );
290+ if (priv -> rings [i ].data .in ) {
291+ for (j = 0 ;
292+ j < (1 << priv -> rings [i ].intf -> ring_order );
293+ j ++ ) {
294+ grant_ref_t ref ;
295+
296+ ref = priv -> rings [i ].intf -> ref [j ];
297+ gnttab_end_foreign_access (ref , NULL );
298+ }
299+ free_pages_exact (priv -> rings [i ].data .in ,
303300 1UL << (priv -> rings [i ].intf -> ring_order +
304301 XEN_PAGE_SHIFT ));
302+ }
303+ gnttab_end_foreign_access (priv -> rings [i ].ref , NULL );
304+ free_page ((unsigned long )priv -> rings [i ].intf );
305305 }
306- gnttab_end_foreign_access (priv -> rings [i ].ref , NULL );
307- free_page ((unsigned long )priv -> rings [i ].intf );
306+ kfree (priv -> rings );
308307 }
309- kfree (priv -> rings );
310308 kfree (priv -> tag );
311309 kfree (priv );
312310}
313311
314312static void xen_9pfs_front_remove (struct xenbus_device * dev )
315313{
316- struct xen_9pfs_front_priv * priv = dev_get_drvdata ( & dev -> dev ) ;
314+ struct xen_9pfs_front_priv * priv ;
317315
316+ write_lock (& xen_9pfs_lock );
317+ priv = dev_get_drvdata (& dev -> dev );
318+ if (priv == NULL ) {
319+ write_unlock (& xen_9pfs_lock );
320+ return ;
321+ }
318322 dev_set_drvdata (& dev -> dev , NULL );
323+ list_del (& priv -> list );
324+ write_unlock (& xen_9pfs_lock );
325+
319326 xen_9pfs_front_free (priv );
320327}
321328
@@ -382,7 +389,7 @@ static int xen_9pfs_front_init(struct xenbus_device *dev)
382389{
383390 int ret , i ;
384391 struct xenbus_transaction xbt ;
385- struct xen_9pfs_front_priv * priv = dev_get_drvdata ( & dev -> dev ) ;
392+ struct xen_9pfs_front_priv * priv ;
386393 char * versions , * v ;
387394 unsigned int max_rings , max_ring_order , len = 0 ;
388395
@@ -410,6 +417,10 @@ static int xen_9pfs_front_init(struct xenbus_device *dev)
410417 if (p9_xen_trans .maxsize > XEN_FLEX_RING_SIZE (max_ring_order ))
411418 p9_xen_trans .maxsize = XEN_FLEX_RING_SIZE (max_ring_order ) / 2 ;
412419
420+ priv = kzalloc (sizeof (* priv ), GFP_KERNEL );
421+ if (!priv )
422+ return - ENOMEM ;
423+ priv -> dev = dev ;
413424 priv -> rings = kcalloc (XEN_9PFS_NUM_RINGS , sizeof (* priv -> rings ),
414425 GFP_KERNEL );
415426 if (!priv -> rings ) {
@@ -468,6 +479,11 @@ static int xen_9pfs_front_init(struct xenbus_device *dev)
468479 goto error ;
469480 }
470481
482+ write_lock (& xen_9pfs_lock );
483+ dev_set_drvdata (& dev -> dev , priv );
484+ list_add_tail (& priv -> list , & xen_9pfs_devs );
485+ write_unlock (& xen_9pfs_lock );
486+
471487 xenbus_switch_state (dev , XenbusStateInitialised );
472488 return 0 ;
473489
@@ -482,19 +498,6 @@ static int xen_9pfs_front_init(struct xenbus_device *dev)
482498static int xen_9pfs_front_probe (struct xenbus_device * dev ,
483499 const struct xenbus_device_id * id )
484500{
485- struct xen_9pfs_front_priv * priv = NULL ;
486-
487- priv = kzalloc (sizeof (* priv ), GFP_KERNEL );
488- if (!priv )
489- return - ENOMEM ;
490-
491- priv -> dev = dev ;
492- dev_set_drvdata (& dev -> dev , priv );
493-
494- write_lock (& xen_9pfs_lock );
495- list_add_tail (& priv -> list , & xen_9pfs_devs );
496- write_unlock (& xen_9pfs_lock );
497-
498501 return 0 ;
499502}
500503
0 commit comments