diff options
Diffstat (limited to 'drivers/md/md.h')
-rw-r--r-- | drivers/md/md.h | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/drivers/md/md.h b/drivers/md/md.h index 10597bfec000..a953fe2808ae 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h | |||
@@ -29,6 +29,26 @@ | |||
29 | typedef struct mddev_s mddev_t; | 29 | typedef struct mddev_s mddev_t; |
30 | typedef struct mdk_rdev_s mdk_rdev_t; | 30 | typedef struct mdk_rdev_s mdk_rdev_t; |
31 | 31 | ||
32 | /* generic plugging support - like that provided with request_queue, | ||
33 | * but does not require a request_queue | ||
34 | */ | ||
35 | struct plug_handle { | ||
36 | void (*unplug_fn)(struct plug_handle *); | ||
37 | struct timer_list unplug_timer; | ||
38 | struct work_struct unplug_work; | ||
39 | unsigned long unplug_flag; | ||
40 | }; | ||
41 | #define PLUGGED_FLAG 1 | ||
42 | void plugger_init(struct plug_handle *plug, | ||
43 | void (*unplug_fn)(struct plug_handle *)); | ||
44 | void plugger_set_plug(struct plug_handle *plug); | ||
45 | int plugger_remove_plug(struct plug_handle *plug); | ||
46 | static inline void plugger_flush(struct plug_handle *plug) | ||
47 | { | ||
48 | del_timer_sync(&plug->unplug_timer); | ||
49 | cancel_work_sync(&plug->unplug_work); | ||
50 | } | ||
51 | |||
32 | /* | 52 | /* |
33 | * MD's 'extended' device | 53 | * MD's 'extended' device |
34 | */ | 54 | */ |
@@ -67,7 +87,7 @@ struct mdk_rdev_s | |||
67 | #define Faulty 1 /* device is known to have a fault */ | 87 | #define Faulty 1 /* device is known to have a fault */ |
68 | #define In_sync 2 /* device is in_sync with rest of array */ | 88 | #define In_sync 2 /* device is in_sync with rest of array */ |
69 | #define WriteMostly 4 /* Avoid reading if at all possible */ | 89 | #define WriteMostly 4 /* Avoid reading if at all possible */ |
70 | #define BarriersNotsupp 5 /* BIO_RW_BARRIER is not supported */ | 90 | #define BarriersNotsupp 5 /* REQ_HARDBARRIER is not supported */ |
71 | #define AllReserved 6 /* If whole device is reserved for | 91 | #define AllReserved 6 /* If whole device is reserved for |
72 | * one array */ | 92 | * one array */ |
73 | #define AutoDetected 7 /* added by auto-detect */ | 93 | #define AutoDetected 7 /* added by auto-detect */ |
@@ -125,6 +145,10 @@ struct mddev_s | |||
125 | int suspended; | 145 | int suspended; |
126 | atomic_t active_io; | 146 | atomic_t active_io; |
127 | int ro; | 147 | int ro; |
148 | int sysfs_active; /* set when sysfs deletes | ||
149 | * are happening, so run/ | ||
150 | * takeover/stop are not safe | ||
151 | */ | ||
128 | 152 | ||
129 | struct gendisk *gendisk; | 153 | struct gendisk *gendisk; |
130 | 154 | ||
@@ -254,7 +278,7 @@ struct mddev_s | |||
254 | * fails. Only supported | 278 | * fails. Only supported |
255 | */ | 279 | */ |
256 | struct bio *biolist; /* bios that need to be retried | 280 | struct bio *biolist; /* bios that need to be retried |
257 | * because BIO_RW_BARRIER is not supported | 281 | * because REQ_HARDBARRIER is not supported |
258 | */ | 282 | */ |
259 | 283 | ||
260 | atomic_t recovery_active; /* blocks scheduled, but not written */ | 284 | atomic_t recovery_active; /* blocks scheduled, but not written */ |
@@ -297,9 +321,14 @@ struct mddev_s | |||
297 | * hot-adding a bitmap. It should | 321 | * hot-adding a bitmap. It should |
298 | * eventually be settable by sysfs. | 322 | * eventually be settable by sysfs. |
299 | */ | 323 | */ |
324 | /* When md is serving under dm, it might use a | ||
325 | * dirty_log to store the bits. | ||
326 | */ | ||
327 | struct dm_dirty_log *log; | ||
328 | |||
300 | struct mutex mutex; | 329 | struct mutex mutex; |
301 | unsigned long chunksize; | 330 | unsigned long chunksize; |
302 | unsigned long daemon_sleep; /* how many seconds between updates? */ | 331 | unsigned long daemon_sleep; /* how many jiffies between updates? */ |
303 | unsigned long max_write_behind; /* write-behind mode */ | 332 | unsigned long max_write_behind; /* write-behind mode */ |
304 | int external; | 333 | int external; |
305 | } bitmap_info; | 334 | } bitmap_info; |
@@ -308,6 +337,8 @@ struct mddev_s | |||
308 | struct list_head all_mddevs; | 337 | struct list_head all_mddevs; |
309 | 338 | ||
310 | struct attribute_group *to_remove; | 339 | struct attribute_group *to_remove; |
340 | struct plug_handle *plug; /* if used by personality */ | ||
341 | |||
311 | /* Generic barrier handling. | 342 | /* Generic barrier handling. |
312 | * If there is a pending barrier request, all other | 343 | * If there is a pending barrier request, all other |
313 | * writes are blocked while the devices are flushed. | 344 | * writes are blocked while the devices are flushed. |
@@ -318,6 +349,7 @@ struct mddev_s | |||
318 | struct bio *barrier; | 349 | struct bio *barrier; |
319 | atomic_t flush_pending; | 350 | atomic_t flush_pending; |
320 | struct work_struct barrier_work; | 351 | struct work_struct barrier_work; |
352 | struct work_struct event_work; /* used by dm to report failure event */ | ||
321 | }; | 353 | }; |
322 | 354 | ||
323 | 355 | ||
@@ -382,6 +414,18 @@ struct md_sysfs_entry { | |||
382 | }; | 414 | }; |
383 | extern struct attribute_group md_bitmap_group; | 415 | extern struct attribute_group md_bitmap_group; |
384 | 416 | ||
417 | static inline struct sysfs_dirent *sysfs_get_dirent_safe(struct sysfs_dirent *sd, char *name) | ||
418 | { | ||
419 | if (sd) | ||
420 | return sysfs_get_dirent(sd, NULL, name); | ||
421 | return sd; | ||
422 | } | ||
423 | static inline void sysfs_notify_dirent_safe(struct sysfs_dirent *sd) | ||
424 | { | ||
425 | if (sd) | ||
426 | sysfs_notify_dirent(sd); | ||
427 | } | ||
428 | |||
385 | static inline char * mdname (mddev_t * mddev) | 429 | static inline char * mdname (mddev_t * mddev) |
386 | { | 430 | { |
387 | return mddev->gendisk ? mddev->gendisk->disk_name : "mdX"; | 431 | return mddev->gendisk ? mddev->gendisk->disk_name : "mdX"; |
@@ -474,5 +518,14 @@ extern int md_integrity_register(mddev_t *mddev); | |||
474 | extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev); | 518 | extern void md_integrity_add_rdev(mdk_rdev_t *rdev, mddev_t *mddev); |
475 | extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale); | 519 | extern int strict_strtoul_scaled(const char *cp, unsigned long *res, int scale); |
476 | extern void restore_bitmap_write_access(struct file *file); | 520 | extern void restore_bitmap_write_access(struct file *file); |
521 | extern void md_unplug(mddev_t *mddev); | ||
522 | |||
523 | extern void mddev_init(mddev_t *mddev); | ||
524 | extern int md_run(mddev_t *mddev); | ||
525 | extern void md_stop(mddev_t *mddev); | ||
526 | extern void md_stop_writes(mddev_t *mddev); | ||
527 | extern void md_rdev_init(mdk_rdev_t *rdev); | ||
477 | 528 | ||
529 | extern void mddev_suspend(mddev_t *mddev); | ||
530 | extern void mddev_resume(mddev_t *mddev); | ||
478 | #endif /* _MD_MD_H */ | 531 | #endif /* _MD_MD_H */ |