Squashed commit of the following:
fs/partition/fs_partition.c: Add PTABLE parser
fs/partion: Add a partition parser framework
fs/driver/fs_blockpartition.c: Add register_blockpartition for block partition
This commit is contained in:
parent
8b5ac497ad
commit
70a0bf0849
11 changed files with 1032 additions and 0 deletions
|
|
@ -77,6 +77,7 @@ source fs/semaphore/Kconfig
|
|||
source fs/mqueue/Kconfig
|
||||
source fs/shm/Kconfig
|
||||
source fs/mmap/Kconfig
|
||||
source fs/partition/Kconfig
|
||||
source fs/fat/Kconfig
|
||||
source fs/nfs/Kconfig
|
||||
source fs/nxffs/Kconfig
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ ifneq ($(CONFIG_NFILE_DESCRIPTORS),0)
|
|||
ifneq ($(CONFIG_DISABLE_MOUNTPOINT),y)
|
||||
|
||||
include mount/Make.defs
|
||||
include partition/Make.defs
|
||||
include fat/Make.defs
|
||||
include romfs/Make.defs
|
||||
include cromfs/Make.defs
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ CSRCS += fs_registerdriver.c fs_unregisterdriver.c
|
|||
ifneq ($(CONFIG_DISABLE_MOUNTPOINT),y)
|
||||
CSRCS += fs_registerblockdriver.c fs_unregisterblockdriver.c
|
||||
CSRCS += fs_findblockdriver.c fs_openblockdriver.c fs_closeblockdriver.c
|
||||
CSRCS += fs_blockpartition.c
|
||||
|
||||
ifneq ($(CONFIG_DISABLE_PSEUDOFS_OPERATIONS),y)
|
||||
CSRCS += fs_blockproxy.c
|
||||
|
|
|
|||
348
fs/driver/fs_blockpartition.c
Normal file
348
fs/driver/fs_blockpartition.c
Normal file
|
|
@ -0,0 +1,348 @@
|
|||
/****************************************************************************
|
||||
* fs/driver/fs_blockpartition.c
|
||||
*
|
||||
* Copyright (C) 2018 Pinecone Inc. All rights reserved.
|
||||
* Author: Xiang Xiao <xiaoxiang@pinecone.net>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <nuttx/fs/fs.h>
|
||||
#include <nuttx/fs/ioctl.h>
|
||||
#include <nuttx/kmalloc.h>
|
||||
|
||||
#include "driver/driver.h"
|
||||
#include "inode/inode.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
struct part_struct_s
|
||||
{
|
||||
FAR struct inode *parent;
|
||||
size_t firstsector;
|
||||
size_t nsectors;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static int part_open(FAR struct inode *inode);
|
||||
static int part_close(FAR struct inode *inode);
|
||||
static ssize_t part_read(FAR struct inode *inode, unsigned char *buffer,
|
||||
size_t start_sector, unsigned int nsectors);
|
||||
#ifdef CONFIG_FS_WRITABLE
|
||||
static ssize_t part_write(FAR struct inode *inode, const unsigned char *buffer,
|
||||
size_t start_sector, unsigned int nsectors);
|
||||
#endif
|
||||
static int part_geometry(FAR struct inode *inode, struct geometry *geometry);
|
||||
static int part_ioctl(FAR struct inode *inode, int cmd, unsigned long arg);
|
||||
|
||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||
static int part_unlink(FAR struct inode *inode);
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static const struct block_operations g_part_bops =
|
||||
{
|
||||
part_open, /* open */
|
||||
part_close, /* close */
|
||||
part_read, /* read */
|
||||
#ifdef CONFIG_FS_WRITABLE
|
||||
part_write, /* write */
|
||||
#else
|
||||
NULL, /* write */
|
||||
#endif
|
||||
part_geometry, /* geometry */
|
||||
part_ioctl /* ioctl */
|
||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||
, part_unlink /* unlink */
|
||||
#endif
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: part_open
|
||||
*
|
||||
* Description: Open the block device
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int part_open(FAR struct inode *inode)
|
||||
{
|
||||
FAR struct part_struct_s *dev = inode->i_private;
|
||||
FAR struct inode *parent = dev->parent;
|
||||
int ret = OK;
|
||||
|
||||
/* Open the parent block device */
|
||||
|
||||
if (parent->u.i_bops->open)
|
||||
{
|
||||
ret = parent->u.i_bops->open(parent);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: part_close
|
||||
*
|
||||
* Description: close the block device
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int part_close(FAR struct inode *inode)
|
||||
{
|
||||
FAR struct part_struct_s *dev = inode->i_private;
|
||||
FAR struct inode *parent = dev->parent;
|
||||
int ret = OK;
|
||||
|
||||
if (parent->u.i_bops->close)
|
||||
{
|
||||
ret = parent->u.i_bops->close(parent);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: part_read
|
||||
*
|
||||
* Description: Read the specified number of sectors
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static ssize_t part_read(FAR struct inode *inode, unsigned char *buffer,
|
||||
size_t start_sector, unsigned int nsectors)
|
||||
{
|
||||
FAR struct part_struct_s *dev = inode->i_private;
|
||||
FAR struct inode *parent = dev->parent;
|
||||
|
||||
if (start_sector + nsectors > dev->nsectors)
|
||||
{
|
||||
nsectors = dev->nsectors - start_sector;
|
||||
}
|
||||
|
||||
start_sector += dev->firstsector;
|
||||
|
||||
return parent->u.i_bops->read(parent, buffer, start_sector, nsectors);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: part_write
|
||||
*
|
||||
* Description: Write (or buffer) the specified number of sectors
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_FS_WRITABLE
|
||||
static ssize_t part_write(FAR struct inode *inode, const unsigned char *buffer,
|
||||
size_t start_sector, unsigned int nsectors)
|
||||
{
|
||||
FAR struct part_struct_s *dev = inode->i_private;
|
||||
FAR struct inode *parent = dev->parent;
|
||||
|
||||
if (start_sector + nsectors > dev->nsectors)
|
||||
{
|
||||
nsectors = dev->nsectors - start_sector;
|
||||
}
|
||||
|
||||
start_sector += dev->firstsector;
|
||||
|
||||
return parent->u.i_bops->write(parent, buffer, start_sector, nsectors);
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: part_geometry
|
||||
*
|
||||
* Description: Return device geometry
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int part_geometry(FAR struct inode *inode, struct geometry *geometry)
|
||||
{
|
||||
FAR struct part_struct_s *dev = inode->i_private;
|
||||
FAR struct inode *parent = dev->parent;
|
||||
int ret;
|
||||
|
||||
ret = parent->u.i_bops->geometry(parent, geometry);
|
||||
if (ret >= 0)
|
||||
{
|
||||
geometry->geo_nsectors = dev->nsectors;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: part_ioctl
|
||||
*
|
||||
* Description: Return device geometry
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int part_ioctl(FAR struct inode *inode, int cmd, unsigned long arg)
|
||||
{
|
||||
FAR struct part_struct_s *dev = inode->i_private;
|
||||
FAR struct inode *parent = dev->parent;
|
||||
int ret = -ENOTTY;
|
||||
|
||||
if (parent->u.i_bops->ioctl)
|
||||
{
|
||||
ret = parent->u.i_bops->ioctl(parent, cmd, arg);
|
||||
if (ret >= 0 && cmd == BIOC_XIPBASE)
|
||||
{
|
||||
FAR void **base = (FAR void **)arg;
|
||||
struct geometry geo;
|
||||
|
||||
ret = parent->u.i_bops->geometry(parent, &geo);
|
||||
if (ret >= 0)
|
||||
{
|
||||
*base += dev->firstsector * geo.geo_sectorsize;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: part_unlink
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
|
||||
static int part_unlink(FAR struct inode *inode)
|
||||
{
|
||||
FAR struct part_struct_s *dev = inode->i_private;
|
||||
FAR struct inode *parent = dev->parent;
|
||||
|
||||
inode_release(parent);
|
||||
kmm_free(dev);
|
||||
|
||||
return OK;
|
||||
}
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: register_blockpartition
|
||||
*
|
||||
* Description:
|
||||
* Register a block partition driver inode the pseudo file system.
|
||||
*
|
||||
* Input Parameters:
|
||||
* partition - The path to the partition inode
|
||||
* parent - The path to the parent inode
|
||||
* firstsector - The offset in sectors to the partition
|
||||
* nsectors - The number of sectors in the partition
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero on success (with the inode point in 'inode'); A negated errno
|
||||
* value is returned on a failure (all error values returned by
|
||||
* inode_reserve):
|
||||
*
|
||||
* EINVAL - 'path' is invalid for this operation
|
||||
* EEXIST - An inode already exists at 'path'
|
||||
* ENOMEM - Failed to allocate in-memory resources for the operation
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int register_blockpartition(FAR const char *partition,
|
||||
mode_t mode, FAR const char *parent,
|
||||
size_t firstsector, size_t nsectors)
|
||||
{
|
||||
FAR struct part_struct_s *dev;
|
||||
int ret;
|
||||
|
||||
/* Allocate a partition device structure */
|
||||
|
||||
dev = kmm_zalloc(sizeof(*dev));
|
||||
if (!dev)
|
||||
{
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dev->firstsector = firstsector;
|
||||
dev->nsectors = nsectors;
|
||||
|
||||
/* Find the block driver */
|
||||
|
||||
if (mode & (S_IWOTH | S_IWGRP | S_IWUSR))
|
||||
{
|
||||
ret = find_blockdriver(parent, 0, &dev->parent);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = find_blockdriver(parent, MS_RDONLY, &dev->parent);
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_free;
|
||||
}
|
||||
|
||||
/* Inode private data is a reference to the partition device structure */
|
||||
|
||||
ret = register_blockdriver(partition, &g_part_bops, mode, dev);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto errout_release;
|
||||
}
|
||||
|
||||
return OK;
|
||||
|
||||
errout_release:
|
||||
inode_release(dev->parent);
|
||||
errout_free:
|
||||
kmm_free(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
16
fs/partition/Kconfig
Normal file
16
fs/partition/Kconfig
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see the file kconfig-language.txt in the NuttX tools repository.
|
||||
#
|
||||
|
||||
if !DISABLE_MOUNTPOINT
|
||||
|
||||
menu "Partition Table"
|
||||
|
||||
config PTABLE_PARTITION
|
||||
bool "PTABLE support"
|
||||
default n
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
51
fs/partition/Make.defs
Normal file
51
fs/partition/Make.defs
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
############################################################################
|
||||
# fs/partition/Make.defs
|
||||
#
|
||||
# Copyright (C) 2018 Pinecone Inc. All rights reserved.
|
||||
# Author: Xiang Xiao <xiaoxiang@pinecone.net>
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in
|
||||
# the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# 3. Neither the name NuttX nor the names of its contributors may be
|
||||
# used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
# POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
# Don't build anything if mountpoint doesn't support
|
||||
|
||||
ifneq ($(CONFIG_DISABLE_MOUNTPOINT),y)
|
||||
|
||||
CSRCS += fs_partition.c
|
||||
|
||||
ifeq ($(CONFIG_PTABLE_PARTITION),y)
|
||||
CSRCS += fs_ptable.c
|
||||
endif
|
||||
|
||||
# Include partition build support
|
||||
|
||||
DEPPATH += --dep-path partition
|
||||
VPATH += :partition
|
||||
|
||||
endif
|
||||
209
fs/partition/fs_partition.c
Normal file
209
fs/partition/fs_partition.c
Normal file
|
|
@ -0,0 +1,209 @@
|
|||
/****************************************************************************
|
||||
* fs/partition/fs_partition.c
|
||||
*
|
||||
* Copyright (C) 2018 Pinecone Inc. All rights reserved.
|
||||
* Author: Xiang Xiao <xiaoxiang@pinecone.net>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <sys/mount.h>
|
||||
|
||||
#include "partition.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
typedef CODE int
|
||||
(*partition_parser_t)(FAR struct partition_state_s *state,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg);
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
static int parse_partition(FAR struct partition_state_s *state,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg);
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
#ifdef CONFIG_PTABLE_PARTITION
|
||||
int parse_ptable_partition(FAR struct partition_state_s *state,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg);
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static const partition_parser_t g_parser[] =
|
||||
{
|
||||
#ifdef CONFIG_PTABLE_PARTITION
|
||||
parse_ptable_partition,
|
||||
#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: parse_partition
|
||||
*
|
||||
* Description:
|
||||
* parse the partition table.
|
||||
*
|
||||
* Input Parameters:
|
||||
* state - The partition table state
|
||||
* handler - The function to be called for each found partition
|
||||
* arg - A caller provided value to return with the handler
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero on success; A negated errno value is returned on a failure
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
static int parse_partition(FAR struct partition_state_s *state,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg)
|
||||
{
|
||||
int i, ret = 0;
|
||||
|
||||
for (i = 0; g_parser[i] != NULL; i++)
|
||||
{
|
||||
ret = g_parser[i](state, handler, arg);
|
||||
if (ret >= 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: parse_block_partition
|
||||
*
|
||||
* Description:
|
||||
* parse the partition table on a block device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* path - The block device to be parsed
|
||||
* handler - The function to be called for each found partition
|
||||
* arg - A caller provided value to return with the handler
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero on success; A negated errno value is returned on a failure
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int parse_block_partition(FAR const char *path,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg)
|
||||
{
|
||||
struct partition_state_s state;
|
||||
struct geometry geo;
|
||||
int ret;
|
||||
|
||||
ret = open_blockdriver(path, MS_RDONLY, &state.blk);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = state.blk->u.i_bops->geometry(state.blk, &geo);
|
||||
if (ret >= 0)
|
||||
{
|
||||
state.mtd = NULL;
|
||||
state.blocksize = geo.geo_sectorsize;
|
||||
state.erasesize = geo.geo_sectorsize;
|
||||
state.nblocks = geo.geo_nsectors;
|
||||
|
||||
ret = parse_partition(&state, handler, arg);
|
||||
}
|
||||
|
||||
close_blockdriver(state.blk);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: parse_mtd_partition
|
||||
*
|
||||
* Description:
|
||||
* parse the partition table on a mtd device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* mtd - The MTD device to be parsed
|
||||
* handler - The function to be called for each found partition
|
||||
* arg - A caller provided value to return with the handler
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero on success; A negated errno value is returned on a failure
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int parse_mtd_partition(FAR struct mtd_dev_s *mtd,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg)
|
||||
{
|
||||
struct partition_state_s state;
|
||||
struct mtd_geometry_s geo;
|
||||
int ret;
|
||||
|
||||
ret = mtd->ioctl(mtd, MTDIOC_GEOMETRY, (unsigned long)&geo);
|
||||
if (ret < 0)
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
state.blk = NULL;
|
||||
state.mtd = mtd;
|
||||
state.blocksize = geo.blocksize;
|
||||
state.erasesize = geo.erasesize;
|
||||
state.nblocks = geo.neraseblocks;
|
||||
state.nblocks *= geo.erasesize / geo.blocksize;
|
||||
|
||||
return parse_partition(&state, handler, arg);
|
||||
}
|
||||
|
||||
168
fs/partition/fs_ptable.c
Normal file
168
fs/partition/fs_ptable.c
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
/****************************************************************************
|
||||
* fs/partition/fs_ptable.c
|
||||
*
|
||||
* Copyright (C) 2018 Pinecone Inc. All rights reserved.
|
||||
* Author: Xiang Xiao <xiaoxiang@pinecone.net>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/kmalloc.h>
|
||||
|
||||
#include "partition.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define PTABLE_MAGIC_LEN 8
|
||||
#define PTABLE_VERSION_LEN 8
|
||||
#define PTABLE_NAME_LEN 16
|
||||
|
||||
#define PTABLE_MAGIC "PTABLE0"
|
||||
#define PTABLE_FLAG_END (1 << 0)
|
||||
|
||||
/****************************************************************************
|
||||
* Private Types
|
||||
****************************************************************************/
|
||||
|
||||
struct ptable_entry_s
|
||||
{
|
||||
char name[PTABLE_NAME_LEN];
|
||||
uint64_t offset;
|
||||
uint64_t length;
|
||||
uint64_t flags;
|
||||
uint64_t reserve;
|
||||
};
|
||||
|
||||
struct ptable_s
|
||||
{
|
||||
char magic[PTABLE_MAGIC_LEN];
|
||||
char version[PTABLE_VERSION_LEN];
|
||||
struct ptable_entry_s entries[];
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: parse_ptable_partition
|
||||
*
|
||||
* Description:
|
||||
* parse the PTABLE partition table.
|
||||
*
|
||||
* Input Parameters:
|
||||
* state - The partition table state
|
||||
* handler - The function to be called for each found partition
|
||||
* arg - A caller provided value to return with the handler
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero on success; A negated errno value is returned on a failure
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int parse_ptable_partition(FAR struct partition_state_s *state,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg)
|
||||
{
|
||||
FAR struct ptable_entry_s *entry;
|
||||
FAR struct ptable_s *ptable;
|
||||
size_t blkpererase;
|
||||
size_t block;
|
||||
int ret = OK;
|
||||
|
||||
/* Allocate one erase block memory */
|
||||
|
||||
ptable = kmm_malloc(state->erasesize);
|
||||
if (ptable == NULL)
|
||||
{
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* PTABLE locate in the first or last erase block */
|
||||
|
||||
blkpererase = state->erasesize / state->blocksize;
|
||||
for (block = 0;
|
||||
block < state->nblocks;
|
||||
block += state->nblocks - blkpererase)
|
||||
{
|
||||
ret = read_partition_block(state, ptable, block, blkpererase);
|
||||
if (ret < 0)
|
||||
{
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (strcmp(ptable->magic, PTABLE_MAGIC) == 0)
|
||||
{
|
||||
break; /* Find the magic number */
|
||||
}
|
||||
}
|
||||
|
||||
if (block >= state->nblocks)
|
||||
{
|
||||
ret = -EFTYPE;
|
||||
goto out;
|
||||
}
|
||||
|
||||
entry = ptable->entries;
|
||||
while (!(entry->flags & PTABLE_FLAG_END))
|
||||
{
|
||||
struct partition_s part;
|
||||
|
||||
/* Convert the entry to partition */
|
||||
|
||||
strncpy(part.name, entry->name, sizeof(part.name));
|
||||
part.index = entry - ptable->entries;
|
||||
part.firstblock = entry->offset / state->blocksize;
|
||||
part.nblocks = entry->length / state->blocksize;
|
||||
part.blocksize = state->blocksize;
|
||||
|
||||
/* Notify the caller */
|
||||
|
||||
handler(&part, arg);
|
||||
|
||||
/* Move to the next entry */
|
||||
|
||||
entry++;
|
||||
if ((uintptr_t)entry - (uintptr_t)ptable >= state->erasesize)
|
||||
{
|
||||
break; /* Exit, at the end of erase block */
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
kmm_free(ptable);
|
||||
return ret;
|
||||
}
|
||||
|
||||
82
fs/partition/partition.h
Normal file
82
fs/partition/partition.h
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
/****************************************************************************
|
||||
* fs/partition/partition.h
|
||||
*
|
||||
* Copyright (C) 2018 Pinecone Inc. All rights reserved.
|
||||
* Author: Xiang Xiao <xiaoxiangg@pinecone.net>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __FS_PARTITION_PARTITION_H
|
||||
#define __FS_PARTITION_PARTITION_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/fs/fs.h>
|
||||
#include <nuttx/fs/partition.h>
|
||||
#include <nuttx/mtd/mtd.h>
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
struct partition_state_s
|
||||
{
|
||||
FAR struct mtd_dev_s *mtd;
|
||||
FAR struct inode *blk;
|
||||
size_t nblocks;
|
||||
size_t blocksize;
|
||||
size_t erasesize;
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Public Inline Functions
|
||||
****************************************************************************/
|
||||
|
||||
static inline int read_partition_block(FAR struct partition_state_s *state,
|
||||
FAR void *buffer, size_t startblock,
|
||||
size_t nblocks)
|
||||
{
|
||||
if (state->blk)
|
||||
{
|
||||
return state->blk->u.i_bops->read(state->blk, buffer, startblock, nblocks);
|
||||
}
|
||||
else
|
||||
{
|
||||
return state->mtd->bread(state->mtd, startblock, nblocks, buffer);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* CONFIG_DISABLE_MOUNTPOINT */
|
||||
|
||||
#endif /* __FS_PARTITION_PARTITION_H */
|
||||
|
|
@ -547,6 +547,35 @@ int register_blockdriver(FAR const char *path,
|
|||
mode_t mode, FAR void *priv);
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: register_blockpartition
|
||||
*
|
||||
* Description:
|
||||
* Register a block partition driver inode the pseudo file system.
|
||||
*
|
||||
* Input Parameters:
|
||||
* partition - The path to the partition inode
|
||||
* parent - The path to the parent inode
|
||||
* firstsector - The offset in sectors to the partition
|
||||
* nsectors - The number of sectors in the partition
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero on success (with the inode point in 'inode'); A negated errno
|
||||
* value is returned on a failure (all error values returned by
|
||||
* inode_reserve):
|
||||
*
|
||||
* EINVAL - 'path' is invalid for this operation
|
||||
* EEXIST - An inode already exists at 'path'
|
||||
* ENOMEM - Failed to allocate in-memory resources for the operation
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
int register_blockpartition(FAR const char *partition,
|
||||
mode_t mode, FAR const char *parent,
|
||||
size_t firstsector, size_t nsectors);
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Name: unregister_driver
|
||||
*
|
||||
|
|
|
|||
126
include/nuttx/fs/partition.h
Normal file
126
include/nuttx/fs/partition.h
Normal file
|
|
@ -0,0 +1,126 @@
|
|||
/****************************************************************************
|
||||
* include/nuttx/fs/partition.h
|
||||
*
|
||||
* Copyright (C) 2018 Pinecone Inc. All rights reserved.
|
||||
* Author: Xiang Xiao <xiaoxiangg@pinecone.net>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __INCLUDE_NUTTX_FS_PARTITION_H
|
||||
#define __INCLUDE_NUTTX_FS_PARTITION_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include <limits.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef CONFIG_DISABLE_MOUNTPOINT
|
||||
|
||||
#ifdef __cplusplus
|
||||
#define EXTERN extern "C"
|
||||
extern "C"
|
||||
{
|
||||
#else
|
||||
#define EXTERN extern
|
||||
#endif
|
||||
|
||||
/****************************************************************************
|
||||
* Public Types
|
||||
****************************************************************************/
|
||||
|
||||
struct partition_s
|
||||
{
|
||||
char name[NAME_MAX+1];
|
||||
size_t index;
|
||||
size_t firstblock;
|
||||
size_t nblocks;
|
||||
size_t blocksize;
|
||||
};
|
||||
|
||||
typedef CODE void
|
||||
(*partition_handler_t)(FAR struct partition_s *part, FAR void *arg);
|
||||
|
||||
/****************************************************************************
|
||||
* Public Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Name: parse_block_partition
|
||||
*
|
||||
* Description:
|
||||
* parse the partition table on a block device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* path - The block device to be parsed
|
||||
* handler - The function to be called for each found partition
|
||||
* arg - A caller provided value to return with the handler
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero on success; A negated errno value is returned on a failure
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
int parse_block_partition(FAR const char *path,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: parse_mtd_partition
|
||||
*
|
||||
* Description:
|
||||
* parse the partition table on a mtd device.
|
||||
*
|
||||
* Input Parameters:
|
||||
* mtd - The MTD device to be parsed
|
||||
* handler - The function to be called for each found partition
|
||||
* arg - A caller provided value to return with the handler
|
||||
*
|
||||
* Returned Value:
|
||||
* Zero on success; A negated errno value is returned on a failure
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
struct mtd_dev_s;
|
||||
int parse_mtd_partition(FAR struct mtd_dev_s *mtd,
|
||||
partition_handler_t handler,
|
||||
FAR void *arg);
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_DISABLE_MOUNTPOINT */
|
||||
|
||||
#endif /* __INCLUDE_NUTTX_FS_PARTITION_H */
|
||||
Loading…
Add table
Reference in a new issue