[PATCH 3/7] dm: new suspend/resume target methods

From: Joe Thornber (thornber@sistina.com)
Date: Mon Jun 09 2003 - 09:36:11 EST


Some targets may perform io of their own volition, eg. a mirror
performing recovery, a cache target pulling in different chunks. We
cannot let them perform this io while the device is suspended. This
patch adds 2 new methods to the target type, which instruct the target
to suspend/resume itself. All targets start in the suspended state,
so should expect an initial resume call. Simple targets do not need
to implement these functions.
--- diff/drivers/md/dm-table.c 2003-06-09 15:05:02.000000000 +0100
+++ source/drivers/md/dm-table.c 2003-06-09 15:05:08.000000000 +0100
@@ -776,6 +776,31 @@
         add_wait_queue(&t->eventq, wq);
 }
 
+void dm_table_suspend_targets(struct dm_table *t)
+{
+ int i;
+
+ for (i = 0; i < t->num_targets; i++) {
+ struct dm_target *ti = t->targets + i;
+
+ if (ti->type->suspend)
+ ti->type->suspend(ti);
+ }
+}
+
+void dm_table_resume_targets(struct dm_table *t)
+{
+ int i;
+
+ for (i = 0; i < t->num_targets; i++) {
+ struct dm_target *ti = t->targets + i;
+
+ if (ti->type->resume)
+ ti->type->resume(ti);
+ }
+}
+
+
 EXPORT_SYMBOL(dm_get_device);
 EXPORT_SYMBOL(dm_put_device);
 EXPORT_SYMBOL(dm_table_event);
--- diff/drivers/md/dm.c 2003-06-09 15:05:02.000000000 +0100
+++ source/drivers/md/dm.c 2003-06-09 15:05:08.000000000 +0100
@@ -678,6 +678,7 @@
                 free_dev(md);
                 return r;
         }
+ dm_table_resume_targets(md->map);
 
         *result = md;
         return 0;
@@ -692,6 +693,8 @@
 {
         if (atomic_dec_and_test(&md->holders)) {
                 DMWARN("destroying md");
+ if (!test_bit(DMF_SUSPENDED, &md->flags))
+ dm_table_suspend_targets(md->map);
                 __unbind(md);
                 free_dev(md);
         }
@@ -781,6 +784,7 @@
         down_write(&md->lock);
         remove_wait_queue(&md->wait, &wait);
         set_bit(DMF_SUSPENDED, &md->flags);
+ dm_table_suspend_targets(md->map);
         up_write(&md->lock);
 
         return 0;
@@ -797,6 +801,7 @@
                 return -EINVAL;
         }
 
+ dm_table_resume_targets(md->map);
         clear_bit(DMF_SUSPENDED, &md->flags);
         clear_bit(DMF_BLOCK_IO, &md->flags);
         def = md->deferred;
--- diff/drivers/md/dm.h 2003-06-09 15:05:02.000000000 +0100
+++ source/drivers/md/dm.h 2003-06-09 15:05:08.000000000 +0100
@@ -104,6 +104,8 @@
 struct list_head *dm_table_get_devices(struct dm_table *t);
 int dm_table_get_mode(struct dm_table *t);
 void dm_table_add_wait_queue(struct dm_table *t, wait_queue_t *wq);
+void dm_table_suspend_targets(struct dm_table *t);
+void dm_table_resume_targets(struct dm_table *t);
 
 /*-----------------------------------------------------------------
  * A registry of target types.
--- diff/include/linux/device-mapper.h 2003-06-09 15:05:02.000000000 +0100
+++ source/include/linux/device-mapper.h 2003-06-09 15:05:08.000000000 +0100
@@ -33,6 +33,10 @@
  * > 0: simple remap complete
  */
 typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio);
+
+typedef void (*dm_suspend_fn) (struct dm_target *ti);
+typedef void (*dm_resume_fn) (struct dm_target *ti);
+
 typedef int (*dm_status_fn) (struct dm_target *ti, status_type_t status_type,
                              char *result, unsigned int maxlen);
 
@@ -56,6 +60,8 @@
         dm_ctr_fn ctr;
         dm_dtr_fn dtr;
         dm_map_fn map;
+ dm_suspend_fn suspend;
+ dm_resume_fn resume;
         dm_status_fn status;
 };
 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Jun 15 2003 - 22:00:20 EST