diff options
author | Christoph Hellwig <hch@lst.de> | 2016-07-08 05:41:29 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2016-07-15 15:46:08 -0400 |
commit | d702d41ed41328487bd3b270467721222f8036e4 (patch) | |
tree | cd6fdecab6d461caeafa864dd968837dc73f5280 | |
parent | 0173ca0544b682b7b313269dc0600d4774098a14 (diff) |
nfs/blocklayout: refactor open-by-wwn
The current code works with the standard udev/systemd names, but we'll have
to add another method in the next patch. Refactor it into a separate helper
to make room for the new variant.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r-- | fs/nfs/blocklayout/dev.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/fs/nfs/blocklayout/dev.c b/fs/nfs/blocklayout/dev.c index 7fb9c07c078c..ea70883a174a 100644 --- a/fs/nfs/blocklayout/dev.c +++ b/fs/nfs/blocklayout/dev.c | |||
@@ -287,44 +287,45 @@ bl_validate_designator(struct pnfs_block_volume *v) | |||
287 | } | 287 | } |
288 | } | 288 | } |
289 | 289 | ||
290 | /* | ||
291 | * Try to open the udev path for the WWN. At least on Debian the udev | ||
292 | * by-id path will always point to the dm-multipath device if one exists. | ||
293 | */ | ||
294 | static struct block_device * | ||
295 | bl_open_udev_path(struct pnfs_block_volume *v) | ||
296 | { | ||
297 | struct block_device *bdev; | ||
298 | const char *devname; | ||
299 | |||
300 | devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/wwn-0x%*phN", | ||
301 | v->scsi.designator_len, v->scsi.designator); | ||
302 | if (!devname) | ||
303 | return ERR_PTR(-ENOMEM); | ||
304 | |||
305 | bdev = blkdev_get_by_path(devname, FMODE_READ | FMODE_WRITE, NULL); | ||
306 | if (IS_ERR(bdev)) { | ||
307 | pr_warn("pNFS: failed to open device %s (%ld)\n", | ||
308 | devname, PTR_ERR(bdev)); | ||
309 | } | ||
310 | |||
311 | kfree(devname); | ||
312 | return bdev; | ||
313 | } | ||
314 | |||
290 | static int | 315 | static int |
291 | bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d, | 316 | bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d, |
292 | struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask) | 317 | struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask) |
293 | { | 318 | { |
294 | struct pnfs_block_volume *v = &volumes[idx]; | 319 | struct pnfs_block_volume *v = &volumes[idx]; |
295 | const struct pr_ops *ops; | 320 | const struct pr_ops *ops; |
296 | const char *devname; | ||
297 | int error; | 321 | int error; |
298 | 322 | ||
299 | if (!bl_validate_designator(v)) | 323 | if (!bl_validate_designator(v)) |
300 | return -EINVAL; | 324 | return -EINVAL; |
301 | 325 | ||
302 | switch (v->scsi.designator_len) { | 326 | d->bdev = bl_open_udev_path(v); |
303 | case 8: | 327 | if (IS_ERR(d->bdev)) |
304 | devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/wwn-0x%8phN", | ||
305 | v->scsi.designator); | ||
306 | break; | ||
307 | case 12: | ||
308 | devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/wwn-0x%12phN", | ||
309 | v->scsi.designator); | ||
310 | break; | ||
311 | case 16: | ||
312 | devname = kasprintf(GFP_KERNEL, "/dev/disk/by-id/wwn-0x%16phN", | ||
313 | v->scsi.designator); | ||
314 | break; | ||
315 | default: | ||
316 | return -EINVAL; | ||
317 | } | ||
318 | |||
319 | d->bdev = blkdev_get_by_path(devname, FMODE_READ | FMODE_WRITE, NULL); | ||
320 | if (IS_ERR(d->bdev)) { | ||
321 | pr_warn("pNFS: failed to open device %s (%ld)\n", | ||
322 | devname, PTR_ERR(d->bdev)); | ||
323 | kfree(devname); | ||
324 | return PTR_ERR(d->bdev); | 328 | return PTR_ERR(d->bdev); |
325 | } | ||
326 | |||
327 | kfree(devname); | ||
328 | 329 | ||
329 | d->len = i_size_read(d->bdev->bd_inode); | 330 | d->len = i_size_read(d->bdev->bd_inode); |
330 | d->map = bl_map_simple; | 331 | d->map = bl_map_simple; |