aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@gmail.com>2011-07-26 21:00:36 -0400
committerNeilBrown <neilb@suse.de>2011-07-26 21:00:36 -0400
commit36fad858a7404a9656122a9e560a224ae2a00979 (patch)
tree95f8a7a6b8dad6bb8d7c7735f7845888b5e702db
parent8bda470e8ebde35f9349e98ecbce4dfb508a60fa (diff)
md: introduce link/unlink_rdev() helpers
There are places where sysfs links to rdev are handled in a same way. Add the helper functions to consolidate them. Signed-off-by: Namhyung Kim <namhyung@gmail.com> Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--drivers/md/md.c47
-rw-r--r--drivers/md/md.h14
-rw-r--r--drivers/md/raid1.c15
-rw-r--r--drivers/md/raid5.c10
4 files changed, 36 insertions, 50 deletions
diff --git a/drivers/md/md.c b/drivers/md/md.c
index 91e31e260b4..0398dc42a95 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -2459,7 +2459,6 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2459{ 2459{
2460 char *e; 2460 char *e;
2461 int err; 2461 int err;
2462 char nm[20];
2463 int slot = simple_strtoul(buf, &e, 10); 2462 int slot = simple_strtoul(buf, &e, 10);
2464 if (strncmp(buf, "none", 4)==0) 2463 if (strncmp(buf, "none", 4)==0)
2465 slot = -1; 2464 slot = -1;
@@ -2482,8 +2481,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2482 hot_remove_disk(rdev->mddev, rdev->raid_disk); 2481 hot_remove_disk(rdev->mddev, rdev->raid_disk);
2483 if (err) 2482 if (err)
2484 return err; 2483 return err;
2485 sprintf(nm, "rd%d", rdev->raid_disk); 2484 sysfs_unlink_rdev(rdev->mddev, rdev);
2486 sysfs_remove_link(&rdev->mddev->kobj, nm);
2487 rdev->raid_disk = -1; 2485 rdev->raid_disk = -1;
2488 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery); 2486 set_bit(MD_RECOVERY_NEEDED, &rdev->mddev->recovery);
2489 md_wakeup_thread(rdev->mddev->thread); 2487 md_wakeup_thread(rdev->mddev->thread);
@@ -2522,8 +2520,7 @@ slot_store(mdk_rdev_t *rdev, const char *buf, size_t len)
2522 return err; 2520 return err;
2523 } else 2521 } else
2524 sysfs_notify_dirent_safe(rdev->sysfs_state); 2522 sysfs_notify_dirent_safe(rdev->sysfs_state);
2525 sprintf(nm, "rd%d", rdev->raid_disk); 2523 if (sysfs_link_rdev(rdev->mddev, rdev))
2526 if (sysfs_create_link(&rdev->mddev->kobj, &rdev->kobj, nm))
2527 /* failure here is OK */; 2524 /* failure here is OK */;
2528 /* don't wakeup anyone, leave that to userspace. */ 2525 /* don't wakeup anyone, leave that to userspace. */
2529 } else { 2526 } else {
@@ -3149,15 +3146,13 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
3149 } 3146 }
3150 3147
3151 list_for_each_entry(rdev, &mddev->disks, same_set) { 3148 list_for_each_entry(rdev, &mddev->disks, same_set) {
3152 char nm[20];
3153 if (rdev->raid_disk < 0) 3149 if (rdev->raid_disk < 0)
3154 continue; 3150 continue;
3155 if (rdev->new_raid_disk >= mddev->raid_disks) 3151 if (rdev->new_raid_disk >= mddev->raid_disks)
3156 rdev->new_raid_disk = -1; 3152 rdev->new_raid_disk = -1;
3157 if (rdev->new_raid_disk == rdev->raid_disk) 3153 if (rdev->new_raid_disk == rdev->raid_disk)
3158 continue; 3154 continue;
3159 sprintf(nm, "rd%d", rdev->raid_disk); 3155 sysfs_unlink_rdev(mddev, rdev);
3160 sysfs_remove_link(&mddev->kobj, nm);
3161 } 3156 }
3162 list_for_each_entry(rdev, &mddev->disks, same_set) { 3157 list_for_each_entry(rdev, &mddev->disks, same_set) {
3163 if (rdev->raid_disk < 0) 3158 if (rdev->raid_disk < 0)
@@ -3168,11 +3163,10 @@ level_store(mddev_t *mddev, const char *buf, size_t len)
3168 if (rdev->raid_disk < 0) 3163 if (rdev->raid_disk < 0)
3169 clear_bit(In_sync, &rdev->flags); 3164 clear_bit(In_sync, &rdev->flags);
3170 else { 3165 else {
3171 char nm[20]; 3166 if (sysfs_link_rdev(mddev, rdev))
3172 sprintf(nm, "rd%d", rdev->raid_disk); 3167 printk(KERN_WARNING "md: cannot register rd%d"
3173 if(sysfs_create_link(&mddev->kobj, &rdev->kobj, nm)) 3168 " for %s after level change\n",
3174 printk("md: cannot register %s for %s after level change\n", 3169 rdev->raid_disk, mdname(mddev));
3175 nm, mdname(mddev));
3176 } 3170 }
3177 } 3171 }
3178 3172
@@ -4621,12 +4615,9 @@ int md_run(mddev_t *mddev)
4621 smp_wmb(); 4615 smp_wmb();
4622 mddev->ready = 1; 4616 mddev->ready = 1;
4623 list_for_each_entry(rdev, &mddev->disks, same_set) 4617 list_for_each_entry(rdev, &mddev->disks, same_set)
4624 if (rdev->raid_disk >= 0) { 4618 if (rdev->raid_disk >= 0)
4625 char nm[20]; 4619 if (sysfs_link_rdev(mddev, rdev))
4626 sprintf(nm, "rd%d", rdev->raid_disk);
4627 if (sysfs_create_link(&mddev->kobj, &rdev->kobj, nm))
4628 /* failure here is OK */; 4620 /* failure here is OK */;
4629 }
4630 4621
4631 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); 4622 set_bit(MD_RECOVERY_NEEDED, &mddev->recovery);
4632 4623
@@ -4854,11 +4845,8 @@ static int do_md_stop(mddev_t * mddev, int mode, int is_open)
4854 sysfs_notify_dirent_safe(mddev->sysfs_state); 4845 sysfs_notify_dirent_safe(mddev->sysfs_state);
4855 4846
4856 list_for_each_entry(rdev, &mddev->disks, same_set) 4847 list_for_each_entry(rdev, &mddev->disks, same_set)
4857 if (rdev->raid_disk >= 0) { 4848 if (rdev->raid_disk >= 0)
4858 char nm[20]; 4849 sysfs_unlink_rdev(mddev, rdev);
4859 sprintf(nm, "rd%d", rdev->raid_disk);
4860 sysfs_remove_link(&mddev->kobj, nm);
4861 }
4862 4850
4863 set_capacity(disk, 0); 4851 set_capacity(disk, 0);
4864 mutex_unlock(&mddev->open_mutex); 4852 mutex_unlock(&mddev->open_mutex);
@@ -7077,9 +7065,7 @@ static int remove_and_add_spares(mddev_t *mddev)
7077 atomic_read(&rdev->nr_pending)==0) { 7065 atomic_read(&rdev->nr_pending)==0) {
7078 if (mddev->pers->hot_remove_disk( 7066 if (mddev->pers->hot_remove_disk(
7079 mddev, rdev->raid_disk)==0) { 7067 mddev, rdev->raid_disk)==0) {
7080 char nm[20]; 7068 sysfs_unlink_rdev(mddev, rdev);
7081 sprintf(nm,"rd%d", rdev->raid_disk);
7082 sysfs_remove_link(&mddev->kobj, nm);
7083 rdev->raid_disk = -1; 7069 rdev->raid_disk = -1;
7084 } 7070 }
7085 } 7071 }
@@ -7096,10 +7082,7 @@ static int remove_and_add_spares(mddev_t *mddev)
7096 rdev->recovery_offset = 0; 7082 rdev->recovery_offset = 0;
7097 if (mddev->pers-> 7083 if (mddev->pers->
7098 hot_add_disk(mddev, rdev) == 0) { 7084 hot_add_disk(mddev, rdev) == 0) {
7099 char nm[20]; 7085 if (sysfs_link_rdev(mddev, rdev))
7100 sprintf(nm, "rd%d", rdev->raid_disk);
7101 if (sysfs_create_link(&mddev->kobj,
7102 &rdev->kobj, nm))
7103 /* failure here is OK */; 7086 /* failure here is OK */;
7104 spares++; 7087 spares++;
7105 md_new_event(mddev); 7088 md_new_event(mddev);
@@ -7219,9 +7202,7 @@ void md_check_recovery(mddev_t *mddev)
7219 atomic_read(&rdev->nr_pending)==0) { 7202 atomic_read(&rdev->nr_pending)==0) {
7220 if (mddev->pers->hot_remove_disk( 7203 if (mddev->pers->hot_remove_disk(
7221 mddev, rdev->raid_disk)==0) { 7204 mddev, rdev->raid_disk)==0) {
7222 char nm[20]; 7205 sysfs_unlink_rdev(mddev, rdev);
7223 sprintf(nm,"rd%d", rdev->raid_disk);
7224 sysfs_remove_link(&mddev->kobj, nm);
7225 rdev->raid_disk = -1; 7206 rdev->raid_disk = -1;
7226 } 7207 }
7227 } 7208 }
diff --git a/drivers/md/md.h b/drivers/md/md.h
index 1c26c7a08ae..6863f722cd2 100644
--- a/drivers/md/md.h
+++ b/drivers/md/md.h
@@ -413,6 +413,20 @@ static inline char * mdname (mddev_t * mddev)
413 return mddev->gendisk ? mddev->gendisk->disk_name : "mdX"; 413 return mddev->gendisk ? mddev->gendisk->disk_name : "mdX";
414} 414}
415 415
416static inline int sysfs_link_rdev(mddev_t *mddev, mdk_rdev_t *rdev)
417{
418 char nm[20];
419 sprintf(nm, "rd%d", rdev->raid_disk);
420 return sysfs_create_link(&mddev->kobj, &rdev->kobj, nm);
421}
422
423static inline void sysfs_unlink_rdev(mddev_t *mddev, mdk_rdev_t *rdev)
424{
425 char nm[20];
426 sprintf(nm, "rd%d", rdev->raid_disk);
427 sysfs_remove_link(&mddev->kobj, nm);
428}
429
416/* 430/*
417 * iterates through some rdev ringlist. It's safe to remove the 431 * iterates through some rdev ringlist. It's safe to remove the
418 * current 'rdev'. Dont touch 'tmp' though. 432 * current 'rdev'. Dont touch 'tmp' though.
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
index d3a8f4bb4fc..1d79a041db0 100644
--- a/drivers/md/raid1.c
+++ b/drivers/md/raid1.c
@@ -2159,18 +2159,13 @@ static int raid1_reshape(mddev_t *mddev)
2159 for (d = d2 = 0; d < conf->raid_disks; d++) { 2159 for (d = d2 = 0; d < conf->raid_disks; d++) {
2160 mdk_rdev_t *rdev = conf->mirrors[d].rdev; 2160 mdk_rdev_t *rdev = conf->mirrors[d].rdev;
2161 if (rdev && rdev->raid_disk != d2) { 2161 if (rdev && rdev->raid_disk != d2) {
2162 char nm[20]; 2162 sysfs_unlink_rdev(mddev, rdev);
2163 sprintf(nm, "rd%d", rdev->raid_disk);
2164 sysfs_remove_link(&mddev->kobj, nm);
2165 rdev->raid_disk = d2; 2163 rdev->raid_disk = d2;
2166 sprintf(nm, "rd%d", rdev->raid_disk); 2164 sysfs_unlink_rdev(mddev, rdev);
2167 sysfs_remove_link(&mddev->kobj, nm); 2165 if (sysfs_link_rdev(mddev, rdev))
2168 if (sysfs_create_link(&mddev->kobj,
2169 &rdev->kobj, nm))
2170 printk(KERN_WARNING 2166 printk(KERN_WARNING
2171 "md/raid1:%s: cannot register " 2167 "md/raid1:%s: cannot register rd%d\n",
2172 "%s\n", 2168 mdname(mddev), rdev->raid_disk);
2173 mdname(mddev), nm);
2174 } 2169 }
2175 if (rdev) 2170 if (rdev)
2176 newmirrors[d2++].rdev = rdev; 2171 newmirrors[d2++].rdev = rdev;
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
index 467e8e1cd3d..0cd591472e1 100644
--- a/drivers/md/raid5.c
+++ b/drivers/md/raid5.c
@@ -5152,16 +5152,14 @@ static int raid5_start_reshape(mddev_t *mddev)
5152 if (rdev->raid_disk < 0 && 5152 if (rdev->raid_disk < 0 &&
5153 !test_bit(Faulty, &rdev->flags)) { 5153 !test_bit(Faulty, &rdev->flags)) {
5154 if (raid5_add_disk(mddev, rdev) == 0) { 5154 if (raid5_add_disk(mddev, rdev) == 0) {
5155 char nm[20];
5156 if (rdev->raid_disk 5155 if (rdev->raid_disk
5157 >= conf->previous_raid_disks) { 5156 >= conf->previous_raid_disks) {
5158 set_bit(In_sync, &rdev->flags); 5157 set_bit(In_sync, &rdev->flags);
5159 added_devices++; 5158 added_devices++;
5160 } else 5159 } else
5161 rdev->recovery_offset = 0; 5160 rdev->recovery_offset = 0;
5162 sprintf(nm, "rd%d", rdev->raid_disk); 5161
5163 if (sysfs_create_link(&mddev->kobj, 5162 if (sysfs_link_rdev(mddev, rdev))
5164 &rdev->kobj, nm))
5165 /* Failure here is OK */; 5163 /* Failure here is OK */;
5166 } 5164 }
5167 } else if (rdev->raid_disk >= conf->previous_raid_disks 5165 } else if (rdev->raid_disk >= conf->previous_raid_disks
@@ -5257,9 +5255,7 @@ static void raid5_finish_reshape(mddev_t *mddev)
5257 d++) { 5255 d++) {
5258 mdk_rdev_t *rdev = conf->disks[d].rdev; 5256 mdk_rdev_t *rdev = conf->disks[d].rdev;
5259 if (rdev && raid5_remove_disk(mddev, d) == 0) { 5257 if (rdev && raid5_remove_disk(mddev, d) == 0) {
5260 char nm[20]; 5258 sysfs_unlink_rdev(mddev, rdev);
5261 sprintf(nm, "rd%d", rdev->raid_disk);
5262 sysfs_remove_link(&mddev->kobj, nm);
5263 rdev->raid_disk = -1; 5259 rdev->raid_disk = -1;
5264 } 5260 }
5265 } 5261 }