This is an automated email from the ASF dual-hosted git repository.

gustavonihei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 162893c  fs/partition: Support BIOC_PARTINFO
162893c is described below

commit 162893cc3b147cc793aee51a092273b7481ac519
Author: Xiang Xiao <[email protected]>
AuthorDate: Thu Aug 12 21:18:27 2021 +0800

    fs/partition: Support BIOC_PARTINFO
    
    Signed-off-by: Xiang Xiao <[email protected]>
---
 fs/driver/fs_blockpartition.c | 88 +++++++++++++++++++++++++++++--------------
 1 file changed, 59 insertions(+), 29 deletions(-)

diff --git a/fs/driver/fs_blockpartition.c b/fs/driver/fs_blockpartition.c
index dd34f89..05f2809 100644
--- a/fs/driver/fs_blockpartition.c
+++ b/fs/driver/fs_blockpartition.c
@@ -43,6 +43,7 @@
 struct part_struct_s
 {
   FAR struct inode *parent;
+  size_t sectorsize;
   size_t firstsector;
   size_t nsectors;
 };
@@ -214,40 +215,58 @@ static int part_ioctl(FAR struct inode *inode, int cmd, 
unsigned long arg)
   FAR struct inode *parent = dev->parent;
   int ret = -ENOTTY;
 
-  if (parent->u.i_bops->ioctl)
+  switch (cmd)
     {
-      if (cmd == MTDIOC_PROTECT || cmd == MTDIOC_UNPROTECT)
+      case BIOC_PARTINFO:
         {
-          FAR struct mtd_protect_s *prot =
-            (FAR struct mtd_protect_s *)ptr_arg;
-
-          prot->startblock += dev->firstsector;
-        }
-
-      ret = parent->u.i_bops->ioctl(parent, cmd, arg);
-      if (ret >= 0)
-        {
-          if (cmd == BIOC_XIPBASE)
+          FAR struct partition_info_s *info =
+            (FAR struct partition_info_s *)ptr_arg;
+          if (info != NULL)
             {
-              FAR void **base = (FAR void **)ptr_arg;
-              struct geometry geo;
-
-              ret = parent->u.i_bops->geometry(parent, &geo);
-              if (ret >= 0)
-                {
-                  *(FAR uint8_t *)base +=
-                    dev->firstsector * geo.geo_sectorsize;
-                }
-            }
-          else if (cmd == MTDIOC_GEOMETRY)
-            {
-              FAR struct mtd_geometry_s *mgeo =
-                (FAR struct mtd_geometry_s *)ptr_arg;
-              uint32_t blkper = mgeo->erasesize / mgeo->blocksize;
+              info->magic       = 0;
+              info->numsectors  = dev->nsectors;
+              info->sectorsize  = dev->sectorsize;
+              info->startsector = dev->firstsector;
+
+              strncpy(info->parent, dev->parent->i_name, NAME_MAX);
 
-              mgeo->neraseblocks = dev->nsectors / blkper;
-            }
+              ret = OK;
+          }
         }
+        break;
+
+      default:
+        if (parent->u.i_bops->ioctl)
+          {
+            if (cmd == MTDIOC_PROTECT || cmd == MTDIOC_UNPROTECT)
+              {
+                FAR struct mtd_protect_s *prot =
+                  (FAR struct mtd_protect_s *)ptr_arg;
+
+                prot->startblock += dev->firstsector;
+              }
+
+            ret = parent->u.i_bops->ioctl(parent, cmd, arg);
+            if (ret >= 0)
+              {
+                if (cmd == BIOC_XIPBASE)
+                  {
+                    FAR void **base = (FAR void **)ptr_arg;
+
+                    *(FAR uint8_t *)base +=
+                          dev->firstsector * dev->sectorsize;
+                  }
+                else if (cmd == MTDIOC_GEOMETRY)
+                  {
+                    FAR struct mtd_geometry_s *mgeo =
+                      (FAR struct mtd_geometry_s *)ptr_arg;
+                    uint32_t blkper = mgeo->erasesize / mgeo->blocksize;
+
+                    mgeo->neraseblocks = dev->nsectors / blkper;
+                  }
+              }
+          }
+        break;
     }
 
   return ret;
@@ -302,6 +321,7 @@ int register_blockpartition(FAR const char *partition,
                             size_t firstsector, size_t nsectors)
 {
   FAR struct part_struct_s *dev;
+  struct geometry geo;
   int ret;
 
   /* Allocate a partition device structure */
@@ -331,6 +351,16 @@ int register_blockpartition(FAR const char *partition,
       goto errout_free;
     }
 
+  /* Get sector size */
+
+  ret = dev->parent->u.i_bops->geometry(dev->parent, &geo);
+  if (ret < 0)
+    {
+      goto errout_free;
+    }
+
+  dev->sectorsize = geo.geo_sectorsize;
+
   /* Inode private data is a reference to the partition device structure */
 
   ret = register_blockdriver(partition, &g_part_bops, mode, dev);

Reply via email to