zfs/module/zfs/include/sys/vdev_disk.h

98 lines
2.9 KiB
C
Raw Normal View History

/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (C) 2008-2010 Lawrence Livermore National Security, LLC.
* Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER).
* Written by Brian Behlendorf <behlendorf1@llnl.gov>.
* LLNL-CODE-403049.
*/
2008-12-05 19:16:18 +00:00
#ifndef _SYS_VDEV_DISK_H
#define _SYS_VDEV_DISK_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _KERNEL
#include <sys/vdev.h>
#include <sys/ddi.h>
#include <sys/sunldi.h>
#include <sys/sunddi.h>
typedef struct vdev_disk {
Major vdev_disk feature and API (thru 2.6.30) update. Tested under CHAOS4.2, RHEL5, SLES11, and FC11 (all x86_64) Features: Honor spa_mode() when opening the block device. Previously this was ignored and devices were always opened read/write. Integrated DKIOCFLUSHWRITECACHE zio operation with linux WRITE_BARRIER for kernels post 2.6.24 where empty bio requests are supported. For earlier kernels ENOTSUP is returned and no barriers are performed. If RHEL5 based kernels are intended to be supported long term we may need make use of the old akward API. With the addition of WRITE_BARRIER support all writes which were WRITE_SYNC can now be safely made WRITE bios. They will now take advantage of aggregation in the elevator and improved write performance is likely. Notice the ZIO_FLAG_SPECULATIVE flag and pass along the hint to the elevator by using READA instead of READ. This provides the elevator the ability to prioritize the real READs ahead of the speculative IO if needed. Implement an initial version of vdev_disk_io_done() which in the case of an EIO error triggers a media change check. If it determines a media change has occured we fail the device and remove it from the config. This logic I'm sure can be improved further but for now it is an improvement over the VERIFY() that no error will ever happen. APIs: 2.6.22 API change Unused destroy_dirty_buffers arg removed from prototype. 2.6.24 API change Empty write barriers are now supported and we should use them. 2.6.24 API change Size argument dropped from bio_endio and bi_end_io, because the bi_end_io is only called once now when the request is complete. There is no longer any need for a size argument. This also means that partial IO's are no longer possibe and the end_io callback should not check bi->bi_size. Finally, the return type was updated to void. 2.6.28 API change open/close_bdev_excl() renamed to open/close_bdev_exclusive(). 2.6.29 API change BIO_RW_SYNC renamed to BIO_RW_SYNCIO.
2009-07-30 00:24:08 +00:00
ddi_devid_t vd_devid;
char *vd_minor;
struct block_device *vd_bdev;
2008-12-05 19:16:18 +00:00
} vdev_disk_t;
Major vdev_disk feature and API (thru 2.6.30) update. Tested under CHAOS4.2, RHEL5, SLES11, and FC11 (all x86_64) Features: Honor spa_mode() when opening the block device. Previously this was ignored and devices were always opened read/write. Integrated DKIOCFLUSHWRITECACHE zio operation with linux WRITE_BARRIER for kernels post 2.6.24 where empty bio requests are supported. For earlier kernels ENOTSUP is returned and no barriers are performed. If RHEL5 based kernels are intended to be supported long term we may need make use of the old akward API. With the addition of WRITE_BARRIER support all writes which were WRITE_SYNC can now be safely made WRITE bios. They will now take advantage of aggregation in the elevator and improved write performance is likely. Notice the ZIO_FLAG_SPECULATIVE flag and pass along the hint to the elevator by using READA instead of READ. This provides the elevator the ability to prioritize the real READs ahead of the speculative IO if needed. Implement an initial version of vdev_disk_io_done() which in the case of an EIO error triggers a media change check. If it determines a media change has occured we fail the device and remove it from the config. This logic I'm sure can be improved further but for now it is an improvement over the VERIFY() that no error will ever happen. APIs: 2.6.22 API change Unused destroy_dirty_buffers arg removed from prototype. 2.6.24 API change Empty write barriers are now supported and we should use them. 2.6.24 API change Size argument dropped from bio_endio and bi_end_io, because the bi_end_io is only called once now when the request is complete. There is no longer any need for a size argument. This also means that partial IO's are no longer possibe and the end_io callback should not check bi->bi_size. Finally, the return type was updated to void. 2.6.28 API change open/close_bdev_excl() renamed to open/close_bdev_exclusive(). 2.6.29 API change BIO_RW_SYNC renamed to BIO_RW_SYNCIO.
2009-07-30 00:24:08 +00:00
extern int vdev_disk_physio(struct block_device *, caddr_t,
size_t, uint64_t, int);
2009-01-06 16:39:45 +00:00
extern int vdev_disk_read_rootlabel(char *, char *, nvlist_t **);
Major vdev_disk feature and API (thru 2.6.30) update. Tested under CHAOS4.2, RHEL5, SLES11, and FC11 (all x86_64) Features: Honor spa_mode() when opening the block device. Previously this was ignored and devices were always opened read/write. Integrated DKIOCFLUSHWRITECACHE zio operation with linux WRITE_BARRIER for kernels post 2.6.24 where empty bio requests are supported. For earlier kernels ENOTSUP is returned and no barriers are performed. If RHEL5 based kernels are intended to be supported long term we may need make use of the old akward API. With the addition of WRITE_BARRIER support all writes which were WRITE_SYNC can now be safely made WRITE bios. They will now take advantage of aggregation in the elevator and improved write performance is likely. Notice the ZIO_FLAG_SPECULATIVE flag and pass along the hint to the elevator by using READA instead of READ. This provides the elevator the ability to prioritize the real READs ahead of the speculative IO if needed. Implement an initial version of vdev_disk_io_done() which in the case of an EIO error triggers a media change check. If it determines a media change has occured we fail the device and remove it from the config. This logic I'm sure can be improved further but for now it is an improvement over the VERIFY() that no error will ever happen. APIs: 2.6.22 API change Unused destroy_dirty_buffers arg removed from prototype. 2.6.24 API change Empty write barriers are now supported and we should use them. 2.6.24 API change Size argument dropped from bio_endio and bi_end_io, because the bi_end_io is only called once now when the request is complete. There is no longer any need for a size argument. This also means that partial IO's are no longer possibe and the end_io callback should not check bi->bi_size. Finally, the return type was updated to void. 2.6.28 API change open/close_bdev_excl() renamed to open/close_bdev_exclusive(). 2.6.29 API change BIO_RW_SYNC renamed to BIO_RW_SYNCIO.
2009-07-30 00:24:08 +00:00
/* 2.6.24 API change */
#ifdef HAVE_2ARGS_BIO_END_IO_T
# define BIO_END_IO_PROTO(fn, x, y, z) static void fn(struct bio *x, int z)
# define BIO_END_IO_RETURN(rc) return
#else
# define BIO_END_IO_PROTO(fn, x, y, z) static int fn(struct bio *x, \
unsigned int y, int z)
# define BIO_END_IO_RETURN(rc) return rc
#endif /* HAVE_2ARGS_BIO_END_IO_T */
/* 2.6.29 API change */
#ifdef HAVE_BIO_RW_SYNCIO
# define DIO_RW_SYNCIO BIO_RW_SYNCIO
#else
# define DIO_RW_SYNCIO BIO_RW_SYNC
#endif /* HAVE_BIO_RW_SYNCIO */
/* 2.6.28 API change */
#ifdef HAVE_OPEN_BDEV_EXCLUSIVE
# define vdev_bdev_open(path, md, hld) open_bdev_exclusive(path, md, hld)
# define vdev_bdev_close(bdev, md) close_bdev_exclusive(bdev, md)
#else
# define vdev_bdev_open(path, md, hld) open_bdev_excl(path, md, hld)
# define vdev_bdev_close(bdev, md) close_bdev_excl(bdev)
#endif /* HAVE_OPEN_BDEV_EXCLUSIVE */
/* 2.6.22 API change */
#ifdef HAVE_1ARG_INVALIDATE_BDEV
# define vdev_bdev_invalidate(bdev) invalidate_bdev(bdev)
#else
# define vdev_bdev_invalidate(bdev) invalidate_bdev(bdev, 1)
#endif /* HAVE_1ARG_INVALIDATE_BDEV */
/* 2.6.30 API change */
#ifdef HAVE_BDEV_LOGICAL_BLOCK_SIZE
# define vdev_bdev_block_size(bdev) bdev_logical_block_size(bdev)
#else
# define vdev_bdev_block_size(bdev) bdev_hardsect_size(bdev)
#endif
2009-01-06 16:39:45 +00:00
#endif /* _KERNEL */
2008-12-05 19:16:18 +00:00
#ifdef __cplusplus
}
#endif
#endif /* _SYS_VDEV_DISK_H */