summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-05-12 20:09:37 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-05-12 20:09:37 +0000
commit888ef943d1630348015e8c4a35dfc21d9b207cdb (patch)
tree0c20d722e64e0c5da1544802e5bc0eb480d4d3f2
parent830210f2271fa6b6b27e6f49027af56a4f8e2080 (diff)
downloadnuttx-888ef943d1630348015e8c4a35dfc21d9b207cdb.tar.gz
nuttx-888ef943d1630348015e8c4a35dfc21d9b207cdb.tar.bz2
nuttx-888ef943d1630348015e8c4a35dfc21d9b207cdb.zip
driver private data should be retained in inode, not file
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@215 42af7a65-404d-4744-a932-0658087f49c3
-rw-r--r--nuttx/arch/sim/src/up_blockdevice.c65
1 files changed, 33 insertions, 32 deletions
diff --git a/nuttx/arch/sim/src/up_blockdevice.c b/nuttx/arch/sim/src/up_blockdevice.c
index bf573b323..fee57c95c 100644
--- a/nuttx/arch/sim/src/up_blockdevice.c
+++ b/nuttx/arch/sim/src/up_blockdevice.c
@@ -94,8 +94,7 @@ static const struct block_operations g_bops =
static int up_open(FAR struct file *filp)
{
- filp->f_priv = (void*)up_deviceimage();
- return 0;
+ return OK;
}
/****************************************************************************
@@ -107,12 +106,7 @@ static int up_open(FAR struct file *filp)
static int up_close(FAR struct file *filp)
{
- if (filp->f_priv)
- {
- free(filp->f_priv);
- filp->f_priv = NULL;
- }
- return 0;
+ return OK;
}
/****************************************************************************
@@ -125,18 +119,21 @@ static int up_close(FAR struct file *filp)
static ssize_t up_read(FAR struct file *filp, char *buffer,
size_t start_sector, size_t nsectors)
{
- char *src = filp->f_priv;
- if (src &&
- start_sector < NSECTORS &&
- start_sector + nsectors < NSECTORS)
- {
- memcpy(buffer, &src[start_sector*LOGICAL_SECTOR_SIZE], nsectors*LOGICAL_SECTOR_SIZE);
- return OK;
- }
- else
+ struct inode *inode = filp->f_inode;
+ if (inode)
{
- return -EINVAL;
+ char *src = inode->i_private;
+ if (src &&
+ start_sector < NSECTORS &&
+ start_sector + nsectors < NSECTORS)
+ {
+ memcpy(buffer,
+ &src[start_sector*LOGICAL_SECTOR_SIZE],
+ nsectors*LOGICAL_SECTOR_SIZE);
+ return OK;
+ }
}
+ return -EINVAL;
}
/****************************************************************************
@@ -149,18 +146,21 @@ static ssize_t up_read(FAR struct file *filp, char *buffer,
static ssize_t up_write(FAR struct file *filp, const char *buffer,
size_t start_sector, size_t nsectors)
{
- char *dest = filp->f_priv;
- if (dest &&
- start_sector < NSECTORS &&
- start_sector + nsectors < NSECTORS)
+ struct inode *inode = filp->f_inode;
+ if (inode)
{
- memcpy(&dest[start_sector*LOGICAL_SECTOR_SIZE], buffer, nsectors*LOGICAL_SECTOR_SIZE);
- return OK;
- }
- else
- {
- return -EINVAL;
+ char *dest = inode->i_private;
+ if (dest &&
+ start_sector < NSECTORS &&
+ start_sector + nsectors < NSECTORS)
+ {
+ memcpy(&dest[start_sector*LOGICAL_SECTOR_SIZE],
+ buffer,
+ nsectors*LOGICAL_SECTOR_SIZE);
+ return OK;
+ }
}
+ return -EINVAL;
}
/****************************************************************************
@@ -172,9 +172,10 @@ static ssize_t up_write(FAR struct file *filp, const char *buffer,
static size_t up_geometry(FAR struct file *filp, struct geometry *geometry)
{
+ struct inode *inode = filp->f_inode;
if (geometry)
{
- geometry->geo_available = (filp->f_priv != NULL);
+ geometry->geo_available = (inode->i_private != NULL);
geometry->geo_nsectors = NSECTORS;
geometry->geo_sectorsize = LOGICAL_SECTOR_SIZE;
return OK;
@@ -195,7 +196,7 @@ static size_t up_geometry(FAR struct file *filp, struct geometry *geometry)
void up_registerblockdevice(void)
{
- (void)register_blockdriver("/dev/blkdev", &g_bops, 0, NULL);
+ /* Inode private data is a filesystem image */
+ void *priv = (void*)up_deviceimage();
+ (void)register_blockdriver("/dev/blkdev", &g_bops, 0, priv);
}
-
-