PARTITION/BLOCK DEVICE: Add pre/post functions

Some code can't read/write the entire partition in one shot.  To
make it easier for them to run the pre/post operation environment
variables, wrapper functions have been added.

Change-Id: I7e4960ab8ec76336886c8c80c165fa7278aa0970
Signed-off-by: Scott Anderson <saa@google.com>
diff --git a/disk/part.c b/disk/part.c
index b6405a5..918a81f 100644
--- a/disk/part.c
+++ b/disk/part.c
@@ -199,6 +199,30 @@
 		return -ENOEXEC;
 	return 0;
 }
+int partition_erase_pre(disk_partition_t *ptn)
+{
+	return run_env(BEFORE, "erase", ptn->name);
+}
+int partition_erase_post(disk_partition_t *ptn)
+{
+	return run_env(AFTER, "erase", ptn->name);
+}
+int partition_read_pre(disk_partition_t *ptn)
+{
+	return run_env(BEFORE, "read", ptn->name);
+}
+int partition_read_post(disk_partition_t *ptn)
+{
+	return run_env(AFTER, "read", ptn->name);
+}
+int partition_write_pre(disk_partition_t *ptn)
+{
+	return run_env(BEFORE, "write", ptn->name);
+}
+int partition_write_post(disk_partition_t *ptn)
+{
+	return run_env(AFTER, "write", ptn->name);
+}
 
 /* Simple helper for partition_* functions to validate arguments. */
 static int _partition_validate(block_dev_desc_t *dev, disk_partition_t *ptn,
@@ -255,7 +279,7 @@
 	if (err)
 		return err;
 
-	err = run_env(BEFORE, "erase", ptn->name);
+	err = partition_erase_pre(ptn);
 	if (err)
 		return err;
 
@@ -272,13 +296,11 @@
 	if (bytecnt_p)
 		*bytecnt_p = (loff_t)blks_done * dev->blksz;
 
-	err = run_env(AFTER, "erase", ptn->name);
+	err = partition_erase_post(ptn);
 
 	if (blks_done != blks_to_do)
 		return -EIO;
-	if (err)
-		return err;
-	return 0;
+	return err;
 }
 int partition_erase_blks(block_dev_desc_t *dev, disk_partition_t *ptn,
 							lbaint_t *blkcnt)
@@ -305,7 +327,7 @@
 	if (err)
 		return err;
 
-	err = run_env(BEFORE, "read", ptn->name);
+	err = partition_read_pre(ptn);
 	if (err)
 		return err;
 
@@ -322,13 +344,11 @@
 	if (bytecnt_p)
 		*bytecnt_p = (loff_t)blks_done * dev->blksz;
 
-	err = run_env(AFTER, "read", ptn->name);
+	err = partition_read_post(ptn);
 
 	if (blks_done != blks_to_do)
 		return -EIO;
-	if (err)
-		return err;
-	return 0;
+	return err;
 }
 int partition_read_blks(block_dev_desc_t *dev, disk_partition_t *ptn,
 					lbaint_t *blkcnt, void *buffer)
@@ -360,7 +380,7 @@
 	if (err)
 		return err;
 
-	err = run_env(BEFORE, "write", ptn->name);
+	err = partition_write_pre(ptn);
 	if (!err) {
 		if (bytes_to_do) {
 			blks_to_do = DIV_ROUND_UP(bytes_to_do, dev->blksz);
@@ -383,14 +403,12 @@
 				*bytecnt_p = (loff_t)blks_done * dev->blksz;
 		}
 
-		err = run_env(AFTER, "write", ptn->name);
+		err = partition_write_post(ptn);
 	}
 
 	if (blks_done != blks_to_do)
 		return -EIO;
-	if (err)
-		return err;
-	return 0;
+	return err;
 }
 
 int partition_write_blks(block_dev_desc_t *dev, disk_partition_t *ptn,
@@ -417,6 +435,30 @@
 {
 	return -ENODEV;
 }
+int partition_erase_pre(disk_partition_t *ptn)
+{
+	return -ENODEV;
+}
+int partition_erase_post(disk_partition_t *ptn)
+{
+	return -ENODEV;
+}
+int partition_read_pre(disk_partition_t *ptn)
+{
+	return -ENODEV;
+}
+int partition_read_post(disk_partition_t *ptn)
+{
+	return -ENODEV;
+}
+int partition_write_pre(disk_partition_t *ptn)
+{
+	return -ENODEV;
+}
+int partition_write_post(disk_partition_t *ptn)
+{
+	return -ENODEV;
+}
 int partition_erase_blks(block_dev_desc_t *dev, disk_partition_t *ptn,
 							lbaint_t *blkcnt)
 {
diff --git a/include/part.h b/include/part.h
index 84ee1bf..453ce0c 100644
--- a/include/part.h
+++ b/include/part.h
@@ -118,6 +118,12 @@
 /* Refer to doc/README.partition_funcs for information about these functions. */
 int get_partition_by_name(block_dev_desc_t *dev, const char *partition_name,
 				disk_partition_t *partition);
+int partition_erase_pre(disk_partition_t *ptn);
+int partition_erase_post(disk_partition_t *ptn);
+int partition_read_pre(disk_partition_t *ptn);
+int partition_read_post(disk_partition_t *ptn);
+int partition_write_pre(disk_partition_t *ptn);
+int partition_write_post(disk_partition_t *ptn);
 int partition_erase_blks(block_dev_desc_t *dev, disk_partition_t *partition,
 				lbaint_t *blkcnt);
 int partition_erase_bytes(block_dev_desc_t *dev, disk_partition_t *partition,
@@ -156,6 +162,18 @@
 static inline int get_partition_by_name(block_dev_desc_t *dev,
 				const char *partition_name,
 				disk_partition_t *partition) { return -ENODEV; }
+static inline int partition_erase_pre(disk_partition_t *ptn)
+							{ return -ENODEV; }
+static inline int partition_erase_post(disk_partition_t *ptn)
+							{ return -ENODEV; }
+static inline int partition_read_pre(disk_partition_t *ptn)
+							{ return -ENODEV; }
+static inline int partition_read_post(disk_partition_t *ptn)
+							{ return -ENODEV; }
+static inline int partition_write_pre(disk_partition_t *ptn)
+							{ return -ENODEV; }
+static inline int partition_write_post(disk_partition_t *ptn)
+							{ return -ENODEV; }
 static inline int partition_erase_blks(block_dev_desc_t *dev,
 				disk_partition_t *partition,
 				lbaint_t *blkcnt) { return -ENODEV; }