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; }