storage: Extract rpmb fs init/destroy fn

Bug: 332762065
Change-Id: Id1aa6559be9a2d32e8c63516c7e3c91a1f78d89d
diff --git a/block_device_tipc.c b/block_device_tipc.c
index 357b603..fd11ac5 100644
--- a/block_device_tipc.c
+++ b/block_device_tipc.c
@@ -485,6 +485,67 @@
 }
 
 /**
+ * init_rpmb_fs() - Initialize @self's RPMB fs and its backing block devices.
+ * @self:            The struct block_device_tipc to modify
+ * @fs_key:          The key to use for the filesystem.
+ * @partition_start: The first RPMB block in the partition to use for this fs.
+ *
+ * Return: NO_ERROR on success, error code less than 0 on error.
+ */
+static int init_rpmb_fs(struct block_device_tipc* self,
+                        const struct key* fs_key,
+                        uint16_t partition_start) {
+    int ret;
+    uint32_t rpmb_block_count;
+
+    if (BLOCK_COUNT_RPMB) {
+        rpmb_block_count = BLOCK_COUNT_RPMB;
+        ret = rpmb_check(self->rpmb_state,
+                         rpmb_block_count * BLOCK_SIZE_RPMB_BLOCKS - 1);
+        if (ret < 0) {
+            SS_ERR("%s: bad static rpmb size, %d\n", __func__,
+                   rpmb_block_count);
+            goto err_bad_rpmb_size;
+        }
+    } else {
+        rpmb_block_count = rpmb_search_size(self->rpmb_state,
+                                            0); /* TODO: get hint from ns */
+        rpmb_block_count /= BLOCK_SIZE_RPMB_BLOCKS;
+    }
+    if (rpmb_block_count < partition_start) {
+        ret = -1;
+        SS_ERR("%s: bad rpmb size, %d\n", __func__, rpmb_block_count);
+        goto err_bad_rpmb_size;
+    }
+
+    block_device_tipc_init_dev_rpmb(&self->dev_rpmb, self->rpmb_state,
+                                    partition_start,
+                                    rpmb_block_count - partition_start, false);
+
+    /* TODO: allow non-rpmb based tamper proof storage */
+    ret = fs_init(&self->tr_state_rpmb, file_system_id_tp, fs_key,
+                  &self->dev_rpmb.dev, &self->dev_rpmb.dev, FS_INIT_FLAGS_NONE);
+    if (ret < 0) {
+        SS_ERR("%s: failed to initialize TP: %d\n", __func__, ret);
+        goto err_init_tr_state_rpmb;
+    }
+    return 0;
+
+err_init_tr_state_rpmb:
+    block_cache_dev_destroy(&self->dev_rpmb.dev);
+err_bad_rpmb_size:
+    return ret;
+}
+
+/**
+ * destroy_rpmb_fs() - Destroy @self's RPMB fs and its backing block devices.
+ */
+static void destroy_rpmb_fs(struct block_device_tipc* self) {
+    fs_destroy(&self->tr_state_rpmb);
+    block_cache_dev_destroy(&self->dev_rpmb.dev);
+}
+
+/**
  * rpmb_span_end() - Calculates the first block past the end of @self.
  */
 static uint16_t rpmb_span_end(struct rpmb_span self) {
@@ -515,7 +576,6 @@
                            const struct key* fs_key,
                            const struct rpmb_key* rpmb_key,
                            hwkey_session_t hwkey_session) {
-    uint32_t rpmb_block_count;
     bool alternate_data_partition = false;
     uint8_t probe;
     uint32_t ns_init_flags = FS_INIT_FLAGS_NONE;
@@ -544,37 +604,9 @@
         goto err_init_rpmb_key;
     }
 
-    if (BLOCK_COUNT_RPMB) {
-        rpmb_block_count = BLOCK_COUNT_RPMB;
-        ret = rpmb_check(state->rpmb_state,
-                         rpmb_block_count * BLOCK_SIZE_RPMB_BLOCKS - 1);
-        if (ret) {
-            SS_ERR("%s: bad static rpmb size, %d\n", __func__,
-                   rpmb_block_count);
-            goto err_bad_rpmb_size;
-        }
-    } else {
-        rpmb_block_count = rpmb_search_size(state->rpmb_state,
-                                            0); /* TODO: get hint from ns */
-        rpmb_block_count /= BLOCK_SIZE_RPMB_BLOCKS;
-    }
-    if (rpmb_block_count < partitions.rpmb_start) {
-        ret = -1;
-        SS_ERR("%s: bad rpmb size, %d\n", __func__, rpmb_block_count);
-        goto err_bad_rpmb_size;
-    }
-
-    block_device_tipc_init_dev_rpmb(
-            &state->dev_rpmb, state->rpmb_state, partitions.rpmb_start,
-            rpmb_block_count - partitions.rpmb_start, false);
-
-    /* TODO: allow non-rpmb based tamper proof storage */
-    ret = fs_init(&state->tr_state_rpmb, file_system_id_tp, fs_key,
-                  &state->dev_rpmb.dev, &state->dev_rpmb.dev,
-                  FS_INIT_FLAGS_NONE);
+    ret = init_rpmb_fs(state, fs_key, partitions.rpmb_start);
     if (ret < 0) {
-        SS_ERR("%s: failed to initialize TP: %d\n", __func__, ret);
-        goto err_init_tr_state_rpmb;
+        goto err_init_rpmb_fs;
     }
 
     block_device_tipc_init_dev_ns(&state->dev_ns, state->ipc_handle, true);
@@ -752,10 +784,8 @@
     block_cache_dev_destroy(&state->dev_ns.dev);
 err_get_td_max_size:
     ns_close_file(state->ipc_handle, state->dev_ns.ns_handle);
-    fs_destroy(&state->tr_state_rpmb);
-err_init_tr_state_rpmb:
-    block_cache_dev_destroy(&state->dev_rpmb.dev);
-err_bad_rpmb_size:
+    destroy_rpmb_fs(state);
+err_init_rpmb_fs:
 err_init_rpmb_key:
     rpmb_uninit(state->rpmb_state);
 err_rpmb_init:
@@ -779,8 +809,7 @@
         ns_close_file(state->ipc_handle, state->dev_ns.ns_handle);
     }
 
-    fs_destroy(&state->tr_state_rpmb);
-    block_cache_dev_destroy(&state->dev_rpmb.dev);
+    destroy_rpmb_fs(state);
     rpmb_uninit(state->rpmb_state);
 }