fs/partition: Support BIOC_PARTINFO
Signed-off-by: Xiang Xiao <xiaoxiang@xiaomi.com>
This commit is contained in:
parent
1dfcc6ab49
commit
162893cc3b
@ -43,6 +43,7 @@
|
|||||||
struct part_struct_s
|
struct part_struct_s
|
||||||
{
|
{
|
||||||
FAR struct inode *parent;
|
FAR struct inode *parent;
|
||||||
|
size_t sectorsize;
|
||||||
size_t firstsector;
|
size_t firstsector;
|
||||||
size_t nsectors;
|
size_t nsectors;
|
||||||
};
|
};
|
||||||
@ -214,6 +215,27 @@ static int part_ioctl(FAR struct inode *inode, int cmd, unsigned long arg)
|
|||||||
FAR struct inode *parent = dev->parent;
|
FAR struct inode *parent = dev->parent;
|
||||||
int ret = -ENOTTY;
|
int ret = -ENOTTY;
|
||||||
|
|
||||||
|
switch (cmd)
|
||||||
|
{
|
||||||
|
case BIOC_PARTINFO:
|
||||||
|
{
|
||||||
|
FAR struct partition_info_s *info =
|
||||||
|
(FAR struct partition_info_s *)ptr_arg;
|
||||||
|
if (info != NULL)
|
||||||
|
{
|
||||||
|
info->magic = 0;
|
||||||
|
info->numsectors = dev->nsectors;
|
||||||
|
info->sectorsize = dev->sectorsize;
|
||||||
|
info->startsector = dev->firstsector;
|
||||||
|
|
||||||
|
strncpy(info->parent, dev->parent->i_name, NAME_MAX);
|
||||||
|
|
||||||
|
ret = OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
if (parent->u.i_bops->ioctl)
|
if (parent->u.i_bops->ioctl)
|
||||||
{
|
{
|
||||||
if (cmd == MTDIOC_PROTECT || cmd == MTDIOC_UNPROTECT)
|
if (cmd == MTDIOC_PROTECT || cmd == MTDIOC_UNPROTECT)
|
||||||
@ -230,14 +252,9 @@ static int part_ioctl(FAR struct inode *inode, int cmd, unsigned long arg)
|
|||||||
if (cmd == BIOC_XIPBASE)
|
if (cmd == BIOC_XIPBASE)
|
||||||
{
|
{
|
||||||
FAR void **base = (FAR void **)ptr_arg;
|
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 +=
|
*(FAR uint8_t *)base +=
|
||||||
dev->firstsector * geo.geo_sectorsize;
|
dev->firstsector * dev->sectorsize;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (cmd == MTDIOC_GEOMETRY)
|
else if (cmd == MTDIOC_GEOMETRY)
|
||||||
{
|
{
|
||||||
@ -249,6 +266,8 @@ static int part_ioctl(FAR struct inode *inode, int cmd, unsigned long arg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -302,6 +321,7 @@ int register_blockpartition(FAR const char *partition,
|
|||||||
size_t firstsector, size_t nsectors)
|
size_t firstsector, size_t nsectors)
|
||||||
{
|
{
|
||||||
FAR struct part_struct_s *dev;
|
FAR struct part_struct_s *dev;
|
||||||
|
struct geometry geo;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Allocate a partition device structure */
|
/* Allocate a partition device structure */
|
||||||
@ -331,6 +351,16 @@ int register_blockpartition(FAR const char *partition,
|
|||||||
goto errout_free;
|
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 */
|
/* Inode private data is a reference to the partition device structure */
|
||||||
|
|
||||||
ret = register_blockdriver(partition, &g_part_bops, mode, dev);
|
ret = register_blockdriver(partition, &g_part_bops, mode, dev);
|
||||||
|
Loading…
Reference in New Issue
Block a user