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