111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/**************************************************************************** 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert **************************************************************************** 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** This header was automatically generated from a Linux kernel header 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** of the same name, to make information necessary for userspace to 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** call into the kernel available to libc. It contains only constants, 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** structures, and macros generated from the original header, and thus, 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** contains no copyrightable information. 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *** 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert **************************************************************************** 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ****************************************************************************/ 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _MD_K_H 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _MD_K_H 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "../../../drivers/md/dm-bio-list.h" 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define LEVEL_MULTIPATH (-4) 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define LEVEL_LINEAR (-1) 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define LEVEL_FAULTY (-5) 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define LEVEL_NONE (-1000000) 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MaxSector (~(sector_t)0) 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_THREAD_NAME_MAX 14 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct mddev_s mddev_t; 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct mdk_rdev_s mdk_rdev_t; 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MAX_MD_DEVS 256 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MAX_CHUNK_SIZE (1<<30) 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct mdk_rdev_s 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head same_set; 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t size; 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert mddev_t *mddev; 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long last_events; 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct block_device *bdev; 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct page *sb_page; 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int sb_loaded; 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u64 sb_events; 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t data_offset; 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t sb_offset; 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int sb_size; 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int preferred_minor; 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct kobject kobj; 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long flags; 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define Faulty 1 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define In_sync 2 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define WriteMostly 4 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define BarriersNotsupp 5 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int desc_nr; 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int raid_disk; 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int saved_raid_disk; 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t recovery_offset; 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t nr_pending; 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t read_errors; 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t corrected_errors; 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct mddev_s 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void *private; 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct mdk_personality *pers; 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert dev_t unit; 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int md_minor; 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head disks; 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int sb_dirty; 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int ro; 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct gendisk *gendisk; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct kobject kobj; 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int major_version, 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert minor_version, 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert patch_version; 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int persistent; 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int chunk_size; 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert time_t ctime, utime; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int level, layout; 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char clevel[16]; 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int raid_disks; 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int max_disks; 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t size; 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t array_size; 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert __u64 events; 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char uuid[16]; 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t reshape_position; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int delta_disks, new_level, new_layout, new_chunk; 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct mdk_thread_s *thread; 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct mdk_thread_s *sync_thread; 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t curr_resync; 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long resync_mark; 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t resync_mark_cnt; 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t curr_mark_cnt; 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t resync_max_sectors; 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t resync_mismatches; 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t suspend_lo; 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t suspend_hi; 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int sync_speed_min; 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int sync_speed_max; 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int ok_start_degraded; 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_RUNNING 0 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_SYNC 1 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_ERR 2 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_INTR 3 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_DONE 4 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_NEEDED 5 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_REQUESTED 6 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_CHECK 7 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_RESHAPE 8 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define MD_RECOVERY_FROZEN 9 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned long recovery; 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int in_sync; 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct mutex reconfig_mutex; 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t active; 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int changed; 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int degraded; 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int barriers_work; 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bio *biolist; 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t recovery_active; 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert wait_queue_head_t recovery_wait; 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert sector_t recovery_cp; 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert spinlock_t write_lock; 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert wait_queue_head_t sb_wait; 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t pending_writes; 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int safemode; 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int safemode_delay; 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct timer_list safemode_timer; 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t writes_pending; 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert request_queue_t *queue; 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert atomic_t write_behind; 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert unsigned int max_write_behind; 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct bitmap *bitmap; 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct file *bitmap_file; 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long bitmap_offset; 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert long default_bitmap_offset; 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct list_head all_mddevs; 16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct md_sysfs_entry { 16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct attribute attr; 17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*show)(mddev_t *, char *); 17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ssize_t (*store)(mddev_t *, const char *, size_t); 17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ITERATE_RDEV_GENERIC(head,rdev,tmp) for ((tmp) = (head).next; (rdev) = (list_entry((tmp), mdk_rdev_t, same_set)), (tmp) = (tmp)->next, (tmp)->prev != &(head) ; ) 17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ITERATE_RDEV(mddev,rdev,tmp) ITERATE_RDEV_GENERIC((mddev)->disks,rdev,tmp) 17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define ITERATE_RDEV_PENDING(rdev,tmp) ITERATE_RDEV_GENERIC(pending_raid_disks,rdev,tmp) 17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define THREAD_WAKEUP 0 17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define __wait_event_lock_irq(wq, condition, lock, cmd) do { wait_queue_t __wait; init_waitqueue_entry(&__wait, current); add_wait_queue(&wq, &__wait); for (;;) { set_current_state(TASK_UNINTERRUPTIBLE); if (condition) break; spin_unlock_irq(&lock); cmd; schedule(); spin_lock_irq(&lock); } current->state = TASK_RUNNING; remove_wait_queue(&wq, &__wait); } while (0) 18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define wait_event_lock_irq(wq, condition, lock, cmd) do { if (condition) break; __wait_event_lock_irq(wq, condition, lock, cmd); } while (0) 18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 185