Map rootfs and hal from super 09/297909/4
authorJacek Kryszyn <j.kryszyn@samsung.com>
Mon, 28 Aug 2023 10:10:05 +0000 (12:10 +0200)
committerJacek Kryszyn <j.kryszyn@samsung.com>
Wed, 8 Nov 2023 12:47:50 +0000 (13:47 +0100)
init script modified to search for super partition and map rootfs
and hal if super found.

Change-Id: I4bf7ca6df17ba1035d770467ef5eab5443a6a638

scripts/init.sh
src/parse-dynparts/main.cpp

index 8de23f9d76df015d5af0215b2fad24a14830fa5f..2dc1237dd57fd274037433829147b70b03c00076 100755 (executable)
@@ -1,6 +1,7 @@
 #!/bin/bash
 PATH=/bin:/usr/bin:/sbin:/usr/sbin
 
+SUPERFS=
 HALFS=
 ROOTFS=
 DATAFS=
@@ -33,6 +34,21 @@ function get_blk_dev_path()
     done
 }
 
+function map_from_super()
+{
+    local part_name="$1"
+    local part_table="$2"
+    echo "$part_table" | /usr/sbin/dmsetup create "$part_name" &>/dev/null
+    if [ $? = 0 ]
+    then
+        echo "/dev/mapper/$part_name"
+        return 0
+    else
+        echo "WARNING : SUPER FOUND BUT $part_name NOT FOUND" >&2
+        return 1
+    fi
+}
+
 function find_partitions()
 {
     P_SLOT=$([[ $(</proc/cmdline) =~ partition_ab=([ab]) ]]; echo ${BASH_REMATCH[1]})
@@ -47,7 +63,35 @@ function find_partitions()
     IFS=$'\n'
     BLKID_LINES=($(/sbin/blkid))
 
-    ROOTFS=`get_blk_dev_path "PARTLABEL=\"rootfs${P_SUFFIX}\""`
+    SUPERFS=`get_blk_dev_path "PARTLABEL=\"super\""`
+    if [ x$SUPERFS = "x" ]
+    then
+        SUPERFS=`get_blk_dev_path "LABEL=\"super\""`
+    fi
+
+    if [ x$SUPERFS != "x" ]
+    then
+        PARSE_DYNPARTS=`/usr/sbin/parse-dynparts "$SUPERFS" --list-tables`
+
+        while IFS=$IFS_BACKUP read -r part_name part_table; do
+            if [ "$part_name" = "rootfs${P_SUFFIX}" ]
+            then
+                ROOTFS=`map_from_super "$part_name" "$part_table"`
+            fi
+
+            if [ "$part_name" = "hal${P_SUFFIX}" ]
+            then
+                HALFS=`map_from_super "$part_name" "$part_table"`
+            fi
+        done << PARSE_DYNPARTS_INPUT
+$PARSE_DYNPARTS
+PARSE_DYNPARTS_INPUT
+    fi
+
+    if [ x$ROOTFS = "x" ]
+    then
+        ROOTFS=`get_blk_dev_path "PARTLABEL=\"rootfs${P_SUFFIX}\""`
+    fi
     if [ x$ROOTFS = "x" ]
     then
         ROOTFS=`get_blk_dev_path "LABEL=\"rootfs\""`
@@ -91,7 +135,10 @@ function find_partitions()
         MODULES=`get_blk_dev_path "LABEL=\"modules\""`
     fi
 
-    HALFS=`get_blk_dev_path "PARTLABEL=\"hal${P_SUFFIX}\""`
+    if [ x$HALFS = "x" ]
+    then
+        HALFS=`get_blk_dev_path "PARTLABEL=\"hal${P_SUFFIX}\""`
+    fi
     if [ x$HALFS = "x" ]
     then
         HALFS=`get_blk_dev_path "LABEL=\"hal\""`
index 6129e4897060a46ef27223629b9f4253d9ab56e1..6a0b78c5fc37242bc1756d63af85fd2e7bc94484 100644 (file)
@@ -10,15 +10,17 @@ using std::cerr;
 using std::cout;
 using std::endl;
 
-constexpr std::string_view kDmPrefix = "dynpart-";
-
 int main(int argc, char* argv[]) {
-  if (argc != 2) {
-    cerr << "Usage: dmsetup create --concise \"$(" << argv[0] << " device)\""
+  if (argc < 2 || argc > 4 || (argc == 3 && std::string_view(argv[2]).compare("--list-tables"))) {
+    cerr << "Usage: dmsetup create --concise \"$(" << argv[0] << " device)\"" << endl
+         << "Alternatively, you can use --list-tables option to get partitions tables line"
+         << " by line which you can provide to dmsetup create."
          << endl;
     return 1;
   }
 
+  bool list_tables = (argc == 3) ? true : false;
+
   auto metadata = ReadMetadata(argv[1], 0);
   if (!metadata) {
     cerr << "Failed to parse metadata from \"" << argv[1] << "\"" << endl;
@@ -41,16 +43,20 @@ int main(int argc, char* argv[]) {
     }
 
     std::ostringstream line;
-    bool read_only = partition.attributes & LP_PARTITION_ATTR_READONLY;
-    line << kDmPrefix << GetPartitionName(partition) << ",,,"
-         << (read_only ? "ro" : "rw");
+
+    if (list_tables)
+      line << GetPartitionName(partition) << " ";
+    else {
+      bool read_only = partition.attributes & LP_PARTITION_ATTR_READONLY;
+      line << GetPartitionName(partition) << ",,," << (read_only ? "ro," : "rw,");
+    }
 
     uint64_t sector = 0;
     for (size_t i = 0; i < partition.num_extents; i++) {
       const auto& extent = metadata->extents[partition.first_extent_index + i];
       switch (extent.target_type) {
         case LP_TARGET_TYPE_ZERO:
-          line << "," << sector << " " << extent.num_sectors << " zero";
+          line << sector << " " << extent.num_sectors << " zero";
           break;
         case LP_TARGET_TYPE_LINEAR: {
           if (extent.target_source != 0) {
@@ -59,7 +65,10 @@ int main(int argc, char* argv[]) {
             return 1;
           }
 
-          line << "," << sector << " " << extent.num_sectors << " linear "
+          if (i && !list_tables) line << ",";
+          if (i && list_tables) line << "\\n";
+
+          line << sector << " " << extent.num_sectors << " linear "
                << argv[1] << " " << extent.target_data;
           break;
         }
@@ -71,7 +80,8 @@ int main(int argc, char* argv[]) {
       sector += extent.num_sectors;
     }
 
-    if (!table.empty()) table += ";";
+    if (!table.empty() && list_tables) table += "\n";
+    if (!table.empty() && !list_tables) table += ";";
     table += line.str();
   }