13
13
14
14
#define NFSDBG_FACILITY NFSDBG_PNFS_LD
15
15
16
+ static void bl_unregister_scsi (struct pnfs_block_dev * dev )
17
+ {
18
+ struct block_device * bdev = file_bdev (dev -> bdev_file );
19
+ const struct pr_ops * ops = bdev -> bd_disk -> fops -> pr_ops ;
20
+
21
+ if (!test_and_clear_bit (PNFS_BDEV_REGISTERED , & dev -> flags ))
22
+ return ;
23
+
24
+ if (ops -> pr_register (bdev , dev -> pr_key , 0 , false))
25
+ pr_err ("failed to unregister PR key.\n" );
26
+ }
27
+
28
+ static bool bl_register_scsi (struct pnfs_block_dev * dev )
29
+ {
30
+ struct block_device * bdev = file_bdev (dev -> bdev_file );
31
+ const struct pr_ops * ops = bdev -> bd_disk -> fops -> pr_ops ;
32
+ int status ;
33
+
34
+ if (test_and_set_bit (PNFS_BDEV_REGISTERED , & dev -> flags ))
35
+ return true;
36
+
37
+ status = ops -> pr_register (bdev , 0 , dev -> pr_key , true);
38
+ if (status ) {
39
+ pr_err ("pNFS: failed to register key for block device %s." ,
40
+ bdev -> bd_disk -> disk_name );
41
+ return false;
42
+ }
43
+ return true;
44
+ }
45
+
46
+ static void bl_unregister_dev (struct pnfs_block_dev * dev )
47
+ {
48
+ u32 i ;
49
+
50
+ if (dev -> nr_children ) {
51
+ for (i = 0 ; i < dev -> nr_children ; i ++ )
52
+ bl_unregister_dev (& dev -> children [i ]);
53
+ return ;
54
+ }
55
+
56
+ if (dev -> type == PNFS_BLOCK_VOLUME_SCSI )
57
+ bl_unregister_scsi (dev );
58
+ }
59
+
60
+ bool bl_register_dev (struct pnfs_block_dev * dev )
61
+ {
62
+ u32 i ;
63
+
64
+ if (dev -> nr_children ) {
65
+ for (i = 0 ; i < dev -> nr_children ; i ++ ) {
66
+ if (!bl_register_dev (& dev -> children [i ])) {
67
+ while (i > 0 )
68
+ bl_unregister_dev (& dev -> children [-- i ]);
69
+ return false;
70
+ }
71
+ }
72
+ return true;
73
+ }
74
+
75
+ if (dev -> type == PNFS_BLOCK_VOLUME_SCSI )
76
+ return bl_register_scsi (dev );
77
+ return true;
78
+ }
79
+
16
80
static void
17
81
bl_free_device (struct pnfs_block_dev * dev )
18
82
{
83
+ bl_unregister_dev (dev );
84
+
19
85
if (dev -> nr_children ) {
20
86
int i ;
21
87
22
88
for (i = 0 ; i < dev -> nr_children ; i ++ )
23
89
bl_free_device (& dev -> children [i ]);
24
90
kfree (dev -> children );
25
91
} else {
26
- if (dev -> pr_registered ) {
27
- const struct pr_ops * ops =
28
- file_bdev (dev -> bdev_file )-> bd_disk -> fops -> pr_ops ;
29
- int error ;
30
-
31
- error = ops -> pr_register (file_bdev (dev -> bdev_file ),
32
- dev -> pr_key , 0 , false);
33
- if (error )
34
- pr_err ("failed to unregister PR key.\n" );
35
- }
36
-
37
92
if (dev -> bdev_file )
38
93
fput (dev -> bdev_file );
39
94
}
@@ -365,14 +420,6 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d,
365
420
goto out_blkdev_put ;
366
421
}
367
422
368
- error = ops -> pr_register (file_bdev (d -> bdev_file ), 0 , d -> pr_key , true);
369
- if (error ) {
370
- pr_err ("pNFS: failed to register key for block device %s." ,
371
- file_bdev (d -> bdev_file )-> bd_disk -> disk_name );
372
- goto out_blkdev_put ;
373
- }
374
-
375
- d -> pr_registered = true;
376
423
return 0 ;
377
424
378
425
out_blkdev_put :
@@ -458,7 +505,9 @@ static int
458
505
bl_parse_deviceid (struct nfs_server * server , struct pnfs_block_dev * d ,
459
506
struct pnfs_block_volume * volumes , int idx , gfp_t gfp_mask )
460
507
{
461
- switch (volumes [idx ].type ) {
508
+ d -> type = volumes [idx ].type ;
509
+
510
+ switch (d -> type ) {
462
511
case PNFS_BLOCK_VOLUME_SIMPLE :
463
512
return bl_parse_simple (server , d , volumes , idx , gfp_mask );
464
513
case PNFS_BLOCK_VOLUME_SLICE :
@@ -470,7 +519,7 @@ bl_parse_deviceid(struct nfs_server *server, struct pnfs_block_dev *d,
470
519
case PNFS_BLOCK_VOLUME_SCSI :
471
520
return bl_parse_scsi (server , d , volumes , idx , gfp_mask );
472
521
default :
473
- dprintk ("unsupported volume type: %d\n" , volumes [ idx ]. type );
522
+ dprintk ("unsupported volume type: %d\n" , d -> type );
474
523
return - EIO ;
475
524
}
476
525
}
0 commit comments