diff --git a/ChangeLog b/ChangeLog index 4dbe42cd16..4b97bd8dfe 100755 --- a/ChangeLog +++ b/ChangeLog @@ -11159,3 +11159,7 @@ convert a regular file (or driver file) to an MTD device. This is useful for testing on the simulation using the hostfs. From Ken Petit (2015-11-25). + * drivers/loop: Add a loop character device. losetup() and + loteardown() should not be called directory from applications. + Rather, these functions are now available as IOCTL commands to the + loop driver (2015-11-25). diff --git a/TODO b/TODO index bc792e6236..822cec198c 100644 --- a/TODO +++ b/TODO @@ -439,7 +439,6 @@ o Kernel/Protected Build COMMAND KERNEL INTERFACE(s) -------- ---------------------------------------------- - losetup losetup(), loteardown() mkfatfs mkfatfs mkrd ramdisk_register() ps sched_foreach() @@ -454,22 +453,6 @@ o Kernel/Protected Build http://git.busybox.net/busybox/tree/util-linux/mkfs_vfat.c - Here is how the Busybox/Linux losetup works: - - This is the busybox losetup(): - - http://git.busybox.net/busybox/tree/util-linux/losetup.c . - - You can see that it relies on query_loop(), set_loop(), and - del_loop() to do the really work. query_loop() and friends - are here: - - http://git.busybox.net/busybox/tree/libbb/loop.c. - - They each open a device and interface with it using ioctl calls. - That is probably how NuttX should do things as well. But that - is pretty much a redesign. - Status: Open Priority: Medium/High -- the kernel build configuration is not fully fielded yet. diff --git a/arch b/arch index 6fa995b0aa..994be48b7d 160000 --- a/arch +++ b/arch @@ -1 +1 @@ -Subproject commit 6fa995b0aac7816b4250c41a737309417f6e2d1e +Subproject commit 994be48b7dfe1dffd1fa9fdfa8dd1468bf5d7b7b diff --git a/configs b/configs index bf0c883295..931d2ed279 160000 --- a/configs +++ b/configs @@ -1 +1 @@ -Subproject commit bf0c88329540d1e674e0c2bfeee2350e7898c5b5 +Subproject commit 931d2ed27909e6265eb2eefae1346b758c37a739 diff --git a/drivers/loop/Kconfig b/drivers/loop/Kconfig index 06fbd8ddea..eeeb139882 100644 --- a/drivers/loop/Kconfig +++ b/drivers/loop/Kconfig @@ -3,7 +3,7 @@ # see the file kconfig-language.txt in the NuttX tools repository. # -config LOOP +config EEV_LOOP bool "Enable loop device" default n ---help--- diff --git a/drivers/loop/Make.defs b/drivers/loop/Make.defs index 04c8f65103..a7c933667c 100644 --- a/drivers/loop/Make.defs +++ b/drivers/loop/Make.defs @@ -39,8 +39,8 @@ ifneq ($(CONFIG_DISABLE_MOUNTPOINT),y) # Include loop device support -ifneq ($(CONFIG_LOOP),y) -# CSRCS += loop.c +ifeq ($(CONFIG_DEV_LOOP),y) + CSRCS += loop.c endif CSRCS += losetup.c diff --git a/drivers/loop/loop.c b/drivers/loop/loop.c new file mode 100644 index 0000000000..1345b5417d --- /dev/null +++ b/drivers/loop/loop.c @@ -0,0 +1,179 @@ +/**************************************************************************** + * drivers/loop/loop.c + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include +#include +#include +#include + +#include +#include + +#ifdef CONFIG_DEV_LOOP + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +static ssize_t loop_read(FAR struct file *filep, FAR char *buffer, + size_t buflen); +static ssize_t loop_write(FAR struct file *filep, FAR const char *buffer, + size_t buflen); +static int loop_ioctl(FAR struct file *filep, int cmd, unsigned long arg); + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const struct file_operations loop_fops = +{ + 0, /* open */ + 0, /* close */ + loop_read, /* read */ + loop_write, /* write */ + 0, /* seek */ + loop_ioctl /* ioctl */ +#ifndef CONFIG_DISABLE_POLL + , 0 /* poll */ +#endif +}; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: loop_read + ****************************************************************************/ + +static ssize_t loop_read(FAR struct file *filep, FAR char *buffer, size_t len) +{ + return 0; /* Return EOF */ +} + +/**************************************************************************** + * Name: loop_write + ****************************************************************************/ + +static ssize_t loop_write(FAR struct file *filep, FAR const char *buffer, size_t len) +{ + return len; /* Say that everything was written */ +} + +/**************************************************************************** + * Name: loop_ioctl + ****************************************************************************/ + +static int loop_ioctl(FAR struct file *filep, int cmd, unsigned long arg) +{ + int ret; + + switch (cmd) + { + /* Command: LOOPIOC_SETUP + * Description: Setup the loop device + * Argument: A pointer to a read-only instance of struct losetup_s. + * Dependencies: The loop device must be enabled (CONFIG_DEV_LOOP=y) + */ + + case LOOPIOC_SETUP: + { + FAR struct losetup_s *setup = (FAR struct losetup_s *)((uintptr_t)arg); + + if (setup == NULL) + { + ret = -EINVAL; + } + else + { + ret = losetup(setup->devname, setup->filename, setup->sectsize, + setup->offset, setup->readonly); + } + } + break; + + /* Command: LOOPIOC_TEARDOWN + * Description: Teardown a loop device previously setup vis LOOPIOC_SETUP + * Argument: A read-able pointer to the path of the device to be + * torn down + * Dependencies: The loop device must be enabled (CONFIG_DEV_LOOP=y) + */ + + case LOOPIOC_TEARDOWN: + { + FAR const char *devname = (FAR const char *)((uintptr_t)arg); + + if (devname == NULL) + { + ret = -EINVAL; + } + else + { + ret = loteardown(devname); + } + } + break; + + default: + ret = -ENOTTY; + } + + return ret; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: loop_register + * + * Description: + * Register /dev/null + * + ****************************************************************************/ + +void loop_register(void) +{ + (void)register_driver("/dev/loop", &loop_fops, 0666, NULL); +} + +#endif /* CONFIG_DEV_LOOP */ diff --git a/drivers/loop/losetup.c b/drivers/loop/losetup.c index a70bbe2fc5..dadd44891c 100644 --- a/drivers/loop/losetup.c +++ b/drivers/loop/losetup.c @@ -1,5 +1,5 @@ /**************************************************************************** - * drivers/losetup.c + * drivers/loop/losetup.c * * Copyright (C) 2008-2009, 2011, 2014-2015 Gregory Nutt. All rights reserved. * Author: Gregory Nutt @@ -58,6 +58,7 @@ #include #include +#include /**************************************************************************** * Pre-processor Definitions diff --git a/include/nuttx/fs/fs.h b/include/nuttx/fs/fs.h index b55ba8b505..8de9a1b095 100644 --- a/include/nuttx/fs/fs.h +++ b/include/nuttx/fs/fs.h @@ -897,29 +897,6 @@ void devcrypto_register(void); void devzero_register(void); -/* drivers/loop.c ***********************************************************/ -/**************************************************************************** - * Name: losetup - * - * Description: - * Setup the loop device so that it exports the file referenced by 'filename' - * as a block device. - * - ****************************************************************************/ - -int losetup(FAR const char *devname, FAR const char *filename, - uint16_t sectsize, off_t offset, bool readonly); - -/**************************************************************************** - * Name: loteardown - * - * Description: - * Undo the setup performed by losetup - * - ****************************************************************************/ - -int loteardown(FAR const char *devname); - /* drivers/bch/bchdev_register.c ********************************************/ /**************************************************************************** * Name: bchdev_register diff --git a/include/nuttx/fs/ioctl.h b/include/nuttx/fs/ioctl.h index 2e0d7a1aae..98b61a7eb5 100644 --- a/include/nuttx/fs/ioctl.h +++ b/include/nuttx/fs/ioctl.h @@ -80,6 +80,7 @@ #define _BTNBASE (0x1b00) /* Button ioctl commands */ #define _ULEDBASE (0x1c00) /* User LED ioctl commands */ #define _ZCBASE (0x1d00) /* Zero Cross ioctl commands */ +#define _LOOPBASE (0x1e00) /* Loop device commands */ /* boardctl commands share the same number space */ @@ -360,6 +361,12 @@ #define _ZCIOCVALID(c) (_IOC_TYPE(c)==_ZCBASE) #define _ZCIOC(nr) _IOC(_ZCBASE,nr) +/* Loop driver ioctl definitions ********************************************/ +/* (see nuttx/include/fs/loop.h */ + +#define _LOOPIOCVALID(c) (_IOC_TYPE(c)==_LOOPBASE) +#define _LOOPIOC(nr) _IOC(_LOOPBASE,nr) + /* boardctl() command definitions *******************************************/ #define _BOARDIOCVALID(c) (_IOC_TYPE(c)==_BOARDBASE) diff --git a/include/nuttx/fs/loop.h b/include/nuttx/fs/loop.h new file mode 100644 index 0000000000..1a2a4aec6f --- /dev/null +++ b/include/nuttx/fs/loop.h @@ -0,0 +1,145 @@ +/**************************************************************************** + * include/nuttx/fs/loop.h + * + * Copyright (C) 2015 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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_LOOP_H +#define __INCLUDE_NUTTX_FS_LOOP_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#ifdef CONFIG_DEV_LOOP +/* Loop device IOCTL commands */ + +/* Command: LOOPIOC_SETUP + * Description: Setup the loop device + * Argument: A pointer to a read-only instance of struct losetup_s. + * Dependencies: The loop device must be enabled (CONFIG_DEV_LOOP=y) + */ + +/* Command: LOOPIOC_TEARDOWN + * Description: Teardown a loop device previously setup vis LOOPIOC_SETUP + * Argument: A read-able pointer to the path of the device to be + * torn down + * Dependencies: The loop device must be enabled (CONFIG_DEV_LOOP=y) + */ + +#define LOOPIOC_SETUP _LOOPIOC(0x0001) +#define LOOPIOC_TEARDOWN _LOOPIOC(0x0002) + +#endif + +/**************************************************************************** + * Type Definitions + ****************************************************************************/ + +#ifdef CONFIG_DEV_LOOP +/* This is the structure referred to in the argument to the LOOPIOC_SETUP + * IOCTL command. + */ + +struct losetup_s +{ + FAR const char *devname; /* The loop block device to be created */ + FAR const char *filename; /* The file or character device to use */ + uint16_t sectsize; /* The sector size to use with the block device */ + off_t offset; /* An offset that may be applied to the device */ + bool readonly; /* True: Read access will be supported only */ +}; +#endif + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +#ifdef __cplusplus +#define EXTERN extern "C" +extern "C" +{ +#else +#define EXTERN extern +#endif + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +/**************************************************************************** + * Name: loop_register + * + * Description: + * Register /dev/loop + * + ****************************************************************************/ + +#ifdef CONFIG_DEV_LOOP +void loop_register(void); +#endif + +/**************************************************************************** + * Name: losetup + * + * Description: + * Setup the loop device so that it exports the file referenced by 'filename' + * as a block device. + * + ****************************************************************************/ + +int losetup(FAR const char *devname, FAR const char *filename, + uint16_t sectsize, off_t offset, bool readonly); + +/**************************************************************************** + * Name: loteardown + * + * Description: + * Undo the setup performed by losetup + * + ****************************************************************************/ + +int loteardown(FAR const char *devname); + +#undef EXTERN +#ifdef __cplusplus +} +#endif + +#endif /* __INCLUDE_NUTTX_FS_LOOP_H */