raid5.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:52k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * raid5.c : Multiple Devices driver for Linux
  3.  *    Copyright (C) 1996, 1997 Ingo Molnar, Miguel de Icaza, Gadi Oxman
  4.  *    Copyright (C) 1999, 2000 Ingo Molnar
  5.  *
  6.  * RAID-5 management functions.
  7.  *
  8.  * This program is free software; you can redistribute it and/or modify
  9.  * it under the terms of the GNU General Public License as published by
  10.  * the Free Software Foundation; either version 2, or (at your option)
  11.  * any later version.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * (for example /usr/src/linux/COPYING); if not, write to the Free
  15.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16.  */
  17. #include <linux/config.h>
  18. #include <linux/module.h>
  19. #include <linux/locks.h>
  20. #include <linux/slab.h>
  21. #include <linux/raid/raid5.h>
  22. #include <asm/bitops.h>
  23. #include <asm/atomic.h>
  24. static mdk_personality_t raid5_personality;
  25. /*
  26.  * Stripe cache
  27.  */
  28. #define NR_STRIPES 256
  29. #define IO_THRESHOLD 1
  30. #define HASH_PAGES 1
  31. #define HASH_PAGES_ORDER 0
  32. #define NR_HASH (HASH_PAGES * PAGE_SIZE / sizeof(struct stripe_head *))
  33. #define HASH_MASK (NR_HASH - 1)
  34. #define stripe_hash(conf, sect) ((conf)->stripe_hashtbl[((sect) / ((conf)->buffer_size >> 9)) & HASH_MASK])
  35. /*
  36.  * The following can be used to debug the driver
  37.  */
  38. #define RAID5_DEBUG 0
  39. #define RAID5_PARANOIA 1
  40. #if RAID5_PARANOIA && CONFIG_SMP
  41. # define CHECK_DEVLOCK() if (!spin_is_locked(&conf->device_lock)) BUG()
  42. #else
  43. # define CHECK_DEVLOCK()
  44. #endif
  45. #if RAID5_DEBUG
  46. #define PRINTK(x...) printk(x)
  47. #define inline
  48. #define __inline__
  49. #else
  50. #define PRINTK(x...) do { } while (0)
  51. #endif
  52. static void print_raid5_conf (raid5_conf_t *conf);
  53. static inline void __release_stripe(raid5_conf_t *conf, struct stripe_head *sh)
  54. {
  55. if (atomic_dec_and_test(&sh->count)) {
  56. if (!list_empty(&sh->lru))
  57. BUG();
  58. if (atomic_read(&conf->active_stripes)==0)
  59. BUG();
  60. if (test_bit(STRIPE_HANDLE, &sh->state)) {
  61. if (test_bit(STRIPE_DELAYED, &sh->state))
  62. list_add_tail(&sh->lru, &conf->delayed_list);
  63. else
  64. list_add_tail(&sh->lru, &conf->handle_list);
  65. md_wakeup_thread(conf->thread);
  66. } else {
  67. if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) {
  68. atomic_dec(&conf->preread_active_stripes);
  69. if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD)
  70. md_wakeup_thread(conf->thread);
  71. }
  72. list_add_tail(&sh->lru, &conf->inactive_list);
  73. atomic_dec(&conf->active_stripes);
  74. if (!conf->inactive_blocked ||
  75.     atomic_read(&conf->active_stripes) < (NR_STRIPES*3/4))
  76. wake_up(&conf->wait_for_stripe);
  77. }
  78. }
  79. }
  80. static void release_stripe(struct stripe_head *sh)
  81. {
  82. raid5_conf_t *conf = sh->raid_conf;
  83. unsigned long flags;
  84. spin_lock_irqsave(&conf->device_lock, flags);
  85. __release_stripe(conf, sh);
  86. spin_unlock_irqrestore(&conf->device_lock, flags);
  87. }
  88. static void remove_hash(struct stripe_head *sh)
  89. {
  90. PRINTK("remove_hash(), stripe %lun", sh->sector);
  91. if (sh->hash_pprev) {
  92. if (sh->hash_next)
  93. sh->hash_next->hash_pprev = sh->hash_pprev;
  94. *sh->hash_pprev = sh->hash_next;
  95. sh->hash_pprev = NULL;
  96. }
  97. }
  98. static __inline__ void insert_hash(raid5_conf_t *conf, struct stripe_head *sh)
  99. {
  100. struct stripe_head **shp = &stripe_hash(conf, sh->sector);
  101. PRINTK("insert_hash(), stripe %lun",sh->sector);
  102. CHECK_DEVLOCK();
  103. if ((sh->hash_next = *shp) != NULL)
  104. (*shp)->hash_pprev = &sh->hash_next;
  105. *shp = sh;
  106. sh->hash_pprev = shp;
  107. }
  108. /* find an idle stripe, make sure it is unhashed, and return it. */
  109. static struct stripe_head *get_free_stripe(raid5_conf_t *conf)
  110. {
  111. struct stripe_head *sh = NULL;
  112. struct list_head *first;
  113. CHECK_DEVLOCK();
  114. if (list_empty(&conf->inactive_list))
  115. goto out;
  116. first = conf->inactive_list.next;
  117. sh = list_entry(first, struct stripe_head, lru);
  118. list_del_init(first);
  119. remove_hash(sh);
  120. atomic_inc(&conf->active_stripes);
  121. out:
  122. return sh;
  123. }
  124. static void shrink_buffers(struct stripe_head *sh, int num)
  125. {
  126. struct buffer_head *bh;
  127. int i;
  128. for (i=0; i<num ; i++) {
  129. bh = sh->bh_cache[i];
  130. if (!bh)
  131. return;
  132. sh->bh_cache[i] = NULL;
  133. free_page((unsigned long) bh->b_data);
  134. kfree(bh);
  135. }
  136. }
  137. static int grow_buffers(struct stripe_head *sh, int num, int b_size, int priority)
  138. {
  139. struct buffer_head *bh;
  140. int i;
  141. for (i=0; i<num; i++) {
  142. struct page *page;
  143. bh = kmalloc(sizeof(struct buffer_head), priority);
  144. if (!bh)
  145. return 1;
  146. memset(bh, 0, sizeof (struct buffer_head));
  147. init_waitqueue_head(&bh->b_wait);
  148. if ((page = alloc_page(priority)))
  149. bh->b_data = page_address(page);
  150. else {
  151. kfree(bh);
  152. return 1;
  153. }
  154. atomic_set(&bh->b_count, 0);
  155. bh->b_page = page;
  156. sh->bh_cache[i] = bh;
  157. }
  158. return 0;
  159. }
  160. static struct buffer_head *raid5_build_block (struct stripe_head *sh, int i);
  161. static inline void init_stripe(struct stripe_head *sh, unsigned long sector)
  162. {
  163. raid5_conf_t *conf = sh->raid_conf;
  164. int disks = conf->raid_disks, i;
  165. if (atomic_read(&sh->count) != 0)
  166. BUG();
  167. if (test_bit(STRIPE_HANDLE, &sh->state))
  168. BUG();
  169. CHECK_DEVLOCK();
  170. PRINTK("init_stripe called, stripe %lun", sh->sector);
  171. remove_hash(sh);
  172. sh->sector = sector;
  173. sh->size = conf->buffer_size;
  174. sh->state = 0;
  175. for (i=disks; i--; ) {
  176. if (sh->bh_read[i] || sh->bh_write[i] || sh->bh_written[i] ||
  177.     buffer_locked(sh->bh_cache[i])) {
  178. printk("sector=%lx i=%d %p %p %p %dn",
  179.        sh->sector, i, sh->bh_read[i],
  180.        sh->bh_write[i], sh->bh_written[i],
  181.        buffer_locked(sh->bh_cache[i]));
  182. BUG();
  183. }
  184. clear_bit(BH_Uptodate, &sh->bh_cache[i]->b_state);
  185. raid5_build_block(sh, i);
  186. }
  187. insert_hash(conf, sh);
  188. }
  189. /* the buffer size has changed, so unhash all stripes
  190.  * as active stripes complete, they will go onto inactive list
  191.  */
  192. static void shrink_stripe_cache(raid5_conf_t *conf)
  193. {
  194. int i;
  195. CHECK_DEVLOCK();
  196. if (atomic_read(&conf->active_stripes))
  197. BUG();
  198. for (i=0; i < NR_HASH; i++) {
  199. struct stripe_head *sh;
  200. while ((sh = conf->stripe_hashtbl[i])) 
  201. remove_hash(sh);
  202. }
  203. }
  204. static struct stripe_head *__find_stripe(raid5_conf_t *conf, unsigned long sector)
  205. {
  206. struct stripe_head *sh;
  207. CHECK_DEVLOCK();
  208. PRINTK("__find_stripe, sector %lun", sector);
  209. for (sh = stripe_hash(conf, sector); sh; sh = sh->hash_next)
  210. if (sh->sector == sector)
  211. return sh;
  212. PRINTK("__stripe %lu not in cachen", sector);
  213. return NULL;
  214. }
  215. static struct stripe_head *get_active_stripe(raid5_conf_t *conf, unsigned long sector, int size, int noblock) 
  216. {
  217. struct stripe_head *sh;
  218. PRINTK("get_stripe, sector %lun", sector);
  219. md_spin_lock_irq(&conf->device_lock);
  220. do {
  221. if (conf->buffer_size == 0 ||
  222.     (size && size != conf->buffer_size)) {
  223. /* either the size is being changed (buffer_size==0) or
  224.  * we need to change it.
  225.  * If size==0, we can proceed as soon as buffer_size gets set.
  226.  * If size>0, we can proceed when active_stripes reaches 0, or
  227.  * when someone else sets the buffer_size to size.
  228.  * If someone sets the buffer size to something else, we will need to
  229.  * assert that we want to change it again
  230.  */
  231. int oldsize = conf->buffer_size;
  232. PRINTK("get_stripe %ld/%d buffer_size is %d, %d activen", sector, size, conf->buffer_size, atomic_read(&conf->active_stripes));
  233. if (size==0)
  234. wait_event_lock_irq(conf->wait_for_stripe,
  235.     conf->buffer_size,
  236.     conf->device_lock);
  237. else {
  238. while (conf->buffer_size != size && atomic_read(&conf->active_stripes)) {
  239. conf->buffer_size = 0;
  240. wait_event_lock_irq(conf->wait_for_stripe,
  241.     atomic_read(&conf->active_stripes)==0 || conf->buffer_size,
  242.     conf->device_lock);
  243. PRINTK("waited and now  %ld/%d buffer_size is %d - %d activen", sector, size,
  244.        conf->buffer_size, atomic_read(&conf->active_stripes));
  245. }
  246. if (conf->buffer_size != size) {
  247. printk("raid5: switching cache buffer size, %d --> %dn", oldsize, size);
  248. shrink_stripe_cache(conf);
  249. if (size==0) BUG();
  250. conf->buffer_size = size;
  251. PRINTK("size now %dn", conf->buffer_size);
  252. }
  253. }
  254. }
  255. if (size == 0)
  256. sector -= sector & ((conf->buffer_size>>9)-1);
  257. sh = __find_stripe(conf, sector);
  258. if (!sh) {
  259. if (!conf->inactive_blocked)
  260. sh = get_free_stripe(conf);
  261. if (noblock && sh == NULL)
  262. break;
  263. if (!sh) {
  264. conf->inactive_blocked = 1;
  265. wait_event_lock_irq(conf->wait_for_stripe,
  266.     !list_empty(&conf->inactive_list) &&
  267.     (atomic_read(&conf->active_stripes) < (NR_STRIPES *3/4)
  268.      || !conf->inactive_blocked),
  269.     conf->device_lock);
  270. conf->inactive_blocked = 0;
  271. } else
  272. init_stripe(sh, sector);
  273. } else {
  274. if (atomic_read(&sh->count)) {
  275. if (!list_empty(&sh->lru))
  276. BUG();
  277. } else {
  278. if (!test_bit(STRIPE_HANDLE, &sh->state))
  279. atomic_inc(&conf->active_stripes);
  280. if (list_empty(&sh->lru))
  281. BUG();
  282. list_del_init(&sh->lru);
  283. }
  284. }
  285. } while (sh == NULL);
  286. if (sh)
  287. atomic_inc(&sh->count);
  288. md_spin_unlock_irq(&conf->device_lock);
  289. return sh;
  290. }
  291. static int grow_stripes(raid5_conf_t *conf, int num, int priority)
  292. {
  293. struct stripe_head *sh;
  294. while (num--) {
  295. sh = kmalloc(sizeof(struct stripe_head), priority);
  296. if (!sh)
  297. return 1;
  298. memset(sh, 0, sizeof(*sh));
  299. sh->raid_conf = conf;
  300. sh->lock = SPIN_LOCK_UNLOCKED;
  301. if (grow_buffers(sh, conf->raid_disks, PAGE_SIZE, priority)) {
  302. shrink_buffers(sh, conf->raid_disks);
  303. kfree(sh);
  304. return 1;
  305. }
  306. /* we just created an active stripe so... */
  307. atomic_set(&sh->count, 1);
  308. atomic_inc(&conf->active_stripes);
  309. INIT_LIST_HEAD(&sh->lru);
  310. release_stripe(sh);
  311. }
  312. return 0;
  313. }
  314. static void shrink_stripes(raid5_conf_t *conf, int num)
  315. {
  316. struct stripe_head *sh;
  317. while (num--) {
  318. spin_lock_irq(&conf->device_lock);
  319. sh = get_free_stripe(conf);
  320. spin_unlock_irq(&conf->device_lock);
  321. if (!sh)
  322. break;
  323. if (atomic_read(&sh->count))
  324. BUG();
  325. shrink_buffers(sh, conf->raid_disks);
  326. kfree(sh);
  327. atomic_dec(&conf->active_stripes);
  328. }
  329. }
  330. static void raid5_end_read_request (struct buffer_head * bh, int uptodate)
  331. {
  332.   struct stripe_head *sh = bh->b_private;
  333. raid5_conf_t *conf = sh->raid_conf;
  334. int disks = conf->raid_disks, i;
  335. unsigned long flags;
  336. for (i=0 ; i<disks; i++)
  337. if (bh == sh->bh_cache[i])
  338. break;
  339. PRINTK("end_read_request %lu/%d, count: %d, uptodate %d.n", sh->sector, i, atomic_read(&sh->count), uptodate);
  340. if (i == disks) {
  341. BUG();
  342. return;
  343. }
  344. if (uptodate) {
  345. struct buffer_head *buffer;
  346. spin_lock_irqsave(&conf->device_lock, flags);
  347. /* we can return a buffer if we bypassed the cache or
  348.  * if the top buffer is not in highmem.  If there are
  349.  * multiple buffers, leave the extra work to
  350.  * handle_stripe
  351.  */
  352. buffer = sh->bh_read[i];
  353. if (buffer &&
  354.     (!PageHighMem(buffer->b_page)
  355.      || buffer->b_page == bh->b_page )
  356. ) {
  357. sh->bh_read[i] = buffer->b_reqnext;
  358. buffer->b_reqnext = NULL;
  359. } else
  360. buffer = NULL;
  361. spin_unlock_irqrestore(&conf->device_lock, flags);
  362. if (sh->bh_page[i]==NULL)
  363. set_bit(BH_Uptodate, &bh->b_state);
  364. if (buffer) {
  365. if (buffer->b_page != bh->b_page)
  366. memcpy(buffer->b_data, bh->b_data, bh->b_size);
  367. buffer->b_end_io(buffer, 1);
  368. }
  369. } else {
  370. md_error(conf->mddev, bh->b_dev);
  371. clear_bit(BH_Uptodate, &bh->b_state);
  372. }
  373. /* must restore b_page before unlocking buffer... */
  374. if (sh->bh_page[i]) {
  375. bh->b_page = sh->bh_page[i];
  376. bh->b_data = page_address(bh->b_page);
  377. sh->bh_page[i] = NULL;
  378. clear_bit(BH_Uptodate, &bh->b_state);
  379. }
  380. clear_bit(BH_Lock, &bh->b_state);
  381. set_bit(STRIPE_HANDLE, &sh->state);
  382. release_stripe(sh);
  383. }
  384. static void raid5_end_write_request (struct buffer_head *bh, int uptodate)
  385. {
  386.   struct stripe_head *sh = bh->b_private;
  387. raid5_conf_t *conf = sh->raid_conf;
  388. int disks = conf->raid_disks, i;
  389. unsigned long flags;
  390. for (i=0 ; i<disks; i++)
  391. if (bh == sh->bh_cache[i])
  392. break;
  393. PRINTK("end_write_request %lu/%d, count %d, uptodate: %d.n", sh->sector, i, atomic_read(&sh->count), uptodate);
  394. if (i == disks) {
  395. BUG();
  396. return;
  397. }
  398. md_spin_lock_irqsave(&conf->device_lock, flags);
  399. if (!uptodate)
  400. md_error(conf->mddev, bh->b_dev);
  401. clear_bit(BH_Lock, &bh->b_state);
  402. set_bit(STRIPE_HANDLE, &sh->state);
  403. __release_stripe(conf, sh);
  404. md_spin_unlock_irqrestore(&conf->device_lock, flags);
  405. }
  406. static struct buffer_head *raid5_build_block (struct stripe_head *sh, int i)
  407. {
  408. raid5_conf_t *conf = sh->raid_conf;
  409. struct buffer_head *bh = sh->bh_cache[i];
  410. unsigned long block = sh->sector / (sh->size >> 9);
  411. init_buffer(bh, raid5_end_read_request, sh);
  412. bh->b_dev       = conf->disks[i].dev;
  413. bh->b_blocknr   = block;
  414. bh->b_state = (1 << BH_Req) | (1 << BH_Mapped);
  415. bh->b_size = sh->size;
  416. bh->b_list = BUF_LOCKED;
  417. return bh;
  418. }
  419. static int raid5_error (mddev_t *mddev, kdev_t dev)
  420. {
  421. raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
  422. mdp_super_t *sb = mddev->sb;
  423. struct disk_info *disk;
  424. int i;
  425. PRINTK("raid5_error calledn");
  426. for (i = 0, disk = conf->disks; i < conf->raid_disks; i++, disk++) {
  427. if (disk->dev == dev) {
  428. if (disk->operational) {
  429. disk->operational = 0;
  430. mark_disk_faulty(sb->disks+disk->number);
  431. mark_disk_nonsync(sb->disks+disk->number);
  432. mark_disk_inactive(sb->disks+disk->number);
  433. sb->active_disks--;
  434. sb->working_disks--;
  435. sb->failed_disks++;
  436. mddev->sb_dirty = 1;
  437. conf->working_disks--;
  438. conf->failed_disks++;
  439. md_wakeup_thread(conf->thread);
  440. printk (KERN_ALERT
  441. "raid5: Disk failure on %s, disabling device."
  442. " Operation continuing on %d devicesn",
  443. partition_name (dev), conf->working_disks);
  444. }
  445. return 0;
  446. }
  447. }
  448. /*
  449.  * handle errors in spares (during reconstruction)
  450.  */
  451. if (conf->spare) {
  452. disk = conf->spare;
  453. if (disk->dev == dev) {
  454. printk (KERN_ALERT
  455. "raid5: Disk failure on spare %sn",
  456. partition_name (dev));
  457. if (!conf->spare->operational) {
  458. /* probably a SET_DISK_FAULTY ioctl */
  459. return -EIO;
  460. }
  461. disk->operational = 0;
  462. disk->write_only = 0;
  463. conf->spare = NULL;
  464. mark_disk_faulty(sb->disks+disk->number);
  465. mark_disk_nonsync(sb->disks+disk->number);
  466. mark_disk_inactive(sb->disks+disk->number);
  467. sb->spare_disks--;
  468. sb->working_disks--;
  469. sb->failed_disks++;
  470. mddev->sb_dirty = 1;
  471. md_wakeup_thread(conf->thread);
  472. return 0;
  473. }
  474. }
  475. MD_BUG();
  476. return -EIO;
  477. }
  478. /*
  479.  * Input: a 'big' sector number,
  480.  * Output: index of the data and parity disk, and the sector # in them.
  481.  */
  482. static unsigned long raid5_compute_sector(unsigned long r_sector, unsigned int raid_disks,
  483. unsigned int data_disks, unsigned int * dd_idx,
  484. unsigned int * pd_idx, raid5_conf_t *conf)
  485. {
  486. unsigned long stripe;
  487. unsigned long chunk_number;
  488. unsigned int chunk_offset;
  489. unsigned long new_sector;
  490. int sectors_per_chunk = conf->chunk_size >> 9;
  491. /* First compute the information on this sector */
  492. /*
  493.  * Compute the chunk number and the sector offset inside the chunk
  494.  */
  495. chunk_number = r_sector / sectors_per_chunk;
  496. chunk_offset = r_sector % sectors_per_chunk;
  497. /*
  498.  * Compute the stripe number
  499.  */
  500. stripe = chunk_number / data_disks;
  501. /*
  502.  * Compute the data disk and parity disk indexes inside the stripe
  503.  */
  504. *dd_idx = chunk_number % data_disks;
  505. /*
  506.  * Select the parity disk based on the user selected algorithm.
  507.  */
  508. if (conf->level == 4)
  509. *pd_idx = data_disks;
  510. else switch (conf->algorithm) {
  511. case ALGORITHM_LEFT_ASYMMETRIC:
  512. *pd_idx = data_disks - stripe % raid_disks;
  513. if (*dd_idx >= *pd_idx)
  514. (*dd_idx)++;
  515. break;
  516. case ALGORITHM_RIGHT_ASYMMETRIC:
  517. *pd_idx = stripe % raid_disks;
  518. if (*dd_idx >= *pd_idx)
  519. (*dd_idx)++;
  520. break;
  521. case ALGORITHM_LEFT_SYMMETRIC:
  522. *pd_idx = data_disks - stripe % raid_disks;
  523. *dd_idx = (*pd_idx + 1 + *dd_idx) % raid_disks;
  524. break;
  525. case ALGORITHM_RIGHT_SYMMETRIC:
  526. *pd_idx = stripe % raid_disks;
  527. *dd_idx = (*pd_idx + 1 + *dd_idx) % raid_disks;
  528. break;
  529. default:
  530. printk ("raid5: unsupported algorithm %dn", conf->algorithm);
  531. }
  532. /*
  533.  * Finally, compute the new sector number
  534.  */
  535. new_sector = stripe * sectors_per_chunk + chunk_offset;
  536. return new_sector;
  537. }
  538. #if 0
  539. static unsigned long compute_blocknr(struct stripe_head *sh, int i)
  540. {
  541. raid5_conf_t *conf = sh->raid_conf;
  542. int raid_disks = conf->raid_disks, data_disks = raid_disks - 1;
  543. unsigned long new_sector = sh->sector, check;
  544. int sectors_per_chunk = conf->chunk_size >> 9;
  545. unsigned long stripe = new_sector / sectors_per_chunk;
  546. int chunk_offset = new_sector % sectors_per_chunk;
  547. int chunk_number, dummy1, dummy2, dd_idx = i;
  548. unsigned long r_sector, blocknr;
  549. switch (conf->algorithm) {
  550. case ALGORITHM_LEFT_ASYMMETRIC:
  551. case ALGORITHM_RIGHT_ASYMMETRIC:
  552. if (i > sh->pd_idx)
  553. i--;
  554. break;
  555. case ALGORITHM_LEFT_SYMMETRIC:
  556. case ALGORITHM_RIGHT_SYMMETRIC:
  557. if (i < sh->pd_idx)
  558. i += raid_disks;
  559. i -= (sh->pd_idx + 1);
  560. break;
  561. default:
  562. printk ("raid5: unsupported algorithm %dn", conf->algorithm);
  563. }
  564. chunk_number = stripe * data_disks + i;
  565. r_sector = chunk_number * sectors_per_chunk + chunk_offset;
  566. blocknr = r_sector / (sh->size >> 9);
  567. check = raid5_compute_sector (r_sector, raid_disks, data_disks, &dummy1, &dummy2, conf);
  568. if (check != sh->sector || dummy1 != dd_idx || dummy2 != sh->pd_idx) {
  569. printk("compute_blocknr: map not correctn");
  570. return 0;
  571. }
  572. return blocknr;
  573. }
  574. #endif
  575. #define check_xor()  do { 
  576.    if (count == MAX_XOR_BLOCKS) {
  577. xor_block(count, bh_ptr);
  578. count = 1;
  579.    }
  580. } while(0)
  581. static void compute_block(struct stripe_head *sh, int dd_idx)
  582. {
  583. raid5_conf_t *conf = sh->raid_conf;
  584. int i, count, disks = conf->raid_disks;
  585. struct buffer_head *bh_ptr[MAX_XOR_BLOCKS], *bh;
  586. PRINTK("compute_block, stripe %lu, idx %dn", sh->sector, dd_idx);
  587. memset(sh->bh_cache[dd_idx]->b_data, 0, sh->size);
  588. bh_ptr[0] = sh->bh_cache[dd_idx];
  589. count = 1;
  590. for (i = disks ; i--; ) {
  591. if (i == dd_idx)
  592. continue;
  593. bh = sh->bh_cache[i];
  594. if (buffer_uptodate(bh))
  595. bh_ptr[count++] = bh;
  596. else
  597. printk("compute_block() %d, stripe %lu, %d not presentn", dd_idx, sh->sector, i);
  598. check_xor();
  599. }
  600. if (count != 1)
  601. xor_block(count, bh_ptr);
  602. set_bit(BH_Uptodate, &sh->bh_cache[dd_idx]->b_state);
  603. }
  604. static void compute_parity(struct stripe_head *sh, int method)
  605. {
  606. raid5_conf_t *conf = sh->raid_conf;
  607. int i, pd_idx = sh->pd_idx, disks = conf->raid_disks, count;
  608. struct buffer_head *bh_ptr[MAX_XOR_BLOCKS];
  609. struct buffer_head *chosen[MD_SB_DISKS];
  610. PRINTK("compute_parity, stripe %lu, method %dn", sh->sector, method);
  611. memset(chosen, 0, sizeof(chosen));
  612. count = 1;
  613. bh_ptr[0] = sh->bh_cache[pd_idx];
  614. switch(method) {
  615. case READ_MODIFY_WRITE:
  616. if (!buffer_uptodate(sh->bh_cache[pd_idx]))
  617. BUG();
  618. for (i=disks ; i-- ;) {
  619. if (i==pd_idx)
  620. continue;
  621. if (sh->bh_write[i] &&
  622.     buffer_uptodate(sh->bh_cache[i])) {
  623. bh_ptr[count++] = sh->bh_cache[i];
  624. chosen[i] = sh->bh_write[i];
  625. sh->bh_write[i] = sh->bh_write[i]->b_reqnext;
  626. chosen[i]->b_reqnext = sh->bh_written[i];
  627. sh->bh_written[i] = chosen[i];
  628. check_xor();
  629. }
  630. }
  631. break;
  632. case RECONSTRUCT_WRITE:
  633. memset(sh->bh_cache[pd_idx]->b_data, 0, sh->size);
  634. for (i= disks; i-- ;)
  635. if (i!=pd_idx && sh->bh_write[i]) {
  636. chosen[i] = sh->bh_write[i];
  637. sh->bh_write[i] = sh->bh_write[i]->b_reqnext;
  638. chosen[i]->b_reqnext = sh->bh_written[i];
  639. sh->bh_written[i] = chosen[i];
  640. }
  641. break;
  642. case CHECK_PARITY:
  643. break;
  644. }
  645. if (count>1) {
  646. xor_block(count, bh_ptr);
  647. count = 1;
  648. }
  649. for (i = disks; i--;)
  650. if (chosen[i]) {
  651. struct buffer_head *bh = sh->bh_cache[i];
  652. char *bdata;
  653. bdata = bh_kmap(chosen[i]);
  654. memcpy(bh->b_data,
  655.        bdata,sh->size);
  656. bh_kunmap(chosen[i]);
  657. set_bit(BH_Lock, &bh->b_state);
  658. mark_buffer_uptodate(bh, 1);
  659. }
  660. switch(method) {
  661. case RECONSTRUCT_WRITE:
  662. case CHECK_PARITY:
  663. for (i=disks; i--;)
  664. if (i != pd_idx) {
  665. bh_ptr[count++] = sh->bh_cache[i];
  666. check_xor();
  667. }
  668. break;
  669. case READ_MODIFY_WRITE:
  670. for (i = disks; i--;)
  671. if (chosen[i]) {
  672. bh_ptr[count++] = sh->bh_cache[i];
  673. check_xor();
  674. }
  675. }
  676. if (count != 1)
  677. xor_block(count, bh_ptr);
  678. if (method != CHECK_PARITY) {
  679. mark_buffer_uptodate(sh->bh_cache[pd_idx], 1);
  680. set_bit(BH_Lock, &sh->bh_cache[pd_idx]->b_state);
  681. } else
  682. mark_buffer_uptodate(sh->bh_cache[pd_idx], 0);
  683. }
  684. static void add_stripe_bh (struct stripe_head *sh, struct buffer_head *bh, int dd_idx, int rw)
  685. {
  686. struct buffer_head **bhp;
  687. raid5_conf_t *conf = sh->raid_conf;
  688. PRINTK("adding bh b#%lu to stripe s#%lun", bh->b_blocknr, sh->sector);
  689. spin_lock(&sh->lock);
  690. spin_lock_irq(&conf->device_lock);
  691. bh->b_reqnext = NULL;
  692. if (rw == READ)
  693. bhp = &sh->bh_read[dd_idx];
  694. else
  695. bhp = &sh->bh_write[dd_idx];
  696. while (*bhp) {
  697. printk(KERN_NOTICE "raid5: multiple %d requests for sector %ldn", rw, sh->sector);
  698. bhp = & (*bhp)->b_reqnext;
  699. }
  700. *bhp = bh;
  701. spin_unlock_irq(&conf->device_lock);
  702. spin_unlock(&sh->lock);
  703. PRINTK("added bh b#%lu to stripe s#%lu, disk %d.n", bh->b_blocknr, sh->sector, dd_idx);
  704. }
  705. /*
  706.  * handle_stripe - do things to a stripe.
  707.  *
  708.  * We lock the stripe and then examine the state of various bits
  709.  * to see what needs to be done.
  710.  * Possible results:
  711.  *    return some read request which now have data
  712.  *    return some write requests which are safely on disc
  713.  *    schedule a read on some buffers
  714.  *    schedule a write of some buffers
  715.  *    return confirmation of parity correctness
  716.  *
  717.  * Parity calculations are done inside the stripe lock
  718.  * buffers are taken off read_list or write_list, and bh_cache buffers
  719.  * get BH_Lock set before the stripe lock is released.
  720.  *
  721.  */
  722.  
  723. static void handle_stripe(struct stripe_head *sh)
  724. {
  725. raid5_conf_t *conf = sh->raid_conf;
  726. int disks = conf->raid_disks;
  727. struct buffer_head *return_ok= NULL, *return_fail = NULL;
  728. int action[MD_SB_DISKS];
  729. int i;
  730. int syncing;
  731. int locked=0, uptodate=0, to_read=0, to_write=0, failed=0, written=0;
  732. int failed_num=0;
  733. struct buffer_head *bh;
  734. PRINTK("handling stripe %ld, cnt=%d, pd_idx=%dn", sh->sector, atomic_read(&sh->count), sh->pd_idx);
  735. memset(action, 0, sizeof(action));
  736. spin_lock(&sh->lock);
  737. clear_bit(STRIPE_HANDLE, &sh->state);
  738. clear_bit(STRIPE_DELAYED, &sh->state);
  739. syncing = test_bit(STRIPE_SYNCING, &sh->state);
  740. /* Now to look around and see what can be done */
  741. for (i=disks; i--; ) {
  742. bh = sh->bh_cache[i];
  743. PRINTK("check %d: state 0x%lx read %p write %p written %pn", i, bh->b_state, sh->bh_read[i], sh->bh_write[i], sh->bh_written[i]);
  744. /* maybe we can reply to a read */
  745. if (buffer_uptodate(bh) && sh->bh_read[i]) {
  746. struct buffer_head *rbh, *rbh2;
  747. PRINTK("Return read for disc %dn", i);
  748. spin_lock_irq(&conf->device_lock);
  749. rbh = sh->bh_read[i];
  750. sh->bh_read[i] = NULL;
  751. spin_unlock_irq(&conf->device_lock);
  752. while (rbh) {
  753. char *bdata;
  754. bdata = bh_kmap(rbh);
  755. memcpy(bdata, bh->b_data, bh->b_size);
  756. bh_kunmap(rbh);
  757. rbh2 = rbh->b_reqnext;
  758. rbh->b_reqnext = return_ok;
  759. return_ok = rbh;
  760. rbh = rbh2;
  761. }
  762. }
  763. /* now count some things */
  764. if (buffer_locked(bh)) locked++;
  765. if (buffer_uptodate(bh)) uptodate++;
  766. if (sh->bh_read[i]) to_read++;
  767. if (sh->bh_write[i]) to_write++;
  768. if (sh->bh_written[i]) written++;
  769. if (!conf->disks[i].operational) {
  770. failed++;
  771. failed_num = i;
  772. }
  773. }
  774. PRINTK("locked=%d uptodate=%d to_read=%d to_write=%d failed=%d failed_num=%dn",
  775.        locked, uptodate, to_read, to_write, failed, failed_num);
  776. /* check if the array has lost two devices and, if so, some requests might
  777.  * need to be failed
  778.  */
  779. if (failed > 1 && to_read+to_write) {
  780. for (i=disks; i--; ) {
  781. /* fail all writes first */
  782. if (sh->bh_write[i]) to_write--;
  783. while ((bh = sh->bh_write[i])) {
  784. sh->bh_write[i] = bh->b_reqnext;
  785. bh->b_reqnext = return_fail;
  786. return_fail = bh;
  787. }
  788. /* fail any reads if this device is non-operational */
  789. if (!conf->disks[i].operational) {
  790. spin_lock_irq(&conf->device_lock);
  791. if (sh->bh_read[i]) to_read--;
  792. while ((bh = sh->bh_read[i])) {
  793. sh->bh_read[i] = bh->b_reqnext;
  794. bh->b_reqnext = return_fail;
  795. return_fail = bh;
  796. }
  797. spin_unlock_irq(&conf->device_lock);
  798. }
  799. }
  800. }
  801. if (failed > 1 && syncing) {
  802. md_done_sync(conf->mddev, (sh->size>>9) - sh->sync_redone,0);
  803. clear_bit(STRIPE_SYNCING, &sh->state);
  804. syncing = 0;
  805. }
  806. /* might be able to return some write requests if the parity block
  807.  * is safe, or on a failed drive
  808.  */
  809. bh = sh->bh_cache[sh->pd_idx];
  810. if ( written &&
  811.      ( (conf->disks[sh->pd_idx].operational && !buffer_locked(bh) && buffer_uptodate(bh))
  812.        || (failed == 1 && failed_num == sh->pd_idx))
  813.     ) {
  814.     /* any written block on a uptodate or failed drive can be returned */
  815.     for (i=disks; i--; )
  816. if (sh->bh_written[i]) {
  817.     bh = sh->bh_cache[i];
  818.     if (!conf->disks[sh->pd_idx].operational ||
  819. (!buffer_locked(bh) && buffer_uptodate(bh)) ) {
  820. /* maybe we can return some write requests */
  821. struct buffer_head *wbh, *wbh2;
  822. PRINTK("Return write for disc %dn", i);
  823. wbh = sh->bh_written[i];
  824. sh->bh_written[i] = NULL;
  825. while (wbh) {
  826.     wbh2 = wbh->b_reqnext;
  827.     wbh->b_reqnext = return_ok;
  828.     return_ok = wbh;
  829.     wbh = wbh2;
  830. }
  831.     }
  832. }
  833. }
  834. /* Now we might consider reading some blocks, either to check/generate
  835.  * parity, or to satisfy requests
  836.  */
  837. if (to_read || (syncing && (uptodate+failed < disks))) {
  838. for (i=disks; i--;) {
  839. bh = sh->bh_cache[i];
  840. if (!buffer_locked(bh) && !buffer_uptodate(bh) &&
  841.     (sh->bh_read[i] || syncing || (failed && sh->bh_read[failed_num]))) {
  842. /* we would like to get this block, possibly
  843.  * by computing it, but we might not be able to
  844.  */
  845. if (uptodate == disks-1) {
  846. PRINTK("Computing block %dn", i);
  847. compute_block(sh, i);
  848. uptodate++;
  849. } else if (conf->disks[i].operational) {
  850. set_bit(BH_Lock, &bh->b_state);
  851. action[i] = READ+1;
  852. /* if I am just reading this block and we don't have
  853.    a failed drive, or any pending writes then sidestep the cache */
  854. if (sh->bh_page[i]) BUG();
  855. if (sh->bh_read[i] && !sh->bh_read[i]->b_reqnext &&
  856.     ! syncing && !failed && !to_write) {
  857. sh->bh_page[i] = sh->bh_cache[i]->b_page;
  858. sh->bh_cache[i]->b_page =  sh->bh_read[i]->b_page;
  859. sh->bh_cache[i]->b_data =  sh->bh_read[i]->b_data;
  860. }
  861. locked++;
  862. PRINTK("Reading block %d (sync=%d)n", i, syncing);
  863. if (syncing)
  864. md_sync_acct(conf->disks[i].dev, bh->b_size>>9);
  865. }
  866. }
  867. }
  868. set_bit(STRIPE_HANDLE, &sh->state);
  869. }
  870. /* now to consider writing and what else, if anything should be read */
  871. if (to_write) {
  872. int rmw=0, rcw=0;
  873. for (i=disks ; i--;) {
  874. /* would I have to read this buffer for read_modify_write */
  875. bh = sh->bh_cache[i];
  876. if ((sh->bh_write[i] || i == sh->pd_idx) &&
  877.     (!buffer_locked(bh) || sh->bh_page[i]) &&
  878.     !buffer_uptodate(bh)) {
  879. if (conf->disks[i].operational 
  880. /*     && !(conf->resync_parity && i == sh->pd_idx) */
  881. )
  882. rmw++;
  883. else rmw += 2*disks;  /* cannot read it */
  884. }
  885. /* Would I have to read this buffer for reconstruct_write */
  886. if (!sh->bh_write[i] && i != sh->pd_idx &&
  887.     (!buffer_locked(bh) || sh->bh_page[i]) &&
  888.     !buffer_uptodate(bh)) {
  889. if (conf->disks[i].operational) rcw++;
  890. else rcw += 2*disks;
  891. }
  892. }
  893. PRINTK("for sector %ld, rmw=%d rcw=%dn", sh->sector, rmw, rcw);
  894. set_bit(STRIPE_HANDLE, &sh->state);
  895. if (rmw < rcw && rmw > 0)
  896. /* prefer read-modify-write, but need to get some data */
  897. for (i=disks; i--;) {
  898. bh = sh->bh_cache[i];
  899. if ((sh->bh_write[i] || i == sh->pd_idx) &&
  900.     !buffer_locked(bh) && !buffer_uptodate(bh) &&
  901.     conf->disks[i].operational) {
  902. if (test_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
  903. {
  904. PRINTK("Read_old block %d for r-m-wn", i);
  905. set_bit(BH_Lock, &bh->b_state);
  906. action[i] = READ+1;
  907. locked++;
  908. } else {
  909. set_bit(STRIPE_DELAYED, &sh->state);
  910. set_bit(STRIPE_HANDLE, &sh->state);
  911. }
  912. }
  913. }
  914. if (rcw <= rmw && rcw > 0)
  915. /* want reconstruct write, but need to get some data */
  916. for (i=disks; i--;) {
  917. bh = sh->bh_cache[i];
  918. if (!sh->bh_write[i]  && i != sh->pd_idx &&
  919.     !buffer_locked(bh) && !buffer_uptodate(bh) &&
  920.     conf->disks[i].operational) {
  921. if (test_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
  922. {
  923. PRINTK("Read_old block %d for Reconstructn", i);
  924. set_bit(BH_Lock, &bh->b_state);
  925. action[i] = READ+1;
  926. locked++;
  927. } else {
  928. set_bit(STRIPE_DELAYED, &sh->state);
  929. set_bit(STRIPE_HANDLE, &sh->state);
  930. }
  931. }
  932. }
  933. /* now if nothing is locked, and if we have enough data, we can start a write request */
  934. if (locked == 0 && (rcw == 0 ||rmw == 0)) {
  935. PRINTK("Computing parity...n");
  936. compute_parity(sh, rcw==0 ? RECONSTRUCT_WRITE : READ_MODIFY_WRITE);
  937. /* now every locked buffer is ready to be written */
  938. for (i=disks; i--;)
  939. if (buffer_locked(sh->bh_cache[i])) {
  940. PRINTK("Writing block %dn", i);
  941. locked++;
  942. action[i] = WRITE+1;
  943. if (!conf->disks[i].operational
  944.     || (i==sh->pd_idx && failed == 0))
  945. set_bit(STRIPE_INSYNC, &sh->state);
  946. }
  947. if (test_and_clear_bit(STRIPE_PREREAD_ACTIVE, &sh->state)) {
  948. atomic_dec(&conf->preread_active_stripes);
  949. if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD)
  950. md_wakeup_thread(conf->thread);
  951. }
  952. }
  953. }
  954. /* maybe we need to check and possibly fix the parity for this stripe
  955.  * Any reads will already have been scheduled, so we just see if enough data
  956.  * is available
  957.  */
  958. if (syncing && locked == 0 &&
  959.     !test_bit(STRIPE_INSYNC, &sh->state) && failed <= 1) {
  960. set_bit(STRIPE_HANDLE, &sh->state);
  961. if (failed == 0) {
  962. if (uptodate != disks)
  963. BUG();
  964. compute_parity(sh, CHECK_PARITY);
  965. uptodate--;
  966. bh = sh->bh_cache[sh->pd_idx];
  967. if ((*(u32*)bh->b_data) == 0 &&
  968.     !memcmp(bh->b_data, bh->b_data+4, bh->b_size-4)) {
  969. /* parity is correct (on disc, not in buffer any more) */
  970. set_bit(STRIPE_INSYNC, &sh->state);
  971. }
  972. }
  973. if (!test_bit(STRIPE_INSYNC, &sh->state)) {
  974. struct disk_info *spare;
  975. if (failed==0)
  976. failed_num = sh->pd_idx;
  977. /* should be able to compute the missing block and write it to spare */
  978. if (!buffer_uptodate(sh->bh_cache[failed_num])) {
  979. if (uptodate+1 != disks)
  980. BUG();
  981. compute_block(sh, failed_num);
  982. uptodate++;
  983. }
  984. if (uptodate != disks)
  985. BUG();
  986. bh = sh->bh_cache[failed_num];
  987. set_bit(BH_Lock, &bh->b_state);
  988. action[failed_num] = WRITE+1;
  989. locked++;
  990. set_bit(STRIPE_INSYNC, &sh->state);
  991. if (conf->disks[failed_num].operational)
  992. md_sync_acct(conf->disks[failed_num].dev, bh->b_size>>9);
  993. else if ((spare=conf->spare))
  994. md_sync_acct(spare->dev, bh->b_size>>9);
  995. }
  996. }
  997. if (syncing && locked == 0 && test_bit(STRIPE_INSYNC, &sh->state)) {
  998. md_done_sync(conf->mddev, (sh->size>>9) - sh->sync_redone,1);
  999. clear_bit(STRIPE_SYNCING, &sh->state);
  1000. }
  1001. spin_unlock(&sh->lock);
  1002. while ((bh=return_ok)) {
  1003. return_ok = bh->b_reqnext;
  1004. bh->b_reqnext = NULL;
  1005. bh->b_end_io(bh, 1);
  1006. }
  1007. while ((bh=return_fail)) {
  1008. return_fail = bh->b_reqnext;
  1009. bh->b_reqnext = NULL;
  1010. bh->b_end_io(bh, 0);
  1011. }
  1012. for (i=disks; i-- ;) 
  1013. if (action[i]) {
  1014. struct buffer_head *bh = sh->bh_cache[i];
  1015. struct disk_info *spare = conf->spare;
  1016. int skip = 0;
  1017. if (action[i] == READ+1)
  1018. bh->b_end_io = raid5_end_read_request;
  1019. else
  1020. bh->b_end_io = raid5_end_write_request;
  1021. if (conf->disks[i].operational)
  1022. bh->b_dev = conf->disks[i].dev;
  1023. else if (spare && action[i] == WRITE+1)
  1024. bh->b_dev = spare->dev;
  1025. else skip=1;
  1026. if (!skip) {
  1027. PRINTK("for %ld schedule op %d on disc %dn", sh->sector, action[i]-1, i);
  1028. atomic_inc(&sh->count);
  1029. bh->b_rdev = bh->b_dev;
  1030. bh->b_rsector = bh->b_blocknr * (bh->b_size>>9);
  1031. generic_make_request(action[i]-1, bh);
  1032. } else {
  1033. PRINTK("skip op %d on disc %d for sector %ldn", action[i]-1, i, sh->sector);
  1034. clear_bit(BH_Lock, &bh->b_state);
  1035. set_bit(STRIPE_HANDLE, &sh->state);
  1036. }
  1037. }
  1038. }
  1039. static inline void raid5_activate_delayed(raid5_conf_t *conf)
  1040. {
  1041. if (atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD) {
  1042. while (!list_empty(&conf->delayed_list)) {
  1043. struct list_head *l = conf->delayed_list.next;
  1044. struct stripe_head *sh;
  1045. sh = list_entry(l, struct stripe_head, lru);
  1046. list_del_init(l);
  1047. clear_bit(STRIPE_DELAYED, &sh->state);
  1048. if (!test_and_set_bit(STRIPE_PREREAD_ACTIVE, &sh->state))
  1049. atomic_inc(&conf->preread_active_stripes);
  1050. list_add_tail(&sh->lru, &conf->handle_list);
  1051. }
  1052. }
  1053. }
  1054. static void raid5_unplug_device(void *data)
  1055. {
  1056. raid5_conf_t *conf = (raid5_conf_t *)data;
  1057. unsigned long flags;
  1058. spin_lock_irqsave(&conf->device_lock, flags);
  1059. raid5_activate_delayed(conf);
  1060. conf->plugged = 0;
  1061. md_wakeup_thread(conf->thread);
  1062. spin_unlock_irqrestore(&conf->device_lock, flags);
  1063. }
  1064. static inline void raid5_plug_device(raid5_conf_t *conf)
  1065. {
  1066. spin_lock_irq(&conf->device_lock);
  1067. if (list_empty(&conf->delayed_list))
  1068. if (!conf->plugged) {
  1069. conf->plugged = 1;
  1070. queue_task(&conf->plug_tq, &tq_disk);
  1071. }
  1072. spin_unlock_irq(&conf->device_lock);
  1073. }
  1074. static int raid5_make_request (mddev_t *mddev, int rw, struct buffer_head * bh)
  1075. {
  1076. raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
  1077. const unsigned int raid_disks = conf->raid_disks;
  1078. const unsigned int data_disks = raid_disks - 1;
  1079. unsigned int dd_idx, pd_idx;
  1080. unsigned long new_sector;
  1081. int read_ahead = 0;
  1082. struct stripe_head *sh;
  1083. if (rw == READA) {
  1084. rw = READ;
  1085. read_ahead=1;
  1086. }
  1087. new_sector = raid5_compute_sector(bh->b_rsector,
  1088. raid_disks, data_disks, &dd_idx, &pd_idx, conf);
  1089. PRINTK("raid5_make_request, sector %lun", new_sector);
  1090. sh = get_active_stripe(conf, new_sector, bh->b_size, read_ahead);
  1091. if (sh) {
  1092. sh->pd_idx = pd_idx;
  1093. add_stripe_bh(sh, bh, dd_idx, rw);
  1094. raid5_plug_device(conf);
  1095. handle_stripe(sh);
  1096. release_stripe(sh);
  1097. } else
  1098. bh->b_end_io(bh, test_bit(BH_Uptodate, &bh->b_state));
  1099. return 0;
  1100. }
  1101. /*
  1102.  * Determine correct block size for this device.
  1103.  */
  1104. unsigned int device_bsize (kdev_t dev)
  1105. {
  1106. unsigned int i, correct_size;
  1107. correct_size = BLOCK_SIZE;
  1108. if (blksize_size[MAJOR(dev)]) {
  1109. i = blksize_size[MAJOR(dev)][MINOR(dev)];
  1110. if (i)
  1111. correct_size = i;
  1112. }
  1113. return correct_size;
  1114. }
  1115. static int raid5_sync_request (mddev_t *mddev, unsigned long sector_nr)
  1116. {
  1117. raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
  1118. struct stripe_head *sh;
  1119. int sectors_per_chunk = conf->chunk_size >> 9;
  1120. unsigned long stripe = sector_nr/sectors_per_chunk;
  1121. int chunk_offset = sector_nr % sectors_per_chunk;
  1122. int dd_idx, pd_idx;
  1123. unsigned long first_sector;
  1124. int raid_disks = conf->raid_disks;
  1125. int data_disks = raid_disks-1;
  1126. int redone = 0;
  1127. int bufsize;
  1128. sh = get_active_stripe(conf, sector_nr, 0, 0);
  1129. bufsize = sh->size;
  1130. redone = sector_nr - sh->sector;
  1131. first_sector = raid5_compute_sector(stripe*data_disks*sectors_per_chunk
  1132. + chunk_offset, raid_disks, data_disks, &dd_idx, &pd_idx, conf);
  1133. sh->pd_idx = pd_idx;
  1134. spin_lock(&sh->lock);
  1135. set_bit(STRIPE_SYNCING, &sh->state);
  1136. clear_bit(STRIPE_INSYNC, &sh->state);
  1137. sh->sync_redone = redone;
  1138. spin_unlock(&sh->lock);
  1139. handle_stripe(sh);
  1140. release_stripe(sh);
  1141. return (bufsize>>9)-redone;
  1142. }
  1143. /*
  1144.  * This is our raid5 kernel thread.
  1145.  *
  1146.  * We scan the hash table for stripes which can be handled now.
  1147.  * During the scan, completed stripes are saved for us by the interrupt
  1148.  * handler, so that they will not have to wait for our next wakeup.
  1149.  */
  1150. static void raid5d (void *data)
  1151. {
  1152. struct stripe_head *sh;
  1153. raid5_conf_t *conf = data;
  1154. mddev_t *mddev = conf->mddev;
  1155. int handled;
  1156. PRINTK("+++ raid5d activen");
  1157. handled = 0;
  1158. if (mddev->sb_dirty)
  1159. md_update_sb(mddev);
  1160. md_spin_lock_irq(&conf->device_lock);
  1161. while (1) {
  1162. struct list_head *first;
  1163. if (list_empty(&conf->handle_list) &&
  1164.     atomic_read(&conf->preread_active_stripes) < IO_THRESHOLD &&
  1165.     !conf->plugged &&
  1166.     !list_empty(&conf->delayed_list))
  1167. raid5_activate_delayed(conf);
  1168. if (list_empty(&conf->handle_list))
  1169. break;
  1170. first = conf->handle_list.next;
  1171. sh = list_entry(first, struct stripe_head, lru);
  1172. list_del_init(first);
  1173. atomic_inc(&sh->count);
  1174. if (atomic_read(&sh->count)!= 1)
  1175. BUG();
  1176. md_spin_unlock_irq(&conf->device_lock);
  1177. handled++;
  1178. handle_stripe(sh);
  1179. release_stripe(sh);
  1180. md_spin_lock_irq(&conf->device_lock);
  1181. }
  1182. PRINTK("%d stripes handledn", handled);
  1183. md_spin_unlock_irq(&conf->device_lock);
  1184. PRINTK("--- raid5d inactiven");
  1185. }
  1186. /*
  1187.  * Private kernel thread for parity reconstruction after an unclean
  1188.  * shutdown. Reconstruction on spare drives in case of a failed drive
  1189.  * is done by the generic mdsyncd.
  1190.  */
  1191. static void raid5syncd (void *data)
  1192. {
  1193. raid5_conf_t *conf = data;
  1194. mddev_t *mddev = conf->mddev;
  1195. if (!conf->resync_parity)
  1196. return;
  1197. if (conf->resync_parity == 2)
  1198. return;
  1199. down(&mddev->recovery_sem);
  1200. if (md_do_sync(mddev,NULL)) {
  1201. up(&mddev->recovery_sem);
  1202. printk("raid5: resync aborted!n");
  1203. return;
  1204. }
  1205. conf->resync_parity = 0;
  1206. up(&mddev->recovery_sem);
  1207. printk("raid5: resync finished.n");
  1208. }
  1209. static int raid5_run (mddev_t *mddev)
  1210. {
  1211. raid5_conf_t *conf;
  1212. int i, j, raid_disk, memory;
  1213. mdp_super_t *sb = mddev->sb;
  1214. mdp_disk_t *desc;
  1215. mdk_rdev_t *rdev;
  1216. struct disk_info *disk;
  1217. struct md_list_head *tmp;
  1218. int start_recovery = 0;
  1219. MOD_INC_USE_COUNT;
  1220. if (sb->level != 5 && sb->level != 4) {
  1221. printk("raid5: md%d: raid level not set to 4/5 (%d)n", mdidx(mddev), sb->level);
  1222. MOD_DEC_USE_COUNT;
  1223. return -EIO;
  1224. }
  1225. mddev->private = kmalloc (sizeof (raid5_conf_t), GFP_KERNEL);
  1226. if ((conf = mddev->private) == NULL)
  1227. goto abort;
  1228. memset (conf, 0, sizeof (*conf));
  1229. conf->mddev = mddev;
  1230. if ((conf->stripe_hashtbl = (struct stripe_head **) md__get_free_pages(GFP_ATOMIC, HASH_PAGES_ORDER)) == NULL)
  1231. goto abort;
  1232. memset(conf->stripe_hashtbl, 0, HASH_PAGES * PAGE_SIZE);
  1233. conf->device_lock = MD_SPIN_LOCK_UNLOCKED;
  1234. md_init_waitqueue_head(&conf->wait_for_stripe);
  1235. INIT_LIST_HEAD(&conf->handle_list);
  1236. INIT_LIST_HEAD(&conf->delayed_list);
  1237. INIT_LIST_HEAD(&conf->inactive_list);
  1238. atomic_set(&conf->active_stripes, 0);
  1239. atomic_set(&conf->preread_active_stripes, 0);
  1240. conf->buffer_size = PAGE_SIZE; /* good default for rebuild */
  1241. conf->plugged = 0;
  1242. conf->plug_tq.sync = 0;
  1243. conf->plug_tq.routine = &raid5_unplug_device;
  1244. conf->plug_tq.data = conf;
  1245. PRINTK("raid5_run(md%d) called.n", mdidx(mddev));
  1246. ITERATE_RDEV(mddev,rdev,tmp) {
  1247. /*
  1248.  * This is important -- we are using the descriptor on
  1249.  * the disk only to get a pointer to the descriptor on
  1250.  * the main superblock, which might be more recent.
  1251.  */
  1252. desc = sb->disks + rdev->desc_nr;
  1253. raid_disk = desc->raid_disk;
  1254. disk = conf->disks + raid_disk;
  1255. if (disk_faulty(desc)) {
  1256. printk(KERN_ERR "raid5: disabled device %s (errors detected)n", partition_name(rdev->dev));
  1257. if (!rdev->faulty) {
  1258. MD_BUG();
  1259. goto abort;
  1260. }
  1261. disk->number = desc->number;
  1262. disk->raid_disk = raid_disk;
  1263. disk->dev = rdev->dev;
  1264. disk->operational = 0;
  1265. disk->write_only = 0;
  1266. disk->spare = 0;
  1267. disk->used_slot = 1;
  1268. continue;
  1269. }
  1270. if (disk_active(desc)) {
  1271. if (!disk_sync(desc)) {
  1272. printk(KERN_ERR "raid5: disabled device %s (not in sync)n", partition_name(rdev->dev));
  1273. MD_BUG();
  1274. goto abort;
  1275. }
  1276. if (raid_disk > sb->raid_disks) {
  1277. printk(KERN_ERR "raid5: disabled device %s (inconsistent descriptor)n", partition_name(rdev->dev));
  1278. continue;
  1279. }
  1280. if (disk->operational) {
  1281. printk(KERN_ERR "raid5: disabled device %s (device %d already operational)n", partition_name(rdev->dev), raid_disk);
  1282. continue;
  1283. }
  1284. printk(KERN_INFO "raid5: device %s operational as raid disk %dn", partition_name(rdev->dev), raid_disk);
  1285. disk->number = desc->number;
  1286. disk->raid_disk = raid_disk;
  1287. disk->dev = rdev->dev;
  1288. disk->operational = 1;
  1289. disk->used_slot = 1;
  1290. conf->working_disks++;
  1291. } else {
  1292. /*
  1293.  * Must be a spare disk ..
  1294.  */
  1295. printk(KERN_INFO "raid5: spare disk %sn", partition_name(rdev->dev));
  1296. disk->number = desc->number;
  1297. disk->raid_disk = raid_disk;
  1298. disk->dev = rdev->dev;
  1299. disk->operational = 0;
  1300. disk->write_only = 0;
  1301. disk->spare = 1;
  1302. disk->used_slot = 1;
  1303. }
  1304. }
  1305. for (i = 0; i < MD_SB_DISKS; i++) {
  1306. desc = sb->disks + i;
  1307. raid_disk = desc->raid_disk;
  1308. disk = conf->disks + raid_disk;
  1309. if (disk_faulty(desc) && (raid_disk < sb->raid_disks) &&
  1310. !conf->disks[raid_disk].used_slot) {
  1311. disk->number = desc->number;
  1312. disk->raid_disk = raid_disk;
  1313. disk->dev = MKDEV(0,0);
  1314. disk->operational = 0;
  1315. disk->write_only = 0;
  1316. disk->spare = 0;
  1317. disk->used_slot = 1;
  1318. }
  1319. }
  1320. conf->raid_disks = sb->raid_disks;
  1321. /*
  1322.  * 0 for a fully functional array, 1 for a degraded array.
  1323.  */
  1324. conf->failed_disks = conf->raid_disks - conf->working_disks;
  1325. conf->mddev = mddev;
  1326. conf->chunk_size = sb->chunk_size;
  1327. conf->level = sb->level;
  1328. conf->algorithm = sb->layout;
  1329. conf->max_nr_stripes = NR_STRIPES;
  1330. #if 0
  1331. for (i = 0; i < conf->raid_disks; i++) {
  1332. if (!conf->disks[i].used_slot) {
  1333. MD_BUG();
  1334. goto abort;
  1335. }
  1336. }
  1337. #endif
  1338. if (!conf->chunk_size || conf->chunk_size % 4) {
  1339. printk(KERN_ERR "raid5: invalid chunk size %d for md%dn", conf->chunk_size, mdidx(mddev));
  1340. goto abort;
  1341. }
  1342. if (conf->algorithm > ALGORITHM_RIGHT_SYMMETRIC) {
  1343. printk(KERN_ERR "raid5: unsupported parity algorithm %d for md%dn", conf->algorithm, mdidx(mddev));
  1344. goto abort;
  1345. }
  1346. if (conf->failed_disks > 1) {
  1347. printk(KERN_ERR "raid5: not enough operational devices for md%d (%d/%d failed)n", mdidx(mddev), conf->failed_disks, conf->raid_disks);
  1348. goto abort;
  1349. }
  1350. if (conf->working_disks != sb->raid_disks) {
  1351. printk(KERN_ALERT "raid5: md%d, not all disks are operational -- trying to recover arrayn", mdidx(mddev));
  1352. start_recovery = 1;
  1353. }
  1354. {
  1355. const char * name = "raid5d";
  1356. conf->thread = md_register_thread(raid5d, conf, name);
  1357. if (!conf->thread) {
  1358. printk(KERN_ERR "raid5: couldn't allocate thread for md%dn", mdidx(mddev));
  1359. goto abort;
  1360. }
  1361. }
  1362. memory = conf->max_nr_stripes * (sizeof(struct stripe_head) +
  1363.  conf->raid_disks * ((sizeof(struct buffer_head) + PAGE_SIZE))) / 1024;
  1364. if (grow_stripes(conf, conf->max_nr_stripes, GFP_KERNEL)) {
  1365. printk(KERN_ERR "raid5: couldn't allocate %dkB for buffersn", memory);
  1366. shrink_stripes(conf, conf->max_nr_stripes);
  1367. goto abort;
  1368. } else
  1369. printk(KERN_INFO "raid5: allocated %dkB for md%dn", memory, mdidx(mddev));
  1370. /*
  1371.  * Regenerate the "device is in sync with the raid set" bit for
  1372.  * each device.
  1373.  */
  1374. for (i = 0; i < MD_SB_DISKS ; i++) {
  1375. mark_disk_nonsync(sb->disks + i);
  1376. for (j = 0; j < sb->raid_disks; j++) {
  1377. if (!conf->disks[j].operational)
  1378. continue;
  1379. if (sb->disks[i].number == conf->disks[j].number)
  1380. mark_disk_sync(sb->disks + i);
  1381. }
  1382. }
  1383. sb->active_disks = conf->working_disks;
  1384. if (sb->active_disks == sb->raid_disks)
  1385. printk("raid5: raid level %d set md%d active with %d out of %d devices, algorithm %dn", conf->level, mdidx(mddev), sb->active_disks, sb->raid_disks, conf->algorithm);
  1386. else
  1387. printk(KERN_ALERT "raid5: raid level %d set md%d active with %d out of %d devices, algorithm %dn", conf->level, mdidx(mddev), sb->active_disks, sb->raid_disks, conf->algorithm);
  1388. if (!start_recovery && !(sb->state & (1 << MD_SB_CLEAN))) {
  1389. const char * name = "raid5syncd";
  1390. conf->resync_thread = md_register_thread(raid5syncd, conf,name);
  1391. if (!conf->resync_thread) {
  1392. printk(KERN_ERR "raid5: couldn't allocate thread for md%dn", mdidx(mddev));
  1393. goto abort;
  1394. }
  1395. printk("raid5: raid set md%d not clean; reconstructing parityn", mdidx(mddev));
  1396. conf->resync_parity = 1;
  1397. md_wakeup_thread(conf->resync_thread);
  1398. }
  1399. print_raid5_conf(conf);
  1400. if (start_recovery)
  1401. md_recover_arrays();
  1402. print_raid5_conf(conf);
  1403. /* Ok, everything is just fine now */
  1404. return (0);
  1405. abort:
  1406. if (conf) {
  1407. print_raid5_conf(conf);
  1408. if (conf->stripe_hashtbl)
  1409. free_pages((unsigned long) conf->stripe_hashtbl,
  1410. HASH_PAGES_ORDER);
  1411. kfree(conf);
  1412. }
  1413. mddev->private = NULL;
  1414. printk(KERN_ALERT "raid5: failed to run raid set md%dn", mdidx(mddev));
  1415. MOD_DEC_USE_COUNT;
  1416. return -EIO;
  1417. }
  1418. static int raid5_stop_resync (mddev_t *mddev)
  1419. {
  1420. raid5_conf_t *conf = mddev_to_conf(mddev);
  1421. mdk_thread_t *thread = conf->resync_thread;
  1422. if (thread) {
  1423. if (conf->resync_parity) {
  1424. conf->resync_parity = 2;
  1425. md_interrupt_thread(thread);
  1426. printk(KERN_INFO "raid5: parity resync was not fully finished, restarting next time.n");
  1427. return 1;
  1428. }
  1429. return 0;
  1430. }
  1431. return 0;
  1432. }
  1433. static int raid5_restart_resync (mddev_t *mddev)
  1434. {
  1435. raid5_conf_t *conf = mddev_to_conf(mddev);
  1436. if (conf->resync_parity) {
  1437. if (!conf->resync_thread) {
  1438. MD_BUG();
  1439. return 0;
  1440. }
  1441. printk("raid5: waking up raid5resync.n");
  1442. conf->resync_parity = 1;
  1443. md_wakeup_thread(conf->resync_thread);
  1444. return 1;
  1445. } else
  1446. printk("raid5: no restart-resync needed.n");
  1447. return 0;
  1448. }
  1449. static int raid5_stop (mddev_t *mddev)
  1450. {
  1451. raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
  1452. if (conf->resync_thread)
  1453. md_unregister_thread(conf->resync_thread);
  1454. md_unregister_thread(conf->thread);
  1455. shrink_stripes(conf, conf->max_nr_stripes);
  1456. free_pages((unsigned long) conf->stripe_hashtbl, HASH_PAGES_ORDER);
  1457. kfree(conf);
  1458. mddev->private = NULL;
  1459. MOD_DEC_USE_COUNT;
  1460. return 0;
  1461. }
  1462. #if RAID5_DEBUG
  1463. static void print_sh (struct stripe_head *sh)
  1464. {
  1465. int i;
  1466. printk("sh %lu, size %d, pd_idx %d, state %ld.n", sh->sector, sh->size, sh->pd_idx, sh->state);
  1467. printk("sh %lu,  count %d.n", sh->sector, atomic_read(&sh->count));
  1468. printk("sh %lu, ", sh->sector);
  1469. for (i = 0; i < MD_SB_DISKS; i++) {
  1470. if (sh->bh_cache[i])
  1471. printk("(cache%d: %p %ld) ", i, sh->bh_cache[i], sh->bh_cache[i]->b_state);
  1472. }
  1473. printk("n");
  1474. }
  1475. static void printall (raid5_conf_t *conf)
  1476. {
  1477. struct stripe_head *sh;
  1478. int i;
  1479. md_spin_lock_irq(&conf->device_lock);
  1480. for (i = 0; i < NR_HASH; i++) {
  1481. sh = conf->stripe_hashtbl[i];
  1482. for (; sh; sh = sh->hash_next) {
  1483. if (sh->raid_conf != conf)
  1484. continue;
  1485. print_sh(sh);
  1486. }
  1487. }
  1488. md_spin_unlock_irq(&conf->device_lock);
  1489. PRINTK("--- raid5d inactiven");
  1490. }
  1491. #endif
  1492. static int raid5_status (char *page, mddev_t *mddev)
  1493. {
  1494. raid5_conf_t *conf = (raid5_conf_t *) mddev->private;
  1495. mdp_super_t *sb = mddev->sb;
  1496. int sz = 0, i;
  1497. sz += sprintf (page+sz, " level %d, %dk chunk, algorithm %d", sb->level, sb->chunk_size >> 10, sb->layout);
  1498. sz += sprintf (page+sz, " [%d/%d] [", conf->raid_disks, conf->working_disks);
  1499. for (i = 0; i < conf->raid_disks; i++)
  1500. sz += sprintf (page+sz, "%s", conf->disks[i].operational ? "U" : "_");
  1501. sz += sprintf (page+sz, "]");
  1502. #if RAID5_DEBUG
  1503. #define D(x) 
  1504. sz += sprintf (page+sz, "<"#x":%d>", atomic_read(&conf->x))
  1505. printall(conf);
  1506. #endif
  1507. return sz;
  1508. }
  1509. static void print_raid5_conf (raid5_conf_t *conf)
  1510. {
  1511. int i;
  1512. struct disk_info *tmp;
  1513. printk("RAID5 conf printout:n");
  1514. if (!conf) {
  1515. printk("(conf==NULL)n");
  1516. return;
  1517. }
  1518. printk(" --- rd:%d wd:%d fd:%dn", conf->raid_disks,
  1519.  conf->working_disks, conf->failed_disks);
  1520. #if RAID5_DEBUG
  1521. for (i = 0; i < MD_SB_DISKS; i++) {
  1522. #else
  1523. for (i = 0; i < conf->working_disks+conf->failed_disks; i++) {
  1524. #endif
  1525. tmp = conf->disks + i;
  1526. printk(" disk %d, s:%d, o:%d, n:%d rd:%d us:%d dev:%sn",
  1527. i, tmp->spare,tmp->operational,
  1528. tmp->number,tmp->raid_disk,tmp->used_slot,
  1529. partition_name(tmp->dev));
  1530. }
  1531. }
  1532. static int raid5_diskop(mddev_t *mddev, mdp_disk_t **d, int state)
  1533. {
  1534. int err = 0;
  1535. int i, failed_disk=-1, spare_disk=-1, removed_disk=-1, added_disk=-1;
  1536. raid5_conf_t *conf = mddev->private;
  1537. struct disk_info *tmp, *sdisk, *fdisk, *rdisk, *adisk;
  1538. mdp_super_t *sb = mddev->sb;
  1539. mdp_disk_t *failed_desc, *spare_desc, *added_desc;
  1540. mdk_rdev_t *spare_rdev, *failed_rdev;
  1541. print_raid5_conf(conf);
  1542. md_spin_lock_irq(&conf->device_lock);
  1543. /*
  1544.  * find the disk ...
  1545.  */
  1546. switch (state) {
  1547. case DISKOP_SPARE_ACTIVE:
  1548. /*
  1549.  * Find the failed disk within the RAID5 configuration ...
  1550.  * (this can only be in the first conf->raid_disks part)
  1551.  */
  1552. for (i = 0; i < conf->raid_disks; i++) {
  1553. tmp = conf->disks + i;
  1554. if ((!tmp->operational && !tmp->spare) ||
  1555. !tmp->used_slot) {
  1556. failed_disk = i;
  1557. break;
  1558. }
  1559. }
  1560. /*
  1561.  * When we activate a spare disk we _must_ have a disk in
  1562.  * the lower (active) part of the array to replace.
  1563.  */
  1564. if ((failed_disk == -1) || (failed_disk >= conf->raid_disks)) {
  1565. MD_BUG();
  1566. err = 1;
  1567. goto abort;
  1568. }
  1569. /* fall through */
  1570. case DISKOP_SPARE_WRITE:
  1571. case DISKOP_SPARE_INACTIVE:
  1572. /*
  1573.  * Find the spare disk ... (can only be in the 'high'
  1574.  * area of the array)
  1575.  */
  1576. for (i = conf->raid_disks; i < MD_SB_DISKS; i++) {
  1577. tmp = conf->disks + i;
  1578. if (tmp->spare && tmp->number == (*d)->number) {
  1579. spare_disk = i;
  1580. break;
  1581. }
  1582. }
  1583. if (spare_disk == -1) {
  1584. MD_BUG();
  1585. err = 1;
  1586. goto abort;
  1587. }
  1588. break;
  1589. case DISKOP_HOT_REMOVE_DISK:
  1590. for (i = 0; i < MD_SB_DISKS; i++) {
  1591. tmp = conf->disks + i;
  1592. if (tmp->used_slot && (tmp->number == (*d)->number)) {
  1593. if (tmp->operational) {
  1594. err = -EBUSY;
  1595. goto abort;
  1596. }
  1597. removed_disk = i;
  1598. break;
  1599. }
  1600. }
  1601. if (removed_disk == -1) {
  1602. MD_BUG();
  1603. err = 1;
  1604. goto abort;
  1605. }
  1606. break;
  1607. case DISKOP_HOT_ADD_DISK:
  1608. for (i = conf->raid_disks; i < MD_SB_DISKS; i++) {
  1609. tmp = conf->disks + i;
  1610. if (!tmp->used_slot) {
  1611. added_disk = i;
  1612. break;
  1613. }
  1614. }
  1615. if (added_disk == -1) {
  1616. MD_BUG();
  1617. err = 1;
  1618. goto abort;
  1619. }
  1620. break;
  1621. }
  1622. switch (state) {
  1623. /*
  1624.  * Switch the spare disk to write-only mode:
  1625.  */
  1626. case DISKOP_SPARE_WRITE:
  1627. if (conf->spare) {
  1628. MD_BUG();
  1629. err = 1;
  1630. goto abort;
  1631. }
  1632. sdisk = conf->disks + spare_disk;
  1633. sdisk->operational = 1;
  1634. sdisk->write_only = 1;
  1635. conf->spare = sdisk;
  1636. break;
  1637. /*
  1638.  * Deactivate a spare disk:
  1639.  */
  1640. case DISKOP_SPARE_INACTIVE:
  1641. sdisk = conf->disks + spare_disk;
  1642. sdisk->operational = 0;
  1643. sdisk->write_only = 0;
  1644. /*
  1645.  * Was the spare being resynced?
  1646.  */
  1647. if (conf->spare == sdisk)
  1648. conf->spare = NULL;
  1649. break;
  1650. /*
  1651.  * Activate (mark read-write) the (now sync) spare disk,
  1652.  * which means we switch it's 'raid position' (->raid_disk)
  1653.  * with the failed disk. (only the first 'conf->raid_disks'
  1654.  * slots are used for 'real' disks and we must preserve this
  1655.  * property)
  1656.  */
  1657. case DISKOP_SPARE_ACTIVE:
  1658. if (!conf->spare) {
  1659. MD_BUG();
  1660. err = 1;
  1661. goto abort;
  1662. }
  1663. sdisk = conf->disks + spare_disk;
  1664. fdisk = conf->disks + failed_disk;
  1665. spare_desc = &sb->disks[sdisk->number];
  1666. failed_desc = &sb->disks[fdisk->number];
  1667. if (spare_desc != *d) {
  1668. MD_BUG();
  1669. err = 1;
  1670. goto abort;
  1671. }
  1672. if (spare_desc->raid_disk != sdisk->raid_disk) {
  1673. MD_BUG();
  1674. err = 1;
  1675. goto abort;
  1676. }
  1677. if (sdisk->raid_disk != spare_disk) {
  1678. MD_BUG();
  1679. err = 1;
  1680. goto abort;
  1681. }
  1682. if (failed_desc->raid_disk != fdisk->raid_disk) {
  1683. MD_BUG();
  1684. err = 1;
  1685. goto abort;
  1686. }
  1687. if (fdisk->raid_disk != failed_disk) {
  1688. MD_BUG();
  1689. err = 1;
  1690. goto abort;
  1691. }
  1692. /*
  1693.  * do the switch finally
  1694.  */
  1695. spare_rdev = find_rdev_nr(mddev, spare_desc->number);
  1696. failed_rdev = find_rdev_nr(mddev, failed_desc->number);
  1697. /* There must be a spare_rdev, but there may not be a
  1698.  * failed_rdev.  That slot might be empty...
  1699.  */
  1700. spare_rdev->desc_nr = failed_desc->number;
  1701. if (failed_rdev)
  1702. failed_rdev->desc_nr = spare_desc->number;
  1703. xchg_values(*spare_desc, *failed_desc);
  1704. xchg_values(*fdisk, *sdisk);
  1705. /*
  1706.  * (careful, 'failed' and 'spare' are switched from now on)
  1707.  *
  1708.  * we want to preserve linear numbering and we want to
  1709.  * give the proper raid_disk number to the now activated
  1710.  * disk. (this means we switch back these values)
  1711.  */
  1712. xchg_values(spare_desc->raid_disk, failed_desc->raid_disk);
  1713. xchg_values(sdisk->raid_disk, fdisk->raid_disk);
  1714. xchg_values(spare_desc->number, failed_desc->number);
  1715. xchg_values(sdisk->number, fdisk->number);
  1716. *d = failed_desc;
  1717. if (sdisk->dev == MKDEV(0,0))
  1718. sdisk->used_slot = 0;
  1719. /*
  1720.  * this really activates the spare.
  1721.  */
  1722. fdisk->spare = 0;
  1723. fdisk->write_only = 0;
  1724. /*
  1725.  * if we activate a spare, we definitely replace a
  1726.  * non-operational disk slot in the 'low' area of
  1727.  * the disk array.
  1728.  */
  1729. conf->failed_disks--;
  1730. conf->working_disks++;
  1731. conf->spare = NULL;
  1732. break;
  1733. case DISKOP_HOT_REMOVE_DISK:
  1734. rdisk = conf->disks + removed_disk;
  1735. if (rdisk->spare && (removed_disk < conf->raid_disks)) {
  1736. MD_BUG();
  1737. err = 1;
  1738. goto abort;
  1739. }
  1740. rdisk->dev = MKDEV(0,0);
  1741. rdisk->used_slot = 0;
  1742. break;
  1743. case DISKOP_HOT_ADD_DISK:
  1744. adisk = conf->disks + added_disk;
  1745. added_desc = *d;
  1746. if (added_disk != added_desc->number) {
  1747. MD_BUG();
  1748. err = 1;
  1749. goto abort;
  1750. }
  1751. adisk->number = added_desc->number;
  1752. adisk->raid_disk = added_desc->raid_disk;
  1753. adisk->dev = MKDEV(added_desc->major,added_desc->minor);
  1754. adisk->operational = 0;
  1755. adisk->write_only = 0;
  1756. adisk->spare = 1;
  1757. adisk->used_slot = 1;
  1758. break;
  1759. default:
  1760. MD_BUG();
  1761. err = 1;
  1762. goto abort;
  1763. }
  1764. abort:
  1765. md_spin_unlock_irq(&conf->device_lock);
  1766. print_raid5_conf(conf);
  1767. return err;
  1768. }
  1769. static mdk_personality_t raid5_personality=
  1770. {
  1771. name: "raid5",
  1772. make_request: raid5_make_request,
  1773. run: raid5_run,
  1774. stop: raid5_stop,
  1775. status: raid5_status,
  1776. error_handler: raid5_error,
  1777. diskop: raid5_diskop,
  1778. stop_resync: raid5_stop_resync,
  1779. restart_resync: raid5_restart_resync,
  1780. sync_request: raid5_sync_request
  1781. };
  1782. static int md__init raid5_init (void)
  1783. {
  1784. return register_md_personality (RAID5, &raid5_personality);
  1785. }
  1786. static void raid5_exit (void)
  1787. {
  1788. unregister_md_personality (RAID5);
  1789. }
  1790. module_init(raid5_init);
  1791. module_exit(raid5_exit);
  1792. MODULE_LICENSE("GPL");