Add NXFFS ioctls
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3566 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
4aa6da9344
commit
77d4700a62
@ -47,6 +47,7 @@
|
||||
#include <debug.h>
|
||||
|
||||
#include <nuttx/fs.h>
|
||||
#include <nuttx/ioctl.h>
|
||||
#include <nuttx/mtd.h>
|
||||
|
||||
#include "nxffs.h"
|
||||
@ -82,6 +83,7 @@
|
||||
int nxffs_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
||||
{
|
||||
FAR struct nxffs_volume_s *volume;
|
||||
int ret;
|
||||
|
||||
fvdbg("cmd: %d arg: %08lx\n", cmd, arg);
|
||||
|
||||
@ -94,7 +96,45 @@ int nxffs_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
||||
volume = filep->f_inode->i_private;
|
||||
DEBUGASSERT(volume != NULL);
|
||||
|
||||
/* No ioctl commands yet supported */
|
||||
/* Get exclusive access to the volume. Note that the volume exclsem
|
||||
* protects the open file list.
|
||||
*/
|
||||
|
||||
return -ENOTTY;
|
||||
ret = sem_wait(&volume->exclsem);
|
||||
if (ret != OK)
|
||||
{
|
||||
ret = -errno;
|
||||
fdbg("sem_wait failed: %d\n", ret);
|
||||
goto errout;
|
||||
}
|
||||
|
||||
/* Only a reformat command is supported */
|
||||
|
||||
if (cmd == FIOC_REFORMAT)
|
||||
{
|
||||
fvdbg("Reformat command\n");
|
||||
|
||||
/* We cannot reformat the volume if there are any open inodes */
|
||||
|
||||
if (volume->ofiles)
|
||||
{
|
||||
fdbg("Open files\n");
|
||||
ret = -EBUSY;
|
||||
goto errout_with_semaphore;
|
||||
}
|
||||
|
||||
/* Re-format the volume -- all is lost */
|
||||
|
||||
ret = nxffs_reformat(volume);
|
||||
goto errout_with_semaphore;
|
||||
}
|
||||
|
||||
/* No other commands supported */
|
||||
|
||||
ret = -ENOTTY;
|
||||
|
||||
errout_with_semaphore:
|
||||
sem_post(&volume->exclsem);
|
||||
errout:
|
||||
return ret;
|
||||
}
|
||||
|
@ -94,17 +94,21 @@
|
||||
* return (void*) base address
|
||||
* of file
|
||||
*/
|
||||
#define FIOC_REFORMAT _FIOC(0x0002) /* IN: None
|
||||
* OUT: None
|
||||
*/
|
||||
|
||||
/* NuttX file system ioctl definitions */
|
||||
|
||||
#define _DIOCVALID(c) (_IOC_TYPE(c)==_DIOCBASE)
|
||||
#define _DIOC(nr) _IOC(_DIOCBASE,nr)
|
||||
|
||||
#define DIOC_GETPRIV _DIOC(0x0001) /* IN: Location to return handle (void **)
|
||||
#define DIOC_GETPRIV _DIOC(0x0001) /* IN: Location to return handle (void **)
|
||||
* OUT: Reference to internal data
|
||||
* structure. May have a reference
|
||||
* incremented.
|
||||
*/
|
||||
#define DIOC_RELPRIV _DIOC(0x0003) /* IN: None
|
||||
#define DIOC_RELPRIV _DIOC(0x0003) /* IN: None
|
||||
* OUT: None, reference obtained by
|
||||
* FIOC_GETPRIV released.
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user