08f64a91361ce5678c6fb4f7855d4bf2af4194ad
[zfs.git] / module / zfs / vdev_disk.c
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (C) 2008-2010 Lawrence Livermore National Security, LLC.
23  * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
24  * Rewritten for Linux by Brian Behlendorf <behlendorf1@llnl.gov>.
25  * LLNL-CODE-403049.
26  */
27
28 #include <sys/zfs_context.h>
29 #include <sys/spa.h>
30 #include <sys/vdev_disk.h>
31 #include <sys/vdev_impl.h>
32 #include <sys/fs/zfs.h>
33 #include <sys/zio.h>
34 #include <sys/sunldi.h>
35
36 char *zfs_vdev_scheduler = VDEV_SCHEDULER;
37 static void *zfs_vdev_holder = VDEV_HOLDER;
38
39 /*
40  * Virtual device vector for disks.
41  */
42 typedef struct dio_request {
43         struct completion       dr_comp;        /* Completion for sync IO */
44         atomic_t                dr_ref;         /* References */
45         zio_t                   *dr_zio;        /* Parent ZIO */
46         int                     dr_rw;          /* Read/Write */
47         int                     dr_error;       /* Bio error */
48         int                     dr_bio_count;   /* Count of bio's */
49         struct bio              *dr_bio[0];     /* Attached bio's */
50 } dio_request_t;
51
52
53 #ifdef HAVE_OPEN_BDEV_EXCLUSIVE
54 static fmode_t
55 vdev_bdev_mode(int smode)
56 {
57         fmode_t mode = 0;
58
59         ASSERT3S(smode & (FREAD | FWRITE), !=, 0);
60
61         if (smode & FREAD)
62                 mode |= FMODE_READ;
63
64         if (smode & FWRITE)
65                 mode |= FMODE_WRITE;
66
67         return mode;
68 }
69 #else
70 static int
71 vdev_bdev_mode(int smode)
72 {
73         int mode = 0;
74
75         ASSERT3S(smode & (FREAD | FWRITE), !=, 0);
76
77         if ((smode & FREAD) && !(smode & FWRITE))
78                 mode = MS_RDONLY;
79
80         return mode;
81 }
82 #endif /* HAVE_OPEN_BDEV_EXCLUSIVE */
83
84 static uint64_t
85 bdev_capacity(struct block_device *bdev)
86 {
87         struct hd_struct *part = bdev->bd_part;
88
89         /* The partition capacity referenced by the block device */
90         if (part)
91                 return (part->nr_sects << 9);
92
93         /* Otherwise assume the full device capacity */
94         return (get_capacity(bdev->bd_disk) << 9);
95 }
96
97 static void
98 vdev_disk_error(zio_t *zio)
99 {
100 #ifdef ZFS_DEBUG
101         printk("ZFS: zio error=%d type=%d offset=%llu size=%llu "
102             "flags=%x delay=%llu\n", zio->io_error, zio->io_type,
103             (u_longlong_t)zio->io_offset, (u_longlong_t)zio->io_size,
104             zio->io_flags, (u_longlong_t)zio->io_delay);
105 #endif
106 }
107
108 /*
109  * Use the Linux 'noop' elevator for zfs managed block devices.  This
110  * strikes the ideal balance by allowing the zfs elevator to do all
111  * request ordering and prioritization.  While allowing the Linux
112  * elevator to do the maximum front/back merging allowed by the
113  * physical device.  This yields the largest possible requests for
114  * the device with the lowest total overhead.
115  */
116 static int
117 vdev_elevator_switch(vdev_t *v, char *elevator)
118 {
119         vdev_disk_t *vd = v->vdev_tsd;
120         struct block_device *bdev = vd->vd_bdev;
121         struct request_queue *q = bdev_get_queue(bdev);
122         char *device = bdev->bd_disk->disk_name;
123         int error;
124
125         /*
126          * Skip devices which are not whole disks (partitions).
127          * Device-mapper devices are excepted since they may be whole
128          * disks despite the vdev_wholedisk flag, in which case we can
129          * and should switch the elevator. If the device-mapper device
130          * does not have an elevator (i.e. dm-raid, dm-crypt, etc.) the
131          * "Skip devices without schedulers" check below will fail.
132          */
133         if (!v->vdev_wholedisk && strncmp(device, "dm-", 3) != 0)
134                 return (0);
135
136         /* Skip devices without schedulers (loop, ram, dm, etc) */
137         if (!q->elevator || !blk_queue_stackable(q))
138                 return (0);
139
140         /* Leave existing scheduler when set to "none" */
141         if (!strncmp(elevator, "none", 4) && (strlen(elevator) == 4))
142                 return (0);
143
144 #ifdef HAVE_ELEVATOR_CHANGE
145         error = elevator_change(q, elevator);
146 #else
147         /* For pre-2.6.36 kernels elevator_change() is not available.
148          * Therefore we fall back to using a usermodehelper to echo the
149          * elevator into sysfs;  This requires /bin/echo and sysfs to be
150          * mounted which may not be true early in the boot process.
151          */
152 # define SET_SCHEDULER_CMD \
153         "exec 0</dev/null " \
154         "     1>/sys/block/%s/queue/scheduler " \
155         "     2>/dev/null; " \
156         "echo %s"
157
158         {
159                 char *argv[] = { "/bin/sh", "-c", NULL, NULL };
160                 char *envp[] = { NULL };
161
162                 argv[2] = kmem_asprintf(SET_SCHEDULER_CMD, device, elevator);
163                 error = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
164                 strfree(argv[2]);
165         }
166 #endif /* HAVE_ELEVATOR_CHANGE */
167         if (error)
168                 printk("ZFS: Unable to set \"%s\" scheduler for %s (%s): %d\n",
169                        elevator, v->vdev_path, device, error);
170
171         return (error);
172 }
173
174 /*
175  * Expanding a whole disk vdev involves invoking BLKRRPART on the
176  * whole disk device. This poses a problem, because BLKRRPART will
177  * return EBUSY if one of the disk's partitions is open. That's why
178  * we have to do it here, just before opening the data partition.
179  * Unfortunately, BLKRRPART works by dropping all partitions and
180  * recreating them, which means that for a short time window, all
181  * /dev/sdxN device files disappear (until udev recreates them).
182  * This means two things:
183  *  - When we open the data partition just after a BLKRRPART, we
184  *    can't do it using the normal device file path because of the
185  *    obvious race condition with udev. Instead, we use reliable
186  *    kernel APIs to get a handle to the new partition device from
187  *    the whole disk device.
188  *  - Because vdev_disk_open() initially needs to find the device
189  *    using its path, multiple vdev_disk_open() invocations in
190  *    short succession on the same disk with BLKRRPARTs in the
191  *    middle have a high probability of failure (because of the
192  *    race condition with udev). A typical situation where this
193  *    might happen is when the zpool userspace tool does a
194  *    TRYIMPORT immediately followed by an IMPORT. For this
195  *    reason, we only invoke BLKRRPART in the module when strictly
196  *    necessary (zpool online -e case), and rely on userspace to
197  *    do it when possible.
198  */
199 static struct block_device *
200 vdev_disk_rrpart(const char *path, int mode, vdev_disk_t *vd)
201 {
202 #if defined(HAVE_3ARG_BLKDEV_GET) && defined(HAVE_GET_GENDISK)
203         struct block_device *bdev, *result = ERR_PTR(-ENXIO);
204         struct gendisk *disk;
205         int error, partno;
206
207         bdev = vdev_bdev_open(path, vdev_bdev_mode(mode), zfs_vdev_holder);
208         if (IS_ERR(bdev))
209                 return bdev;
210
211         disk = get_gendisk(bdev->bd_dev, &partno);
212         vdev_bdev_close(bdev, vdev_bdev_mode(mode));
213
214         if (disk) {
215                 bdev = bdget(disk_devt(disk));
216                 if (bdev) {
217                         error = blkdev_get(bdev, vdev_bdev_mode(mode), vd);
218                         if (error == 0)
219                                 error = ioctl_by_bdev(bdev, BLKRRPART, 0);
220                         vdev_bdev_close(bdev, vdev_bdev_mode(mode));
221                 }
222
223                 bdev = bdget_disk(disk, partno);
224                 if (bdev) {
225                         error = blkdev_get(bdev,
226                             vdev_bdev_mode(mode) | FMODE_EXCL, vd);
227                         if (error == 0)
228                                 result = bdev;
229                 }
230                 put_disk(disk);
231         }
232
233         return result;
234 #else
235         return ERR_PTR(-EOPNOTSUPP);
236 #endif /* defined(HAVE_3ARG_BLKDEV_GET) && defined(HAVE_GET_GENDISK) */
237 }
238
239 static int
240 vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
241     uint64_t *ashift)
242 {
243         struct block_device *bdev = ERR_PTR(-ENXIO);
244         vdev_disk_t *vd;
245         int mode, block_size;
246
247         /* Must have a pathname and it must be absolute. */
248         if (v->vdev_path == NULL || v->vdev_path[0] != '/') {
249                 v->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
250                 return EINVAL;
251         }
252
253         /*
254          * Reopen the device if it's not currently open. Otherwise,
255          * just update the physical size of the device.
256          */
257         if (v->vdev_tsd != NULL) {
258                 ASSERT(v->vdev_reopening);
259                 vd = v->vdev_tsd;
260                 goto skip_open;
261         }
262
263         vd = kmem_zalloc(sizeof(vdev_disk_t), KM_PUSHPAGE);
264         if (vd == NULL)
265                 return ENOMEM;
266
267         /*
268          * Devices are always opened by the path provided at configuration
269          * time.  This means that if the provided path is a udev by-id path
270          * then drives may be recabled without an issue.  If the provided
271          * path is a udev by-path path, then the physical location information
272          * will be preserved.  This can be critical for more complicated
273          * configurations where drives are located in specific physical
274          * locations to maximize the systems tolerence to component failure.
275          * Alternatively, you can provide your own udev rule to flexibly map
276          * the drives as you see fit.  It is not advised that you use the
277          * /dev/[hd]d devices which may be reordered due to probing order.
278          * Devices in the wrong locations will be detected by the higher
279          * level vdev validation.
280          */
281         mode = spa_mode(v->vdev_spa);
282         if (v->vdev_wholedisk && v->vdev_expanding)
283                 bdev = vdev_disk_rrpart(v->vdev_path, mode, vd);
284         if (IS_ERR(bdev))
285                 bdev = vdev_bdev_open(v->vdev_path,
286                     vdev_bdev_mode(mode), zfs_vdev_holder);
287         if (IS_ERR(bdev)) {
288                 kmem_free(vd, sizeof(vdev_disk_t));
289                 return -PTR_ERR(bdev);
290         }
291
292         v->vdev_tsd = vd;
293         vd->vd_bdev = bdev;
294
295 skip_open:
296         /*  Determine the physical block size */
297         block_size = vdev_bdev_block_size(vd->vd_bdev);
298
299         /* Clear the nowritecache bit, causes vdev_reopen() to try again. */
300         v->vdev_nowritecache = B_FALSE;
301
302         /* Physical volume size in bytes */
303         *psize = bdev_capacity(vd->vd_bdev);
304
305         /* TODO: report possible expansion size */
306         *max_psize = *psize;
307
308         /* Based on the minimum sector size set the block size */
309         *ashift = highbit(MAX(block_size, SPA_MINBLOCKSIZE)) - 1;
310
311         /* Try to set the io scheduler elevator algorithm */
312         (void) vdev_elevator_switch(v, zfs_vdev_scheduler);
313
314         return 0;
315 }
316
317 static void
318 vdev_disk_close(vdev_t *v)
319 {
320         vdev_disk_t *vd = v->vdev_tsd;
321
322         if (v->vdev_reopening || vd == NULL)
323                 return;
324
325         if (vd->vd_bdev != NULL)
326                 vdev_bdev_close(vd->vd_bdev,
327                                 vdev_bdev_mode(spa_mode(v->vdev_spa)));
328
329         kmem_free(vd, sizeof(vdev_disk_t));
330         v->vdev_tsd = NULL;
331 }
332
333 static dio_request_t *
334 vdev_disk_dio_alloc(int bio_count)
335 {
336         dio_request_t *dr;
337         int i;
338
339         dr = kmem_zalloc(sizeof(dio_request_t) +
340                          sizeof(struct bio *) * bio_count, KM_PUSHPAGE);
341         if (dr) {
342                 init_completion(&dr->dr_comp);
343                 atomic_set(&dr->dr_ref, 0);
344                 dr->dr_bio_count = bio_count;
345                 dr->dr_error = 0;
346
347                 for (i = 0; i < dr->dr_bio_count; i++)
348                         dr->dr_bio[i] = NULL;
349         }
350
351         return dr;
352 }
353
354 static void
355 vdev_disk_dio_free(dio_request_t *dr)
356 {
357         int i;
358
359         for (i = 0; i < dr->dr_bio_count; i++)
360                 if (dr->dr_bio[i])
361                         bio_put(dr->dr_bio[i]);
362
363         kmem_free(dr, sizeof(dio_request_t) +
364                   sizeof(struct bio *) * dr->dr_bio_count);
365 }
366
367 static int
368 vdev_disk_dio_is_sync(dio_request_t *dr)
369 {
370 #ifdef HAVE_BIO_RW_SYNC
371         /* BIO_RW_SYNC preferred interface from 2.6.12-2.6.29 */
372         return (dr->dr_rw & (1 << BIO_RW_SYNC));
373 #else
374 # ifdef HAVE_BIO_RW_SYNCIO
375         /* BIO_RW_SYNCIO preferred interface from 2.6.30-2.6.35 */
376         return (dr->dr_rw & (1 << BIO_RW_SYNCIO));
377 # else
378 #  ifdef HAVE_REQ_SYNC
379         /* REQ_SYNC preferred interface from 2.6.36-2.6.xx */
380         return (dr->dr_rw & REQ_SYNC);
381 #  else
382 #   error "Unable to determine bio sync flag"
383 #  endif /* HAVE_REQ_SYNC */
384 # endif /* HAVE_BIO_RW_SYNC */
385 #endif /* HAVE_BIO_RW_SYNCIO */
386 }
387
388 static void
389 vdev_disk_dio_get(dio_request_t *dr)
390 {
391         atomic_inc(&dr->dr_ref);
392 }
393
394 static int
395 vdev_disk_dio_put(dio_request_t *dr)
396 {
397         int rc = atomic_dec_return(&dr->dr_ref);
398
399         /*
400          * Free the dio_request when the last reference is dropped and
401          * ensure zio_interpret is called only once with the correct zio
402          */
403         if (rc == 0) {
404                 zio_t *zio = dr->dr_zio;
405                 int error = dr->dr_error;
406
407                 vdev_disk_dio_free(dr);
408
409                 if (zio) {
410                         zio->io_delay = jiffies_to_msecs(
411                             jiffies_64 - zio->io_delay);
412                         zio->io_error = error;
413                         ASSERT3S(zio->io_error, >=, 0);
414                         if (zio->io_error)
415                                 vdev_disk_error(zio);
416                         zio_interrupt(zio);
417                 }
418         }
419
420         return rc;
421 }
422
423 BIO_END_IO_PROTO(vdev_disk_physio_completion, bio, size, error)
424 {
425         dio_request_t *dr = bio->bi_private;
426         int rc;
427
428         /* Fatal error but print some useful debugging before asserting */
429         if (dr == NULL)
430                 PANIC("dr == NULL, bio->bi_private == NULL\n"
431                     "bi_next: %p, bi_flags: %lx, bi_rw: %lu, bi_vcnt: %d\n"
432                     "bi_idx: %d, bi_size: %d, bi_end_io: %p, bi_cnt: %d\n",
433                     bio->bi_next, bio->bi_flags, bio->bi_rw, bio->bi_vcnt,
434                     bio->bi_idx, bio->bi_size, bio->bi_end_io,
435                     atomic_read(&bio->bi_cnt));
436
437 #ifndef HAVE_2ARGS_BIO_END_IO_T
438         if (bio->bi_size)
439                 return 1;
440 #endif /* HAVE_2ARGS_BIO_END_IO_T */
441
442         if (error == 0 && !test_bit(BIO_UPTODATE, &bio->bi_flags))
443                 error = -EIO;
444
445         if (dr->dr_error == 0)
446                 dr->dr_error = -error;
447
448         /* Drop reference aquired by __vdev_disk_physio */
449         rc = vdev_disk_dio_put(dr);
450
451         /* Wake up synchronous waiter this is the last outstanding bio */
452         if ((rc == 1) && vdev_disk_dio_is_sync(dr))
453                 complete(&dr->dr_comp);
454
455         BIO_END_IO_RETURN(0);
456 }
457
458 static inline unsigned long
459 bio_nr_pages(void *bio_ptr, unsigned int bio_size)
460 {
461         return ((((unsigned long)bio_ptr + bio_size + PAGE_SIZE - 1) >>
462                 PAGE_SHIFT) - ((unsigned long)bio_ptr >> PAGE_SHIFT));
463 }
464
465 static unsigned int
466 bio_map(struct bio *bio, void *bio_ptr, unsigned int bio_size)
467 {
468         unsigned int offset, size, i;
469         struct page *page;
470
471         offset = offset_in_page(bio_ptr);
472         for (i = 0; i < bio->bi_max_vecs; i++) {
473                 size = PAGE_SIZE - offset;
474
475                 if (bio_size <= 0)
476                         break;
477
478                 if (size > bio_size)
479                         size = bio_size;
480
481                 if (kmem_virt(bio_ptr))
482                         page = vmalloc_to_page(bio_ptr);
483                 else
484                         page = virt_to_page(bio_ptr);
485
486                 if (bio_add_page(bio, page, size, offset) != size)
487                         break;
488
489                 bio_ptr  += size;
490                 bio_size -= size;
491                 offset = 0;
492         }
493
494         return bio_size;
495 }
496
497 static int
498 __vdev_disk_physio(struct block_device *bdev, zio_t *zio, caddr_t kbuf_ptr,
499                    size_t kbuf_size, uint64_t kbuf_offset, int flags)
500 {
501         dio_request_t *dr;
502         caddr_t bio_ptr;
503         uint64_t bio_offset;
504         int bio_size, bio_count = 16;
505         int i = 0, error = 0;
506
507         ASSERT3U(kbuf_offset + kbuf_size, <=, bdev->bd_inode->i_size);
508
509 retry:
510         dr = vdev_disk_dio_alloc(bio_count);
511         if (dr == NULL)
512                 return ENOMEM;
513
514         if (zio && !(zio->io_flags & (ZIO_FLAG_IO_RETRY | ZIO_FLAG_TRYHARD)))
515                         bio_set_flags_failfast(bdev, &flags);
516
517         dr->dr_zio = zio;
518         dr->dr_rw = flags;
519
520         /*
521          * When the IO size exceeds the maximum bio size for the request
522          * queue we are forced to break the IO in multiple bio's and wait
523          * for them all to complete.  Ideally, all pool users will set
524          * their volume block size to match the maximum request size and
525          * the common case will be one bio per vdev IO request.
526          */
527         bio_ptr    = kbuf_ptr;
528         bio_offset = kbuf_offset;
529         bio_size   = kbuf_size;
530         for (i = 0; i <= dr->dr_bio_count; i++) {
531
532                 /* Finished constructing bio's for given buffer */
533                 if (bio_size <= 0)
534                         break;
535
536                 /*
537                  * By default only 'bio_count' bio's per dio are allowed.
538                  * However, if we find ourselves in a situation where more
539                  * are needed we allocate a larger dio and warn the user.
540                  */
541                 if (dr->dr_bio_count == i) {
542                         vdev_disk_dio_free(dr);
543                         bio_count *= 2;
544                         goto retry;
545                 }
546
547                 dr->dr_bio[i] = bio_alloc(GFP_NOIO,
548                                           bio_nr_pages(bio_ptr, bio_size));
549                 if (dr->dr_bio[i] == NULL) {
550                         vdev_disk_dio_free(dr);
551                         return ENOMEM;
552                 }
553
554                 /* Matching put called by vdev_disk_physio_completion */
555                 vdev_disk_dio_get(dr);
556
557                 dr->dr_bio[i]->bi_bdev = bdev;
558                 dr->dr_bio[i]->bi_sector = bio_offset >> 9;
559                 dr->dr_bio[i]->bi_rw = dr->dr_rw;
560                 dr->dr_bio[i]->bi_end_io = vdev_disk_physio_completion;
561                 dr->dr_bio[i]->bi_private = dr;
562
563                 /* Remaining size is returned to become the new size */
564                 bio_size = bio_map(dr->dr_bio[i], bio_ptr, bio_size);
565
566                 /* Advance in buffer and construct another bio if needed */
567                 bio_ptr    += dr->dr_bio[i]->bi_size;
568                 bio_offset += dr->dr_bio[i]->bi_size;
569         }
570
571         /* Extra reference to protect dio_request during submit_bio */
572         vdev_disk_dio_get(dr);
573         if (zio)
574                 zio->io_delay = jiffies_64;
575
576         /* Submit all bio's associated with this dio */
577         for (i = 0; i < dr->dr_bio_count; i++)
578                 if (dr->dr_bio[i])
579                         submit_bio(dr->dr_rw, dr->dr_bio[i]);
580
581         /*
582          * On synchronous blocking requests we wait for all bio the completion
583          * callbacks to run.  We will be woken when the last callback runs
584          * for this dio.  We are responsible for putting the last dio_request
585          * reference will in turn put back the last bio references.  The
586          * only synchronous consumer is vdev_disk_read_rootlabel() all other
587          * IO originating from vdev_disk_io_start() is asynchronous.
588          */
589         if (vdev_disk_dio_is_sync(dr)) {
590                 wait_for_completion(&dr->dr_comp);
591                 error = dr->dr_error;
592                 ASSERT3S(atomic_read(&dr->dr_ref), ==, 1);
593         }
594
595         (void)vdev_disk_dio_put(dr);
596
597         return error;
598 }
599
600 int
601 vdev_disk_physio(struct block_device *bdev, caddr_t kbuf,
602                  size_t size, uint64_t offset, int flags)
603 {
604         bio_set_flags_failfast(bdev, &flags);
605         return __vdev_disk_physio(bdev, NULL, kbuf, size, offset, flags);
606 }
607
608 BIO_END_IO_PROTO(vdev_disk_io_flush_completion, bio, size, rc)
609 {
610         zio_t *zio = bio->bi_private;
611
612         zio->io_delay = jiffies_to_msecs(jiffies_64 - zio->io_delay);
613         zio->io_error = -rc;
614         if (rc && (rc == -EOPNOTSUPP))
615                 zio->io_vd->vdev_nowritecache = B_TRUE;
616
617         bio_put(bio);
618         ASSERT3S(zio->io_error, >=, 0);
619         if (zio->io_error)
620                 vdev_disk_error(zio);
621         zio_interrupt(zio);
622
623         BIO_END_IO_RETURN(0);
624 }
625
626 static int
627 vdev_disk_io_flush(struct block_device *bdev, zio_t *zio)
628 {
629         struct request_queue *q;
630         struct bio *bio;
631
632         q = bdev_get_queue(bdev);
633         if (!q)
634                 return ENXIO;
635
636         bio = bio_alloc(GFP_KERNEL, 0);
637         if (!bio)
638                 return ENOMEM;
639
640         bio->bi_end_io = vdev_disk_io_flush_completion;
641         bio->bi_private = zio;
642         bio->bi_bdev = bdev;
643         zio->io_delay = jiffies_64;
644         submit_bio(VDEV_WRITE_FLUSH_FUA, bio);
645
646         return 0;
647 }
648
649 static int
650 vdev_disk_io_start(zio_t *zio)
651 {
652         vdev_t *v = zio->io_vd;
653         vdev_disk_t *vd = v->vdev_tsd;
654         int flags, error;
655
656         switch (zio->io_type) {
657         case ZIO_TYPE_IOCTL:
658
659                 if (!vdev_readable(v)) {
660                         zio->io_error = ENXIO;
661                         return ZIO_PIPELINE_CONTINUE;
662                 }
663
664                 switch (zio->io_cmd) {
665                 case DKIOCFLUSHWRITECACHE:
666
667                         if (zfs_nocacheflush)
668                                 break;
669
670                         if (v->vdev_nowritecache) {
671                                 zio->io_error = ENOTSUP;
672                                 break;
673                         }
674
675                         error = vdev_disk_io_flush(vd->vd_bdev, zio);
676                         if (error == 0)
677                                 return ZIO_PIPELINE_STOP;
678
679                         zio->io_error = error;
680                         if (error == ENOTSUP)
681                                 v->vdev_nowritecache = B_TRUE;
682
683                         break;
684
685                 default:
686                         zio->io_error = ENOTSUP;
687                 }
688
689                 return ZIO_PIPELINE_CONTINUE;
690
691         case ZIO_TYPE_WRITE:
692                 flags = WRITE;
693                 break;
694
695         case ZIO_TYPE_READ:
696                 flags = READ;
697                 break;
698
699         default:
700                 zio->io_error = ENOTSUP;
701                 return ZIO_PIPELINE_CONTINUE;
702         }
703
704         error = __vdev_disk_physio(vd->vd_bdev, zio, zio->io_data,
705                                    zio->io_size, zio->io_offset, flags);
706         if (error) {
707                 zio->io_error = error;
708                 return ZIO_PIPELINE_CONTINUE;
709         }
710
711         return ZIO_PIPELINE_STOP;
712 }
713
714 static void
715 vdev_disk_io_done(zio_t *zio)
716 {
717         /*
718          * If the device returned EIO, we revalidate the media.  If it is
719          * determined the media has changed this triggers the asynchronous
720          * removal of the device from the configuration.
721          */
722         if (zio->io_error == EIO) {
723                 vdev_t *v = zio->io_vd;
724                 vdev_disk_t *vd = v->vdev_tsd;
725
726                 if (check_disk_change(vd->vd_bdev)) {
727                         vdev_bdev_invalidate(vd->vd_bdev);
728                         v->vdev_remove_wanted = B_TRUE;
729                         spa_async_request(zio->io_spa, SPA_ASYNC_REMOVE);
730                 }
731         }
732 }
733
734 static void
735 vdev_disk_hold(vdev_t *vd)
736 {
737         ASSERT(spa_config_held(vd->vdev_spa, SCL_STATE, RW_WRITER));
738
739         /* We must have a pathname, and it must be absolute. */
740         if (vd->vdev_path == NULL || vd->vdev_path[0] != '/')
741                 return;
742
743         /*
744          * Only prefetch path and devid info if the device has
745          * never been opened.
746          */
747         if (vd->vdev_tsd != NULL)
748                 return;
749
750         /* XXX: Implement me as a vnode lookup for the device */
751         vd->vdev_name_vp = NULL;
752         vd->vdev_devid_vp = NULL;
753 }
754
755 static void
756 vdev_disk_rele(vdev_t *vd)
757 {
758         ASSERT(spa_config_held(vd->vdev_spa, SCL_STATE, RW_WRITER));
759
760         /* XXX: Implement me as a vnode rele for the device */
761 }
762
763 vdev_ops_t vdev_disk_ops = {
764         vdev_disk_open,
765         vdev_disk_close,
766         vdev_default_asize,
767         vdev_disk_io_start,
768         vdev_disk_io_done,
769         NULL,
770         vdev_disk_hold,
771         vdev_disk_rele,
772         VDEV_TYPE_DISK,         /* name of this vdev type */
773         B_TRUE                  /* leaf vdev */
774 };
775
776 /*
777  * Given the root disk device devid or pathname, read the label from
778  * the device, and construct a configuration nvlist.
779  */
780 int
781 vdev_disk_read_rootlabel(char *devpath, char *devid, nvlist_t **config)
782 {
783         struct block_device *bdev;
784         vdev_label_t *label;
785         uint64_t s, size;
786         int i;
787
788         bdev = vdev_bdev_open(devpath, vdev_bdev_mode(FREAD), zfs_vdev_holder);
789         if (IS_ERR(bdev))
790                 return -PTR_ERR(bdev);
791
792         s = bdev_capacity(bdev);
793         if (s == 0) {
794                 vdev_bdev_close(bdev, vdev_bdev_mode(FREAD));
795                 return EIO;
796         }
797
798         size = P2ALIGN_TYPED(s, sizeof(vdev_label_t), uint64_t);
799         label = vmem_alloc(sizeof(vdev_label_t), KM_PUSHPAGE);
800
801         for (i = 0; i < VDEV_LABELS; i++) {
802                 uint64_t offset, state, txg = 0;
803
804                 /* read vdev label */
805                 offset = vdev_label_offset(size, i, 0);
806                 if (vdev_disk_physio(bdev, (caddr_t)label,
807                     VDEV_SKIP_SIZE + VDEV_PHYS_SIZE, offset, READ_SYNC) != 0)
808                         continue;
809
810                 if (nvlist_unpack(label->vl_vdev_phys.vp_nvlist,
811                     sizeof (label->vl_vdev_phys.vp_nvlist), config, 0) != 0) {
812                         *config = NULL;
813                         continue;
814                 }
815
816                 if (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_POOL_STATE,
817                     &state) != 0 || state >= POOL_STATE_DESTROYED) {
818                         nvlist_free(*config);
819                         *config = NULL;
820                         continue;
821                 }
822
823                 if (nvlist_lookup_uint64(*config, ZPOOL_CONFIG_POOL_TXG,
824                     &txg) != 0 || txg == 0) {
825                         nvlist_free(*config);
826                         *config = NULL;
827                         continue;
828                 }
829
830                 break;
831         }
832
833         vmem_free(label, sizeof(vdev_label_t));
834         vdev_bdev_close(bdev, vdev_bdev_mode(FREAD));
835
836         return 0;
837 }
838
839 module_param(zfs_vdev_scheduler, charp, 0644);
840 MODULE_PARM_DESC(zfs_vdev_scheduler, "I/O scheduler");