2005-04-16 22:20:36 +00:00
|
|
|
/*
|
|
|
|
md.h : Multiple Devices driver for Linux
|
|
|
|
Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman
|
|
|
|
Copyright (C) 1994-96 Marc ZYNGIER
|
|
|
|
<zyngier@ufr-info-p7.ibp.fr> or
|
|
|
|
<maz@gloups.fdn.fr>
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
|
|
any later version.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
(for example /usr/src/linux/COPYING); if not, write to the Free
|
|
|
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _MD_H
|
|
|
|
#define _MD_H
|
|
|
|
|
|
|
|
#include <linux/blkdev.h>
|
|
|
|
#include <asm/semaphore.h>
|
|
|
|
#include <linux/major.h>
|
|
|
|
#include <linux/ioctl.h>
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include <linux/bitops.h>
|
|
|
|
#include <linux/module.h>
|
|
|
|
#include <linux/hdreg.h>
|
|
|
|
#include <linux/proc_fs.h>
|
|
|
|
#include <linux/seq_file.h>
|
|
|
|
#include <linux/smp_lock.h>
|
|
|
|
#include <linux/delay.h>
|
|
|
|
#include <net/checksum.h>
|
|
|
|
#include <linux/random.h>
|
|
|
|
#include <linux/kernel_stat.h>
|
|
|
|
#include <asm/io.h>
|
|
|
|
#include <linux/completion.h>
|
|
|
|
#include <linux/mempool.h>
|
|
|
|
#include <linux/list.h>
|
|
|
|
#include <linux/reboot.h>
|
|
|
|
#include <linux/vmalloc.h>
|
|
|
|
#include <linux/blkpg.h>
|
|
|
|
#include <linux/bio.h>
|
|
|
|
|
|
|
|
/*
|
|
|
|
* 'md_p.h' holds the 'physical' layout of RAID devices
|
|
|
|
* 'md_u.h' holds the user <=> kernel API
|
|
|
|
*
|
|
|
|
* 'md_k.h' holds kernel internal definitions
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/raid/md_p.h>
|
|
|
|
#include <linux/raid/md_u.h>
|
|
|
|
#include <linux/raid/md_k.h>
|
|
|
|
|
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 18:45:40 +00:00
|
|
|
#ifdef CONFIG_MD
|
|
|
|
|
2005-04-16 22:20:36 +00:00
|
|
|
/*
|
|
|
|
* Different major versions are not compatible.
|
|
|
|
* Different minor versions are only downward compatible.
|
|
|
|
* Different patchlevel versions are downward and upward compatible.
|
|
|
|
*/
|
|
|
|
#define MD_MAJOR_VERSION 0
|
|
|
|
#define MD_MINOR_VERSION 90
|
2005-06-22 00:17:27 +00:00
|
|
|
/*
|
|
|
|
* MD_PATCHLEVEL_VERSION indicates kernel functionality.
|
|
|
|
* >=1 means different superblock formats are selectable using SET_ARRAY_INFO
|
|
|
|
* and major_version/minor_version accordingly
|
|
|
|
* >=2 means that Internal bitmaps are supported by setting MD_SB_BITMAP_PRESENT
|
|
|
|
* in the super status byte
|
2005-11-09 05:39:32 +00:00
|
|
|
* >=3 means that bitmap superblock version 4 is supported, which uses
|
|
|
|
* little-ending representation rather than host-endian
|
2005-06-22 00:17:27 +00:00
|
|
|
*/
|
2005-11-09 05:39:32 +00:00
|
|
|
#define MD_PATCHLEVEL_VERSION 3
|
2005-04-16 22:20:36 +00:00
|
|
|
|
2006-01-06 08:20:36 +00:00
|
|
|
extern int register_md_personality (struct mdk_personality *p);
|
|
|
|
extern int unregister_md_personality (struct mdk_personality *p);
|
2005-04-16 22:20:36 +00:00
|
|
|
extern mdk_thread_t * md_register_thread (void (*run) (mddev_t *mddev),
|
|
|
|
mddev_t *mddev, const char *name);
|
|
|
|
extern void md_unregister_thread (mdk_thread_t *thread);
|
|
|
|
extern void md_wakeup_thread(mdk_thread_t *thread);
|
|
|
|
extern void md_check_recovery(mddev_t *mddev);
|
2005-06-22 00:17:26 +00:00
|
|
|
extern void md_write_start(mddev_t *mddev, struct bio *bi);
|
2005-04-16 22:20:36 +00:00
|
|
|
extern void md_write_end(mddev_t *mddev);
|
|
|
|
extern void md_handle_safemode(mddev_t *mddev);
|
|
|
|
extern void md_done_sync(mddev_t *mddev, int blocks, int ok);
|
|
|
|
extern void md_error (mddev_t *mddev, mdk_rdev_t *rdev);
|
|
|
|
extern void md_unplug_mddev(mddev_t *mddev);
|
|
|
|
|
2005-06-22 00:17:27 +00:00
|
|
|
extern void md_super_write(mddev_t *mddev, mdk_rdev_t *rdev,
|
|
|
|
sector_t sector, int size, struct page *page);
|
[PATCH] md: support BIO_RW_BARRIER for md/raid1
We can only accept BARRIER requests if all slaves handle
barriers, and that can, of course, change with time....
So we keep track of whether the whole array seems safe for barriers,
and also whether each individual rdev handles barriers.
We initially assumes barriers are OK.
When writing the superblock we try a barrier, and if that fails, we flag
things for no-barriers. This will usually clear the flags fairly quickly.
If writing the superblock finds that BIO_RW_BARRIER is -ENOTSUPP, we need to
resubmit, so introduce function "md_super_wait" which waits for requests to
finish, and retries ENOTSUPP requests without the barrier flag.
When writing the real raid1, write requests which were BIO_RW_BARRIER but
which aresn't supported need to be retried. So raid1d is enhanced to do this,
and when any bio write completes (i.e. no retry needed) we remove it from the
r1bio, so that devices needing retry are easy to find.
We should hardly ever get -ENOTSUPP errors when writing data to the raid.
It should only happen if:
1/ the device used to support BARRIER, but now doesn't. Few devices
change like this, though raid1 can!
or
2/ the array has no persistent superblock, so there was no opportunity to
pre-test for barriers when writing the superblock.
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-11-09 05:39:34 +00:00
|
|
|
extern void md_super_wait(mddev_t *mddev);
|
2005-06-22 00:17:27 +00:00
|
|
|
extern int sync_page_io(struct block_device *bdev, sector_t sector, int size,
|
|
|
|
struct page *page, int rw);
|
2006-03-27 09:18:10 +00:00
|
|
|
extern void md_do_sync(mddev_t *mddev);
|
|
|
|
extern void md_new_event(mddev_t *mddev);
|
2007-01-26 08:57:11 +00:00
|
|
|
extern void md_allow_write(mddev_t *mddev);
|
2006-03-27 09:18:11 +00:00
|
|
|
|
[PATCH] BLOCK: Make it possible to disable the block layer [try #6]
Make it possible to disable the block layer. Not all embedded devices require
it, some can make do with just JFFS2, NFS, ramfs, etc - none of which require
the block layer to be present.
This patch does the following:
(*) Introduces CONFIG_BLOCK to disable the block layer, buffering and blockdev
support.
(*) Adds dependencies on CONFIG_BLOCK to any configuration item that controls
an item that uses the block layer. This includes:
(*) Block I/O tracing.
(*) Disk partition code.
(*) All filesystems that are block based, eg: Ext3, ReiserFS, ISOFS.
(*) The SCSI layer. As far as I can tell, even SCSI chardevs use the
block layer to do scheduling. Some drivers that use SCSI facilities -
such as USB storage - end up disabled indirectly from this.
(*) Various block-based device drivers, such as IDE and the old CDROM
drivers.
(*) MTD blockdev handling and FTL.
(*) JFFS - which uses set_bdev_super(), something it could avoid doing by
taking a leaf out of JFFS2's book.
(*) Makes most of the contents of linux/blkdev.h, linux/buffer_head.h and
linux/elevator.h contingent on CONFIG_BLOCK being set. sector_div() is,
however, still used in places, and so is still available.
(*) Also made contingent are the contents of linux/mpage.h, linux/genhd.h and
parts of linux/fs.h.
(*) Makes a number of files in fs/ contingent on CONFIG_BLOCK.
(*) Makes mm/bounce.c (bounce buffering) contingent on CONFIG_BLOCK.
(*) set_page_dirty() doesn't call __set_page_dirty_buffers() if CONFIG_BLOCK
is not enabled.
(*) fs/no-block.c is created to hold out-of-line stubs and things that are
required when CONFIG_BLOCK is not set:
(*) Default blockdev file operations (to give error ENODEV on opening).
(*) Makes some /proc changes:
(*) /proc/devices does not list any blockdevs.
(*) /proc/diskstats and /proc/partitions are contingent on CONFIG_BLOCK.
(*) Makes some compat ioctl handling contingent on CONFIG_BLOCK.
(*) If CONFIG_BLOCK is not defined, makes sys_quotactl() return -ENODEV if
given command other than Q_SYNC or if a special device is specified.
(*) In init/do_mounts.c, no reference is made to the blockdev routines if
CONFIG_BLOCK is not defined. This does not prohibit NFS roots or JFFS2.
(*) The bdflush, ioprio_set and ioprio_get syscalls can now be absent (return
error ENOSYS by way of cond_syscall if so).
(*) The seclvl_bd_claim() and seclvl_bd_release() security calls do nothing if
CONFIG_BLOCK is not set, since they can't then happen.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2006-09-30 18:45:40 +00:00
|
|
|
#endif /* CONFIG_MD */
|
2005-04-16 22:20:36 +00:00
|
|
|
#endif
|
|
|
|
|