Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.17-rc1 357 lines 11 kB view raw
1/* 2 md_k.h : kernel internal structure of the Linux MD driver 3 Copyright (C) 1996-98 Ingo Molnar, Gadi Oxman 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 2, or (at your option) 8 any later version. 9 10 You should have received a copy of the GNU General Public License 11 (for example /usr/src/linux/COPYING); if not, write to the Free 12 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 13*/ 14 15#ifndef _MD_K_H 16#define _MD_K_H 17 18/* and dm-bio-list.h is not under include/linux because.... ??? */ 19#include "../../../drivers/md/dm-bio-list.h" 20 21#define LEVEL_MULTIPATH (-4) 22#define LEVEL_LINEAR (-1) 23#define LEVEL_FAULTY (-5) 24 25/* we need a value for 'no level specified' and 0 26 * means 'raid0', so we need something else. This is 27 * for internal use only 28 */ 29#define LEVEL_NONE (-1000000) 30 31#define MaxSector (~(sector_t)0) 32#define MD_THREAD_NAME_MAX 14 33 34typedef struct mddev_s mddev_t; 35typedef struct mdk_rdev_s mdk_rdev_t; 36 37#define MAX_MD_DEVS 256 /* Max number of md dev */ 38 39/* 40 * options passed in raidrun: 41 */ 42 43#define MAX_CHUNK_SIZE (4096*1024) 44 45/* 46 * MD's 'extended' device 47 */ 48struct mdk_rdev_s 49{ 50 struct list_head same_set; /* RAID devices within the same set */ 51 52 sector_t size; /* Device size (in blocks) */ 53 mddev_t *mddev; /* RAID array if running */ 54 unsigned long last_events; /* IO event timestamp */ 55 56 struct block_device *bdev; /* block device handle */ 57 58 struct page *sb_page; 59 int sb_loaded; 60 sector_t data_offset; /* start of data in array */ 61 sector_t sb_offset; 62 int sb_size; /* bytes in the superblock */ 63 int preferred_minor; /* autorun support */ 64 65 struct kobject kobj; 66 67 /* A device can be in one of three states based on two flags: 68 * Not working: faulty==1 in_sync==0 69 * Fully working: faulty==0 in_sync==1 70 * Working, but not 71 * in sync with array 72 * faulty==0 in_sync==0 73 * 74 * It can never have faulty==1, in_sync==1 75 * This reduces the burden of testing multiple flags in many cases 76 */ 77 78 unsigned long flags; 79#define Faulty 1 /* device is known to have a fault */ 80#define In_sync 2 /* device is in_sync with rest of array */ 81#define WriteMostly 4 /* Avoid reading if at all possible */ 82#define BarriersNotsupp 5 /* BIO_RW_BARRIER is not supported */ 83 84 int desc_nr; /* descriptor index in the superblock */ 85 int raid_disk; /* role of device in array */ 86 int saved_raid_disk; /* role that device used to have in the 87 * array and could again if we did a partial 88 * resync from the bitmap 89 */ 90 91 atomic_t nr_pending; /* number of pending requests. 92 * only maintained for arrays that 93 * support hot removal 94 */ 95 atomic_t read_errors; /* number of consecutive read errors that 96 * we have tried to ignore. 97 */ 98 atomic_t corrected_errors; /* number of corrected read errors, 99 * for reporting to userspace and storing 100 * in superblock. 101 */ 102}; 103 104struct mddev_s 105{ 106 void *private; 107 struct mdk_personality *pers; 108 dev_t unit; 109 int md_minor; 110 struct list_head disks; 111 int sb_dirty; 112 int ro; 113 114 struct gendisk *gendisk; 115 116 struct kobject kobj; 117 118 /* Superblock information */ 119 int major_version, 120 minor_version, 121 patch_version; 122 int persistent; 123 int chunk_size; 124 time_t ctime, utime; 125 int level, layout; 126 char clevel[16]; 127 int raid_disks; 128 int max_disks; 129 sector_t size; /* used size of component devices */ 130 sector_t array_size; /* exported array size */ 131 __u64 events; 132 133 char uuid[16]; 134 135 /* If the array is being reshaped, we need to record the 136 * new shape and an indication of where we are up to. 137 * This is written to the superblock. 138 * If reshape_position is MaxSector, then no reshape is happening (yet). 139 */ 140 sector_t reshape_position; 141 int delta_disks, new_level, new_layout, new_chunk; 142 143 struct mdk_thread_s *thread; /* management thread */ 144 struct mdk_thread_s *sync_thread; /* doing resync or reconstruct */ 145 sector_t curr_resync; /* blocks scheduled */ 146 unsigned long resync_mark; /* a recent timestamp */ 147 sector_t resync_mark_cnt;/* blocks written at resync_mark */ 148 149 sector_t resync_max_sectors; /* may be set by personality */ 150 151 sector_t resync_mismatches; /* count of sectors where 152 * parity/replica mismatch found 153 */ 154 155 /* allow user-space to request suspension of IO to regions of the array */ 156 sector_t suspend_lo; 157 sector_t suspend_hi; 158 /* if zero, use the system-wide default */ 159 int sync_speed_min; 160 int sync_speed_max; 161 162 int ok_start_degraded; 163 /* recovery/resync flags 164 * NEEDED: we might need to start a resync/recover 165 * RUNNING: a thread is running, or about to be started 166 * SYNC: actually doing a resync, not a recovery 167 * ERR: and IO error was detected - abort the resync/recovery 168 * INTR: someone requested a (clean) early abort. 169 * DONE: thread is done and is waiting to be reaped 170 * REQUEST: user-space has requested a sync (used with SYNC) 171 * CHECK: user-space request for for check-only, no repair 172 * RESHAPE: A reshape is happening 173 * 174 * If neither SYNC or RESHAPE are set, then it is a recovery. 175 */ 176#define MD_RECOVERY_RUNNING 0 177#define MD_RECOVERY_SYNC 1 178#define MD_RECOVERY_ERR 2 179#define MD_RECOVERY_INTR 3 180#define MD_RECOVERY_DONE 4 181#define MD_RECOVERY_NEEDED 5 182#define MD_RECOVERY_REQUESTED 6 183#define MD_RECOVERY_CHECK 7 184#define MD_RECOVERY_RESHAPE 8 185 unsigned long recovery; 186 187 int in_sync; /* know to not need resync */ 188 struct mutex reconfig_mutex; 189 atomic_t active; 190 191 int changed; /* true if we might need to reread partition info */ 192 int degraded; /* whether md should consider 193 * adding a spare 194 */ 195 int barriers_work; /* initialised to true, cleared as soon 196 * as a barrier request to slave 197 * fails. Only supported 198 */ 199 struct bio *biolist; /* bios that need to be retried 200 * because BIO_RW_BARRIER is not supported 201 */ 202 203 atomic_t recovery_active; /* blocks scheduled, but not written */ 204 wait_queue_head_t recovery_wait; 205 sector_t recovery_cp; 206 207 spinlock_t write_lock; 208 wait_queue_head_t sb_wait; /* for waiting on superblock updates */ 209 atomic_t pending_writes; /* number of active superblock writes */ 210 211 unsigned int safemode; /* if set, update "clean" superblock 212 * when no writes pending. 213 */ 214 unsigned int safemode_delay; 215 struct timer_list safemode_timer; 216 atomic_t writes_pending; 217 request_queue_t *queue; /* for plugging ... */ 218 219 atomic_t write_behind; /* outstanding async IO */ 220 unsigned int max_write_behind; /* 0 = sync */ 221 222 struct bitmap *bitmap; /* the bitmap for the device */ 223 struct file *bitmap_file; /* the bitmap file */ 224 long bitmap_offset; /* offset from superblock of 225 * start of bitmap. May be 226 * negative, but not '0' 227 */ 228 long default_bitmap_offset; /* this is the offset to use when 229 * hot-adding a bitmap. It should 230 * eventually be settable by sysfs. 231 */ 232 233 struct list_head all_mddevs; 234}; 235 236 237static inline void rdev_dec_pending(mdk_rdev_t *rdev, mddev_t *mddev) 238{ 239 int faulty = test_bit(Faulty, &rdev->flags); 240 if (atomic_dec_and_test(&rdev->nr_pending) && faulty) 241 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 242} 243 244static inline void md_sync_acct(struct block_device *bdev, unsigned long nr_sectors) 245{ 246 atomic_add(nr_sectors, &bdev->bd_contains->bd_disk->sync_io); 247} 248 249struct mdk_personality 250{ 251 char *name; 252 int level; 253 struct list_head list; 254 struct module *owner; 255 int (*make_request)(request_queue_t *q, struct bio *bio); 256 int (*run)(mddev_t *mddev); 257 int (*stop)(mddev_t *mddev); 258 void (*status)(struct seq_file *seq, mddev_t *mddev); 259 /* error_handler must set ->faulty and clear ->in_sync 260 * if appropriate, and should abort recovery if needed 261 */ 262 void (*error_handler)(mddev_t *mddev, mdk_rdev_t *rdev); 263 int (*hot_add_disk) (mddev_t *mddev, mdk_rdev_t *rdev); 264 int (*hot_remove_disk) (mddev_t *mddev, int number); 265 int (*spare_active) (mddev_t *mddev); 266 sector_t (*sync_request)(mddev_t *mddev, sector_t sector_nr, int *skipped, int go_faster); 267 int (*resize) (mddev_t *mddev, sector_t sectors); 268 int (*check_reshape) (mddev_t *mddev); 269 int (*start_reshape) (mddev_t *mddev); 270 int (*reconfig) (mddev_t *mddev, int layout, int chunk_size); 271 /* quiesce moves between quiescence states 272 * 0 - fully active 273 * 1 - no new requests allowed 274 * others - reserved 275 */ 276 void (*quiesce) (mddev_t *mddev, int state); 277}; 278 279 280struct md_sysfs_entry { 281 struct attribute attr; 282 ssize_t (*show)(mddev_t *, char *); 283 ssize_t (*store)(mddev_t *, const char *, size_t); 284}; 285 286 287static inline char * mdname (mddev_t * mddev) 288{ 289 return mddev->gendisk ? mddev->gendisk->disk_name : "mdX"; 290} 291 292/* 293 * iterates through some rdev ringlist. It's safe to remove the 294 * current 'rdev'. Dont touch 'tmp' though. 295 */ 296#define ITERATE_RDEV_GENERIC(head,rdev,tmp) \ 297 \ 298 for ((tmp) = (head).next; \ 299 (rdev) = (list_entry((tmp), mdk_rdev_t, same_set)), \ 300 (tmp) = (tmp)->next, (tmp)->prev != &(head) \ 301 ; ) 302/* 303 * iterates through the 'same array disks' ringlist 304 */ 305#define ITERATE_RDEV(mddev,rdev,tmp) \ 306 ITERATE_RDEV_GENERIC((mddev)->disks,rdev,tmp) 307 308/* 309 * Iterates through 'pending RAID disks' 310 */ 311#define ITERATE_RDEV_PENDING(rdev,tmp) \ 312 ITERATE_RDEV_GENERIC(pending_raid_disks,rdev,tmp) 313 314typedef struct mdk_thread_s { 315 void (*run) (mddev_t *mddev); 316 mddev_t *mddev; 317 wait_queue_head_t wqueue; 318 unsigned long flags; 319 struct task_struct *tsk; 320 unsigned long timeout; 321} mdk_thread_t; 322 323#define THREAD_WAKEUP 0 324 325#define __wait_event_lock_irq(wq, condition, lock, cmd) \ 326do { \ 327 wait_queue_t __wait; \ 328 init_waitqueue_entry(&__wait, current); \ 329 \ 330 add_wait_queue(&wq, &__wait); \ 331 for (;;) { \ 332 set_current_state(TASK_UNINTERRUPTIBLE); \ 333 if (condition) \ 334 break; \ 335 spin_unlock_irq(&lock); \ 336 cmd; \ 337 schedule(); \ 338 spin_lock_irq(&lock); \ 339 } \ 340 current->state = TASK_RUNNING; \ 341 remove_wait_queue(&wq, &__wait); \ 342} while (0) 343 344#define wait_event_lock_irq(wq, condition, lock, cmd) \ 345do { \ 346 if (condition) \ 347 break; \ 348 __wait_event_lock_irq(wq, condition, lock, cmd); \ 349} while (0) 350 351static inline void safe_put_page(struct page *p) 352{ 353 if (p) put_page(p); 354} 355 356#endif 357