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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * multipath.c : Multiple Devices driver for Linux
  3.  *
  4.  * Copyright (C) 1999, 2000, 2001 Ingo Molnar, Red Hat
  5.  *
  6.  * Copyright (C) 1996, 1997, 1998 Ingo Molnar, Miguel de Icaza, Gadi Oxman
  7.  *
  8.  * MULTIPATH management functions.
  9.  *
  10.  * derived from raid1.c.
  11.  *
  12.  * This program is free software; you can redistribute it and/or modify
  13.  * it under the terms of the GNU General Public License as published by
  14.  * the Free Software Foundation; either version 2, or (at your option)
  15.  * any later version.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * (for example /usr/src/linux/COPYING); if not, write to the Free
  19.  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20.  */
  21. #include <linux/module.h>
  22. #include <linux/slab.h>
  23. #include <linux/raid/multipath.h>
  24. #include <asm/atomic.h>
  25. #define MAJOR_NR MD_MAJOR
  26. #define MD_DRIVER
  27. #define MD_PERSONALITY
  28. #define MAX_WORK_PER_DISK 128
  29. #define NR_RESERVED_BUFS 32
  30. /*
  31.  * The following can be used to debug the driver
  32.  */
  33. #define MULTIPATH_DEBUG 0
  34. #if MULTIPATH_DEBUG
  35. #define PRINTK(x...)   printk(x)
  36. #define inline
  37. #define __inline__
  38. #else
  39. #define PRINTK(x...)  do { } while (0)
  40. #endif
  41. static mdk_personality_t multipath_personality;
  42. static md_spinlock_t retry_list_lock = MD_SPIN_LOCK_UNLOCKED;
  43. struct multipath_bh *multipath_retry_list = NULL, **multipath_retry_tail;
  44. static int multipath_diskop(mddev_t *mddev, mdp_disk_t **d, int state);
  45. static struct multipath_bh *multipath_alloc_mpbh(multipath_conf_t *conf)
  46. {
  47. struct multipath_bh *mp_bh = NULL;
  48. do {
  49. md_spin_lock_irq(&conf->device_lock);
  50. if (!conf->freer1_blocked && conf->freer1) {
  51. mp_bh = conf->freer1;
  52. conf->freer1 = mp_bh->next_mp;
  53. conf->freer1_cnt--;
  54. mp_bh->next_mp = NULL;
  55. mp_bh->state = (1 << MPBH_PreAlloc);
  56. mp_bh->bh_req.b_state = 0;
  57. }
  58. md_spin_unlock_irq(&conf->device_lock);
  59. if (mp_bh)
  60. return mp_bh;
  61. mp_bh = (struct multipath_bh *) kmalloc(sizeof(struct multipath_bh),
  62. GFP_NOIO);
  63. if (mp_bh) {
  64. memset(mp_bh, 0, sizeof(*mp_bh));
  65. return mp_bh;
  66. }
  67. conf->freer1_blocked = 1;
  68. wait_disk_event(conf->wait_buffer,
  69. !conf->freer1_blocked ||
  70. conf->freer1_cnt > NR_RESERVED_BUFS/2
  71.     );
  72. conf->freer1_blocked = 0;
  73. } while (1);
  74. }
  75. static inline void multipath_free_mpbh(struct multipath_bh *mp_bh)
  76. {
  77. multipath_conf_t *conf = mddev_to_conf(mp_bh->mddev);
  78. if (test_bit(MPBH_PreAlloc, &mp_bh->state)) {
  79. unsigned long flags;
  80. spin_lock_irqsave(&conf->device_lock, flags);
  81. mp_bh->next_mp = conf->freer1;
  82. conf->freer1 = mp_bh;
  83. conf->freer1_cnt++;
  84. spin_unlock_irqrestore(&conf->device_lock, flags);
  85. wake_up(&conf->wait_buffer);
  86. } else {
  87. kfree(mp_bh);
  88. }
  89. }
  90. static int multipath_grow_mpbh (multipath_conf_t *conf, int cnt)
  91. {
  92. int i = 0;
  93. while (i < cnt) {
  94. struct multipath_bh *mp_bh;
  95. mp_bh = (struct multipath_bh*)kmalloc(sizeof(*mp_bh), GFP_KERNEL);
  96. if (!mp_bh)
  97. break;
  98. memset(mp_bh, 0, sizeof(*mp_bh));
  99. set_bit(MPBH_PreAlloc, &mp_bh->state);
  100. mp_bh->mddev = conf->mddev;        
  101. multipath_free_mpbh(mp_bh);
  102. i++;
  103. }
  104. return i;
  105. }
  106. static void multipath_shrink_mpbh(multipath_conf_t *conf)
  107. {
  108. md_spin_lock_irq(&conf->device_lock);
  109. while (conf->freer1) {
  110. struct multipath_bh *mp_bh = conf->freer1;
  111. conf->freer1 = mp_bh->next_mp;
  112. conf->freer1_cnt--;
  113. kfree(mp_bh);
  114. }
  115. md_spin_unlock_irq(&conf->device_lock);
  116. }
  117. static int multipath_map (mddev_t *mddev, kdev_t *rdev)
  118. {
  119. multipath_conf_t *conf = mddev_to_conf(mddev);
  120. int i, disks = MD_SB_DISKS;
  121. /*
  122.  * Later we do read balancing on the read side 
  123.  * now we use the first available disk.
  124.  */
  125. for (i = 0; i < disks; i++) {
  126. if (conf->multipaths[i].operational) {
  127. *rdev = conf->multipaths[i].dev;
  128. return (0);
  129. }
  130. }
  131. printk (KERN_ERR "multipath_map(): no more operational IO paths?n");
  132. return (-1);
  133. }
  134. static void multipath_reschedule_retry (struct multipath_bh *mp_bh)
  135. {
  136. unsigned long flags;
  137. mddev_t *mddev = mp_bh->mddev;
  138. multipath_conf_t *conf = mddev_to_conf(mddev);
  139. md_spin_lock_irqsave(&retry_list_lock, flags);
  140. if (multipath_retry_list == NULL)
  141. multipath_retry_tail = &multipath_retry_list;
  142. *multipath_retry_tail = mp_bh;
  143. multipath_retry_tail = &mp_bh->next_mp;
  144. mp_bh->next_mp = NULL;
  145. md_spin_unlock_irqrestore(&retry_list_lock, flags);
  146. md_wakeup_thread(conf->thread);
  147. }
  148. /*
  149.  * multipath_end_bh_io() is called when we have finished servicing a multipathed
  150.  * operation and are ready to return a success/failure code to the buffer
  151.  * cache layer.
  152.  */
  153. static void multipath_end_bh_io (struct multipath_bh *mp_bh, int uptodate)
  154. {
  155. struct buffer_head *bh = mp_bh->master_bh;
  156. bh->b_end_io(bh, uptodate);
  157. multipath_free_mpbh(mp_bh);
  158. }
  159. void multipath_end_request (struct buffer_head *bh, int uptodate)
  160. {
  161. struct multipath_bh * mp_bh = (struct multipath_bh *)(bh->b_private);
  162. /*
  163.  * this branch is our 'one multipath IO has finished' event handler:
  164.  */
  165. if (!uptodate)
  166. md_error (mp_bh->mddev, bh->b_dev);
  167. else
  168. /*
  169.  * Set MPBH_Uptodate in our master buffer_head, so that
  170.  * we will return a good error code for to the higher
  171.  * levels even if IO on some other multipathed buffer fails.
  172.  *
  173.  * The 'master' represents the complex operation to 
  174.  * user-side. So if something waits for IO, then it will
  175.  * wait for the 'master' buffer_head.
  176.  */
  177. set_bit (MPBH_Uptodate, &mp_bh->state);
  178. if (uptodate) {
  179. multipath_end_bh_io(mp_bh, uptodate);
  180. return;
  181. }
  182. /*
  183.  * oops, IO error:
  184.  */
  185. printk(KERN_ERR "multipath: %s: rescheduling block %lun", 
  186.  partition_name(bh->b_dev), bh->b_blocknr);
  187. multipath_reschedule_retry(mp_bh);
  188. return;
  189. }
  190. /*
  191.  * This routine returns the disk from which the requested read should
  192.  * be done.
  193.  */
  194. static int multipath_read_balance (multipath_conf_t *conf)
  195. {
  196. int disk;
  197. for (disk = 0; disk < conf->raid_disks; disk++)
  198. if (conf->multipaths[disk].operational)
  199. return disk;
  200. BUG();
  201. return 0;
  202. }
  203. static int multipath_make_request (mddev_t *mddev, int rw,
  204.        struct buffer_head * bh)
  205. {
  206. multipath_conf_t *conf = mddev_to_conf(mddev);
  207. struct buffer_head *bh_req;
  208. struct multipath_bh * mp_bh;
  209. struct multipath_info *multipath;
  210. if (!buffer_locked(bh))
  211. BUG();
  212. /*
  213.  * make_request() can abort the operation when READA is being
  214.  * used and no empty request is available.
  215.  *
  216.  * Currently, just replace the command with READ/WRITE.
  217.  */
  218. if (rw == READA)
  219. rw = READ;
  220. mp_bh = multipath_alloc_mpbh (conf);
  221. mp_bh->master_bh = bh;
  222. mp_bh->mddev = mddev;
  223. mp_bh->cmd = rw;
  224. /*
  225.  * read balancing logic:
  226.  */
  227. multipath = conf->multipaths + multipath_read_balance(conf);
  228. bh_req = &mp_bh->bh_req;
  229. memcpy(bh_req, bh, sizeof(*bh));
  230. bh_req->b_blocknr = bh->b_rsector;
  231. bh_req->b_dev = multipath->dev;
  232. bh_req->b_rdev = multipath->dev;
  233. /* bh_req->b_rsector = bh->n_rsector; */
  234. bh_req->b_end_io = multipath_end_request;
  235. bh_req->b_private = mp_bh;
  236. generic_make_request (rw, bh_req);
  237. return 0;
  238. }
  239. static int multipath_status (char *page, mddev_t *mddev)
  240. {
  241. multipath_conf_t *conf = mddev_to_conf(mddev);
  242. int sz = 0, i;
  243. sz += sprintf (page+sz, " [%d/%d] [", conf->raid_disks,
  244.  conf->working_disks);
  245. for (i = 0; i < conf->raid_disks; i++)
  246. sz += sprintf (page+sz, "%s",
  247. conf->multipaths[i].operational ? "U" : "_");
  248. sz += sprintf (page+sz, "]");
  249. return sz;
  250. }
  251. #define LAST_DISK KERN_ALERT 
  252. "multipath: only one IO path left and IO error.n"
  253. #define NO_SPARE_DISK KERN_ALERT 
  254. "multipath: no spare IO path left!n"
  255. #define DISK_FAILED KERN_ALERT 
  256. "multipath: IO failure on %s, disabling IO path. n" 
  257. " Operation continuing on %d IO paths.n"
  258. static void mark_disk_bad (mddev_t *mddev, int failed)
  259. {
  260. multipath_conf_t *conf = mddev_to_conf(mddev);
  261. struct multipath_info *multipath = conf->multipaths+failed;
  262. mdp_super_t *sb = mddev->sb;
  263. multipath->operational = 0;
  264. mark_disk_faulty(sb->disks+multipath->number);
  265. mark_disk_nonsync(sb->disks+multipath->number);
  266. mark_disk_inactive(sb->disks+multipath->number);
  267. sb->active_disks--;
  268. sb->working_disks--;
  269. sb->failed_disks++;
  270. mddev->sb_dirty = 1;
  271. md_wakeup_thread(conf->thread);
  272. conf->working_disks--;
  273. printk (DISK_FAILED, partition_name (multipath->dev),
  274.  conf->working_disks);
  275. }
  276. /*
  277.  * Careful, this can execute in IRQ contexts as well!
  278.  */
  279. static int multipath_error (mddev_t *mddev, kdev_t dev)
  280. {
  281. multipath_conf_t *conf = mddev_to_conf(mddev);
  282. struct multipath_info * multipaths = conf->multipaths;
  283. int disks = MD_SB_DISKS;
  284. int other_paths = 1;
  285. int i;
  286. if (conf->working_disks == 1) {
  287. other_paths = 0;
  288. for (i = 0; i < disks; i++) {
  289. if (multipaths[i].spare) {
  290. other_paths = 1;
  291. break;
  292. }
  293. }
  294. }
  295. if (!other_paths) {
  296. /*
  297.  * Uh oh, we can do nothing if this is our last path, but
  298.  * first check if this is a queued request for a device
  299.  * which has just failed.
  300.  */
  301. for (i = 0; i < disks; i++) {
  302. if (multipaths[i].dev==dev && !multipaths[i].operational)
  303. return 0;
  304. }
  305. printk (LAST_DISK);
  306. } else {
  307. /*
  308.  * Mark disk as unusable
  309.  */
  310. for (i = 0; i < disks; i++) {
  311. if (multipaths[i].dev==dev && multipaths[i].operational) {
  312. mark_disk_bad(mddev, i);
  313. break;
  314. }
  315. }
  316. if (!conf->working_disks) {
  317. int err = 1;
  318. mdp_disk_t *spare;
  319. mdp_super_t *sb = mddev->sb;
  320. spare = get_spare(mddev);
  321. if (spare) {
  322. err = multipath_diskop(mddev, &spare, DISKOP_SPARE_WRITE);
  323. printk("got DISKOP_SPARE_WRITE err: %d. (spare_faulty(): %d)n", err, disk_faulty(spare));
  324. }
  325. if (!err && !disk_faulty(spare)) {
  326. multipath_diskop(mddev, &spare, DISKOP_SPARE_ACTIVE);
  327. mark_disk_sync(spare);
  328. mark_disk_active(spare);
  329. sb->active_disks++;
  330. sb->spare_disks--;
  331. }
  332. }
  333. }
  334. return 0;
  335. }
  336. #undef LAST_DISK
  337. #undef NO_SPARE_DISK
  338. #undef DISK_FAILED
  339. static void print_multipath_conf (multipath_conf_t *conf)
  340. {
  341. int i;
  342. struct multipath_info *tmp;
  343. printk("MULTIPATH conf printout:n");
  344. if (!conf) {
  345. printk("(conf==NULL)n");
  346. return;
  347. }
  348. printk(" --- wd:%d rd:%d nd:%dn", conf->working_disks,
  349.  conf->raid_disks, conf->nr_disks);
  350. for (i = 0; i < MD_SB_DISKS; i++) {
  351. tmp = conf->multipaths + i;
  352. if (tmp->spare || tmp->operational || tmp->number ||
  353. tmp->raid_disk || tmp->used_slot)
  354. printk(" disk%d, s:%d, o:%d, n:%d rd:%d us:%d dev:%sn",
  355. i, tmp->spare,tmp->operational,
  356. tmp->number,tmp->raid_disk,tmp->used_slot,
  357. partition_name(tmp->dev));
  358. }
  359. }
  360. static int multipath_diskop(mddev_t *mddev, mdp_disk_t **d, int state)
  361. {
  362. int err = 0;
  363. int i, failed_disk=-1, spare_disk=-1, removed_disk=-1, added_disk=-1;
  364. multipath_conf_t *conf = mddev->private;
  365. struct multipath_info *tmp, *sdisk, *fdisk, *rdisk, *adisk;
  366. mdp_super_t *sb = mddev->sb;
  367. mdp_disk_t *failed_desc, *spare_desc, *added_desc;
  368. mdk_rdev_t *spare_rdev, *failed_rdev;
  369. print_multipath_conf(conf);
  370. md_spin_lock_irq(&conf->device_lock);
  371. /*
  372.  * find the disk ...
  373.  */
  374. switch (state) {
  375. case DISKOP_SPARE_ACTIVE:
  376. /*
  377.  * Find the failed disk within the MULTIPATH configuration ...
  378.  * (this can only be in the first conf->working_disks part)
  379.  */
  380. for (i = 0; i < conf->raid_disks; i++) {
  381. tmp = conf->multipaths + i;
  382. if ((!tmp->operational && !tmp->spare) ||
  383. !tmp->used_slot) {
  384. failed_disk = i;
  385. break;
  386. }
  387. }
  388. /*
  389.  * When we activate a spare disk we _must_ have a disk in
  390.  * the lower (active) part of the array to replace. 
  391.  */
  392. if ((failed_disk == -1) || (failed_disk >= conf->raid_disks)) {
  393. MD_BUG();
  394. err = 1;
  395. goto abort;
  396. }
  397. /* fall through */
  398. case DISKOP_SPARE_WRITE:
  399. case DISKOP_SPARE_INACTIVE:
  400. /*
  401.  * Find the spare disk ... (can only be in the 'high'
  402.  * area of the array)
  403.  */
  404. for (i = conf->raid_disks; i < MD_SB_DISKS; i++) {
  405. tmp = conf->multipaths + i;
  406. if (tmp->spare && tmp->number == (*d)->number) {
  407. spare_disk = i;
  408. break;
  409. }
  410. }
  411. if (spare_disk == -1) {
  412. MD_BUG();
  413. err = 1;
  414. goto abort;
  415. }
  416. break;
  417. case DISKOP_HOT_REMOVE_DISK:
  418. for (i = 0; i < MD_SB_DISKS; i++) {
  419. tmp = conf->multipaths + i;
  420. if (tmp->used_slot && (tmp->number == (*d)->number)) {
  421. if (tmp->operational) {
  422. printk(KERN_ERR "hot-remove-disk, slot %d is identified to be the requested disk (number %d), but is still operational!n", i, (*d)->number);
  423. err = -EBUSY;
  424. goto abort;
  425. }
  426. removed_disk = i;
  427. break;
  428. }
  429. }
  430. if (removed_disk == -1) {
  431. MD_BUG();
  432. err = 1;
  433. goto abort;
  434. }
  435. break;
  436. case DISKOP_HOT_ADD_DISK:
  437. for (i = conf->raid_disks; i < MD_SB_DISKS; i++) {
  438. tmp = conf->multipaths + i;
  439. if (!tmp->used_slot) {
  440. added_disk = i;
  441. break;
  442. }
  443. }
  444. if (added_disk == -1) {
  445. MD_BUG();
  446. err = 1;
  447. goto abort;
  448. }
  449. break;
  450. }
  451. switch (state) {
  452. /*
  453.  * Switch the spare disk to write-only mode:
  454.  */
  455. case DISKOP_SPARE_WRITE:
  456. sdisk = conf->multipaths + spare_disk;
  457. sdisk->operational = 1;
  458. break;
  459. /*
  460.  * Deactivate a spare disk:
  461.  */
  462. case DISKOP_SPARE_INACTIVE:
  463. sdisk = conf->multipaths + spare_disk;
  464. sdisk->operational = 0;
  465. break;
  466. /*
  467.  * Activate (mark read-write) the (now sync) spare disk,
  468.  * which means we switch it's 'raid position' (->raid_disk)
  469.  * with the failed disk. (only the first 'conf->nr_disks'
  470.  * slots are used for 'real' disks and we must preserve this
  471.  * property)
  472.  */
  473. case DISKOP_SPARE_ACTIVE:
  474. sdisk = conf->multipaths + spare_disk;
  475. fdisk = conf->multipaths + failed_disk;
  476. spare_desc = &sb->disks[sdisk->number];
  477. failed_desc = &sb->disks[fdisk->number];
  478. if (spare_desc != *d) {
  479. MD_BUG();
  480. err = 1;
  481. goto abort;
  482. }
  483. if (spare_desc->raid_disk != sdisk->raid_disk) {
  484. MD_BUG();
  485. err = 1;
  486. goto abort;
  487. }
  488. if (sdisk->raid_disk != spare_disk) {
  489. MD_BUG();
  490. err = 1;
  491. goto abort;
  492. }
  493. if (failed_desc->raid_disk != fdisk->raid_disk) {
  494. MD_BUG();
  495. err = 1;
  496. goto abort;
  497. }
  498. if (fdisk->raid_disk != failed_disk) {
  499. MD_BUG();
  500. err = 1;
  501. goto abort;
  502. }
  503. /*
  504.  * do the switch finally
  505.  */
  506. spare_rdev = find_rdev_nr(mddev, spare_desc->number);
  507. failed_rdev = find_rdev_nr(mddev, failed_desc->number);
  508. xchg_values(spare_rdev->desc_nr, failed_rdev->desc_nr);
  509. spare_rdev->alias_device = 0;
  510. failed_rdev->alias_device = 1;
  511. xchg_values(*spare_desc, *failed_desc);
  512. xchg_values(*fdisk, *sdisk);
  513. /*
  514.  * (careful, 'failed' and 'spare' are switched from now on)
  515.  *
  516.  * we want to preserve linear numbering and we want to
  517.  * give the proper raid_disk number to the now activated
  518.  * disk. (this means we switch back these values)
  519.  */
  520. xchg_values(spare_desc->raid_disk, failed_desc->raid_disk);
  521. xchg_values(sdisk->raid_disk, fdisk->raid_disk);
  522. xchg_values(spare_desc->number, failed_desc->number);
  523. xchg_values(sdisk->number, fdisk->number);
  524. *d = failed_desc;
  525. if (sdisk->dev == MKDEV(0,0))
  526. sdisk->used_slot = 0;
  527. /*
  528.  * this really activates the spare.
  529.  */
  530. fdisk->spare = 0;
  531. /*
  532.  * if we activate a spare, we definitely replace a
  533.  * non-operational disk slot in the 'low' area of
  534.  * the disk array.
  535.  */
  536. conf->working_disks++;
  537. break;
  538. case DISKOP_HOT_REMOVE_DISK:
  539. rdisk = conf->multipaths + removed_disk;
  540. if (rdisk->spare && (removed_disk < conf->raid_disks)) {
  541. MD_BUG();
  542. err = 1;
  543. goto abort;
  544. }
  545. rdisk->dev = MKDEV(0,0);
  546. rdisk->used_slot = 0;
  547. conf->nr_disks--;
  548. break;
  549. case DISKOP_HOT_ADD_DISK:
  550. adisk = conf->multipaths + added_disk;
  551. added_desc = *d;
  552. if (added_disk != added_desc->number) {
  553. MD_BUG();
  554. err = 1;
  555. goto abort;
  556. }
  557. adisk->number = added_desc->number;
  558. adisk->raid_disk = added_desc->raid_disk;
  559. adisk->dev = MKDEV(added_desc->major,added_desc->minor);
  560. adisk->operational = 0;
  561. adisk->spare = 1;
  562. adisk->used_slot = 1;
  563. conf->nr_disks++;
  564. break;
  565. default:
  566. MD_BUG();
  567. err = 1;
  568. goto abort;
  569. }
  570. abort:
  571. md_spin_unlock_irq(&conf->device_lock);
  572. print_multipath_conf(conf);
  573. return err;
  574. }
  575. #define IO_ERROR KERN_ALERT 
  576. "multipath: %s: unrecoverable IO read error for block %lun"
  577. #define REDIRECT_SECTOR KERN_ERR 
  578. "multipath: %s: redirecting sector %lu to another IO pathn"
  579. /*
  580.  * This is a kernel thread which:
  581.  *
  582.  * 1. Retries failed read operations on working multipaths.
  583.  * 2. Updates the raid superblock when problems encounter.
  584.  * 3. Performs writes following reads for array syncronising.
  585.  */
  586. static void multipathd (void *data)
  587. {
  588. struct multipath_bh *mp_bh;
  589. struct buffer_head *bh;
  590. unsigned long flags;
  591. mddev_t *mddev;
  592. kdev_t dev;
  593. for (;;) {
  594. md_spin_lock_irqsave(&retry_list_lock, flags);
  595. mp_bh = multipath_retry_list;
  596. if (!mp_bh)
  597. break;
  598. multipath_retry_list = mp_bh->next_mp;
  599. md_spin_unlock_irqrestore(&retry_list_lock, flags);
  600. mddev = mp_bh->mddev;
  601. if (mddev->sb_dirty)
  602. md_update_sb(mddev);
  603. bh = &mp_bh->bh_req;
  604. dev = bh->b_dev;
  605. multipath_map (mddev, &bh->b_dev);
  606. if (bh->b_dev == dev) {
  607. printk (IO_ERROR, partition_name(bh->b_dev), bh->b_blocknr);
  608. multipath_end_bh_io(mp_bh, 0);
  609. } else {
  610. printk (REDIRECT_SECTOR,
  611. partition_name(bh->b_dev), bh->b_blocknr);
  612. bh->b_rdev = bh->b_dev;
  613. bh->b_rsector = bh->b_blocknr;
  614. generic_make_request (mp_bh->cmd, bh);
  615. }
  616. }
  617. md_spin_unlock_irqrestore(&retry_list_lock, flags);
  618. }
  619. #undef IO_ERROR
  620. #undef REDIRECT_SECTOR
  621. /*
  622.  * This will catch the scenario in which one of the multipaths was
  623.  * mounted as a normal device rather than as a part of a raid set.
  624.  *
  625.  * check_consistency is very personality-dependent, eg. RAID5 cannot
  626.  * do this check, it uses another method.
  627.  */
  628. static int __check_consistency (mddev_t *mddev, int row)
  629. {
  630. multipath_conf_t *conf = mddev_to_conf(mddev);
  631. int disks = MD_SB_DISKS;
  632. kdev_t dev;
  633. struct buffer_head *bh = NULL;
  634. int i, rc = 0;
  635. char *buffer = NULL;
  636. for (i = 0; i < disks; i++) {
  637. if (!conf->multipaths[i].operational)
  638. continue;
  639. printk("(checking disk %d)n",i);
  640. dev = conf->multipaths[i].dev;
  641. set_blocksize(dev, 4096);
  642. if ((bh = bread(dev, row / 4, 4096)) == NULL)
  643. break;
  644. if (!buffer) {
  645. buffer = (char *) __get_free_page(GFP_KERNEL);
  646. if (!buffer)
  647. break;
  648. memcpy(buffer, bh->b_data, 4096);
  649. } else if (memcmp(buffer, bh->b_data, 4096)) {
  650. rc = 1;
  651. break;
  652. }
  653. bforget(bh);
  654. fsync_dev(dev);
  655. invalidate_buffers(dev);
  656. bh = NULL;
  657. }
  658. if (buffer)
  659. free_page((unsigned long) buffer);
  660. if (bh) {
  661. dev = bh->b_dev;
  662. bforget(bh);
  663. fsync_dev(dev);
  664. invalidate_buffers(dev);
  665. }
  666. return rc;
  667. }
  668. static int check_consistency (mddev_t *mddev)
  669. {
  670. if (__check_consistency(mddev, 0))
  671. /*
  672.  * we do not do this currently, as it's perfectly possible to
  673.  * have an inconsistent array when it's freshly created. Only
  674.  * newly written data has to be consistent.
  675.  */
  676. return 0;
  677. return 0;
  678. }
  679. #define INVALID_LEVEL KERN_WARNING 
  680. "multipath: md%d: raid level not set to multipath IO (%d)n"
  681. #define NO_SB KERN_ERR 
  682. "multipath: disabled IO path %s (couldn't access raid superblock)n"
  683. #define ERRORS KERN_ERR 
  684. "multipath: disabled IO path %s (errors detected)n"
  685. #define NOT_IN_SYNC KERN_ERR 
  686. "multipath: making IO path %s a spare path (not in sync)n"
  687. #define INCONSISTENT KERN_ERR 
  688. "multipath: disabled IO path %s (inconsistent descriptor)n"
  689. #define ALREADY_RUNNING KERN_ERR 
  690. "multipath: disabled IO path %s (multipath %d already operational)n"
  691. #define OPERATIONAL KERN_INFO 
  692. "multipath: device %s operational as IO path %dn"
  693. #define MEM_ERROR KERN_ERR 
  694. "multipath: couldn't allocate memory for md%dn"
  695. #define SPARE KERN_INFO 
  696. "multipath: spare IO path %sn"
  697. #define NONE_OPERATIONAL KERN_ERR 
  698. "multipath: no operational IO paths for md%dn"
  699. #define SB_DIFFERENCES KERN_ERR 
  700. "multipath: detected IO path differences!n"
  701. #define ARRAY_IS_ACTIVE KERN_INFO 
  702. "multipath: array md%d active with %d out of %d IO paths (%d spare IO paths)n"
  703. #define THREAD_ERROR KERN_ERR 
  704. "multipath: couldn't allocate thread for md%dn"
  705. static int multipath_run (mddev_t *mddev)
  706. {
  707. multipath_conf_t *conf;
  708. int i, j, disk_idx;
  709. struct multipath_info *disk, *disk2;
  710. mdp_super_t *sb = mddev->sb;
  711. mdp_disk_t *desc, *desc2;
  712. mdk_rdev_t *rdev, *def_rdev = NULL;
  713. struct md_list_head *tmp;
  714. int num_rdevs = 0;
  715. MOD_INC_USE_COUNT;
  716. if (sb->level != -4) {
  717. printk(INVALID_LEVEL, mdidx(mddev), sb->level);
  718. goto out;
  719. }
  720. /*
  721.  * copy the already verified devices into our private MULTIPATH
  722.  * bookkeeping area. [whatever we allocate in multipath_run(),
  723.  * should be freed in multipath_stop()]
  724.  */
  725. conf = kmalloc(sizeof(multipath_conf_t), GFP_KERNEL);
  726. mddev->private = conf;
  727. if (!conf) {
  728. printk(MEM_ERROR, mdidx(mddev));
  729. goto out;
  730. }
  731. memset(conf, 0, sizeof(*conf));
  732. ITERATE_RDEV(mddev,rdev,tmp) {
  733. if (rdev->faulty) {
  734. /* this is a "should never happen" case and if it */
  735. /* ever does happen, a continue; won't help */
  736. printk(ERRORS, partition_name(rdev->dev));
  737. continue;
  738. } else {
  739. /* this is a "should never happen" case and if it */
  740. /* ever does happen, a continue; won't help */
  741. if (!rdev->sb) {
  742. MD_BUG();
  743. continue;
  744. }
  745. }
  746. if (rdev->desc_nr == -1) {
  747. MD_BUG();
  748. continue;
  749. }
  750. desc = &sb->disks[rdev->desc_nr];
  751. disk_idx = desc->raid_disk;
  752. disk = conf->multipaths + disk_idx;
  753. if (!disk_sync(desc))
  754. printk(NOT_IN_SYNC, partition_name(rdev->dev));
  755. /*
  756.  * Mark all disks as spare to start with, then pick our
  757.  * active disk.  If we have a disk that is marked active
  758.  * in the sb, then use it, else use the first rdev.
  759.  */
  760. disk->number = desc->number;
  761. disk->raid_disk = desc->raid_disk;
  762. disk->dev = rdev->dev;
  763. disk->operational = 0;
  764. disk->spare = 1;
  765. disk->used_slot = 1;
  766. mark_disk_sync(desc);
  767. if (disk_active(desc)) {
  768. if(!conf->working_disks) {
  769. printk(OPERATIONAL, partition_name(rdev->dev),
  770.   desc->raid_disk);
  771. disk->operational = 1;
  772. disk->spare = 0;
  773. conf->working_disks++;
  774. def_rdev = rdev;
  775. } else {
  776. mark_disk_spare(desc);
  777. }
  778. } else
  779. mark_disk_spare(desc);
  780. if(!num_rdevs++) def_rdev = rdev;
  781. }
  782. if(!conf->working_disks && num_rdevs) {
  783. desc = &sb->disks[def_rdev->desc_nr];
  784. disk = conf->multipaths + desc->raid_disk;
  785. printk(OPERATIONAL, partition_name(def_rdev->dev),
  786. disk->raid_disk);
  787. disk->operational = 1;
  788. disk->spare = 0;
  789. conf->working_disks++;
  790. mark_disk_active(desc);
  791. }
  792. /*
  793.  * Make sure our active path is in desc spot 0
  794.  */
  795. if(def_rdev->desc_nr != 0) {
  796. rdev = find_rdev_nr(mddev, 0);
  797. desc = &sb->disks[def_rdev->desc_nr];
  798. desc2 = sb->disks;
  799. disk = conf->multipaths + desc->raid_disk;
  800. disk2 = conf->multipaths + desc2->raid_disk;
  801. xchg_values(*desc2,*desc);
  802. xchg_values(*disk2,*disk);
  803. xchg_values(desc2->number, desc->number);
  804. xchg_values(disk2->number, disk->number);
  805. xchg_values(desc2->raid_disk, desc->raid_disk);
  806. xchg_values(disk2->raid_disk, disk->raid_disk);
  807. if(rdev) {
  808. xchg_values(def_rdev->desc_nr,rdev->desc_nr);
  809. } else {
  810. def_rdev->desc_nr = 0;
  811. }
  812. }
  813. conf->raid_disks = sb->raid_disks = sb->active_disks = 1;
  814. conf->nr_disks = sb->nr_disks = sb->working_disks = num_rdevs;
  815. sb->failed_disks = 0;
  816. sb->spare_disks = num_rdevs - 1;
  817. mddev->sb_dirty = 1;
  818. conf->mddev = mddev;
  819. conf->device_lock = MD_SPIN_LOCK_UNLOCKED;
  820. init_waitqueue_head(&conf->wait_buffer);
  821. if (!conf->working_disks) {
  822. printk(NONE_OPERATIONAL, mdidx(mddev));
  823. goto out_free_conf;
  824. }
  825. /* pre-allocate some buffer_head structures.
  826.  * As a minimum, 1 mpbh and raid_disks buffer_heads
  827.  * would probably get us by in tight memory situations,
  828.  * but a few more is probably a good idea.
  829.  * For now, try NR_RESERVED_BUFS mpbh and
  830.  * NR_RESERVED_BUFS*raid_disks bufferheads
  831.  * This will allow at least NR_RESERVED_BUFS concurrent
  832.  * reads or writes even if kmalloc starts failing
  833.  */
  834. if (multipath_grow_mpbh(conf, NR_RESERVED_BUFS) < NR_RESERVED_BUFS) {
  835. printk(MEM_ERROR, mdidx(mddev));
  836. goto out_free_conf;
  837. }
  838. if ((sb->state & (1 << MD_SB_CLEAN))) {
  839. /*
  840.  * we do sanity checks even if the device says
  841.  * it's clean ...
  842.  */
  843. if (check_consistency(mddev)) {
  844. printk(SB_DIFFERENCES);
  845. sb->state &= ~(1 << MD_SB_CLEAN);
  846. }
  847. }
  848. {
  849. const char * name = "multipathd";
  850. conf->thread = md_register_thread(multipathd, conf, name);
  851. if (!conf->thread) {
  852. printk(THREAD_ERROR, mdidx(mddev));
  853. goto out_free_conf;
  854. }
  855. }
  856. /*
  857.  * Regenerate the "device is in sync with the raid set" bit for
  858.  * each device.
  859.  */
  860. for (i = 0; i < MD_SB_DISKS; i++) {
  861. mark_disk_nonsync(sb->disks+i);
  862. for (j = 0; j < sb->raid_disks; j++) {
  863. if (sb->disks[i].number == conf->multipaths[j].number)
  864. mark_disk_sync(sb->disks+i);
  865. }
  866. }
  867. printk(ARRAY_IS_ACTIVE, mdidx(mddev), sb->active_disks,
  868. sb->raid_disks, sb->spare_disks);
  869. /*
  870.  * Ok, everything is just fine now
  871.  */
  872. return 0;
  873. out_free_conf:
  874. multipath_shrink_mpbh(conf);
  875. kfree(conf);
  876. mddev->private = NULL;
  877. out:
  878. MOD_DEC_USE_COUNT;
  879. return -EIO;
  880. }
  881. #undef INVALID_LEVEL
  882. #undef NO_SB
  883. #undef ERRORS
  884. #undef NOT_IN_SYNC
  885. #undef INCONSISTENT
  886. #undef ALREADY_RUNNING
  887. #undef OPERATIONAL
  888. #undef SPARE
  889. #undef NONE_OPERATIONAL
  890. #undef SB_DIFFERENCES
  891. #undef ARRAY_IS_ACTIVE
  892. static int multipath_stop (mddev_t *mddev)
  893. {
  894. multipath_conf_t *conf = mddev_to_conf(mddev);
  895. md_unregister_thread(conf->thread);
  896. multipath_shrink_mpbh(conf);
  897. kfree(conf);
  898. mddev->private = NULL;
  899. MOD_DEC_USE_COUNT;
  900. return 0;
  901. }
  902. static mdk_personality_t multipath_personality=
  903. {
  904. name: "multipath",
  905. make_request: multipath_make_request,
  906. run: multipath_run,
  907. stop: multipath_stop,
  908. status: multipath_status,
  909. error_handler: multipath_error,
  910. diskop: multipath_diskop,
  911. };
  912. static int md__init multipath_init (void)
  913. {
  914. return register_md_personality (MULTIPATH, &multipath_personality);
  915. }
  916. static void multipath_exit (void)
  917. {
  918. unregister_md_personality (MULTIPATH);
  919. }
  920. module_init(multipath_init);
  921. module_exit(multipath_exit);
  922. MODULE_LICENSE("GPL");