static void yaffs_GrossLock(yaffs_Device *dev)
{
T(YAFFS_TRACE_LOCK, (TSTR("yaffs locking %p\n"), current));
- down(&(yaffs_DeviceToContext(dev)->grossLock));
+ down(&(yaffs_DeviceToLC(dev)->grossLock));
T(YAFFS_TRACE_LOCK, (TSTR("yaffs locked %p\n"), current));
}
static void yaffs_GrossUnlock(yaffs_Device *dev)
{
T(YAFFS_TRACE_LOCK, (TSTR("yaffs unlocking %p\n"), current));
- up(&(yaffs_DeviceToContext(dev)->grossLock));
+ up(&(yaffs_DeviceToLC(dev)->grossLock));
}
#ifdef YAFFS_COMPILE_EXPORTFS
dir->variant.directoryVariant.children.next,
yaffs_Object,siblings);
YINIT_LIST_HEAD(&sc->others);
- ylist_add(&sc->others,&(yaffs_DeviceToContext(dev)->searchContexts));
+ ylist_add(&sc->others,&(yaffs_DeviceToLC(dev)->searchContexts));
}
return sc;
}
struct ylist_head *i;
struct yaffs_SearchContext *sc;
- struct ylist_head *search_contexts = &(yaffs_DeviceToContext(obj->myDev)->searchContexts);
+ struct ylist_head *search_contexts = &(yaffs_DeviceToLC(obj->myDev)->searchContexts);
/* Iterate through the directory search contexts.
yaffs_Device *dev = yaffs_InodeToObject(dir)->myDev;
- if(current != yaffs_DeviceToContext(dev)->readdirProcess)
+ if(current != yaffs_DeviceToLC(dev)->readdirProcess)
yaffs_GrossLock(dev);
T(YAFFS_TRACE_OS,
obj = yaffs_GetEquivalentObject(obj); /* in case it was a hardlink */
/* Can't hold gross lock when calling yaffs_get_inode() */
- if(current != yaffs_DeviceToContext(dev)->readdirProcess)
+ if(current != yaffs_DeviceToLC(dev)->readdirProcess)
yaffs_GrossUnlock(dev);
if (obj) {
yaffs_GrossLock(dev);
- yaffs_DeviceToContext(dev)->readdirProcess = current;
+ yaffs_DeviceToLC(dev)->readdirProcess = current;
offset = f->f_pos;
sc = yaffs_NewSearch(obj);
if(!sc){
retVal = -ENOMEM;
- goto unlock_out;
+ goto out;
}
T(YAFFS_TRACE_OS, (TSTR("yaffs_readdir: starting at %d\n"), (int)offset));
(TSTR("yaffs_readdir: entry . ino %d \n"),
(int)inode->i_ino));
yaffs_GrossUnlock(dev);
- if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR) < 0)
+ if (filldir(dirent, ".", 1, offset, inode->i_ino, DT_DIR) < 0){
+ yaffs_GrossLock(dev);
goto out;
+ }
yaffs_GrossLock(dev);
offset++;
f->f_pos++;
(int)f->f_dentry->d_parent->d_inode->i_ino));
yaffs_GrossUnlock(dev);
if (filldir(dirent, "..", 2, offset,
- f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0)
+ f->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0){
+ yaffs_GrossLock(dev);
goto out;
+ }
yaffs_GrossLock(dev);
offset++;
f->f_pos++;
strlen(name),
offset,
this_inode,
- this_type) < 0)
+ this_type) < 0){
+ yaffs_GrossLock(dev);
goto out;
+ }
yaffs_GrossLock(dev);
yaffs_SearchAdvance(sc);
}
-unlock_out:
- yaffs_DeviceToContext(dev)->readdirProcess = NULL;
-
- yaffs_GrossUnlock(dev);
out:
- yaffs_EndSearch(sc);
+ yaffs_EndSearch(sc);
+ yaffs_DeviceToLC(dev)->readdirProcess = NULL;
+ yaffs_GrossUnlock(dev);
return retVal;
}
static unsigned yaffs_bg_gc_urgency(yaffs_Device *dev)
{
unsigned erasedChunks = dev->nErasedBlocks * dev->param.nChunksPerBlock;
- struct yaffs_LinuxContext *context = yaffs_DeviceToContext(dev);
+ struct yaffs_LinuxContext *context = yaffs_DeviceToLC(dev);
unsigned scatteredFree = 0; /* Free chunks not in an erased block */
if(erasedChunks < dev->nFreeChunks)
static int yaffs_BackgroundThread(void *data)
{
yaffs_Device *dev = (yaffs_Device *)data;
- struct yaffs_LinuxContext *context = yaffs_DeviceToContext(dev);
+ struct yaffs_LinuxContext *context = yaffs_DeviceToLC(dev);
unsigned long now = jiffies;
unsigned long next_dir_update = now;
unsigned long next_gc = now;
static int yaffs_BackgroundStart(yaffs_Device *dev)
{
int retval = 0;
- struct yaffs_LinuxContext *context = yaffs_DeviceToContext(dev);
+ struct yaffs_LinuxContext *context = yaffs_DeviceToLC(dev);
context->bgRunning = 1;
context->bgThread = kthread_run(yaffs_BackgroundThread,
- (void *)dev,"yaffs-bg");
+ (void *)dev,"yaffs-bg-%d",context->mount_id);
if(IS_ERR(context->bgThread)){
retval = PTR_ERR(context->bgThread);
static void yaffs_BackgroundStop(yaffs_Device *dev)
{
- struct yaffs_LinuxContext *ctxt = yaffs_DeviceToContext(dev);
+ struct yaffs_LinuxContext *ctxt = yaffs_DeviceToLC(dev);
ctxt->bgRunning = 0;
T(YAFFS_TRACE_OS,
(TSTR("yaffs_read_inode for %d\n"), (int)inode->i_ino));
- if(current != yaffs_DeviceToContext(dev)->readdirProcess)
+ if(current != yaffs_DeviceToLC(dev)->readdirProcess)
yaffs_GrossLock(dev);
obj = yaffs_FindObjectByNumber(dev, inode->i_ino);
yaffs_FillInodeFromObject(inode, obj);
- if(current != yaffs_DeviceToContext(dev)->readdirProcess)
+ if(current != yaffs_DeviceToLC(dev)->readdirProcess)
yaffs_GrossUnlock(dev);
}
static YLIST_HEAD(yaffs_context_list);
struct semaphore yaffs_context_lock;
-#if 0 /* not used */
-static int yaffs_remount_fs(struct super_block *sb, int *flags, char *data)
-{
- yaffs_Device *dev = yaffs_SuperToDevice(sb);
-
- if (*flags & MS_RDONLY) {
- struct mtd_info *mtd = yaffs_SuperToDevice(sb)->genericDevice;
-
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_remount_fs: %s: RO\n"), dev->name));
-
- yaffs_GrossLock(dev);
-
- yaffs_FlushSuperBlock(sb,1);
-
- if (mtd->sync)
- mtd->sync(mtd);
-
- yaffs_GrossUnlock(dev);
- } else {
- T(YAFFS_TRACE_OS,
- (TSTR("yaffs_remount_fs: %s: RW\n"), dev->name));
- }
-
- return 0;
-}
-#endif
-
static void yaffs_put_super(struct super_block *sb)
{
yaffs_Device *dev = yaffs_SuperToDevice(sb);
yaffs_FlushSuperBlock(sb,1);
- if (yaffs_DeviceToContext(dev)->putSuperFunc)
- yaffs_DeviceToContext(dev)->putSuperFunc(sb);
+ if (yaffs_DeviceToLC(dev)->putSuperFunc)
+ yaffs_DeviceToLC(dev)->putSuperFunc(sb);
yaffs_Deinitialise(dev);
yaffs_GrossUnlock(dev);
down(&yaffs_context_lock);
- ylist_del_init(&(yaffs_DeviceToContext(dev)->contextList));
+ ylist_del_init(&(yaffs_DeviceToLC(dev)->contextList));
up(&yaffs_context_lock);
- if (yaffs_DeviceToContext(dev)->spareBuffer) {
- YFREE(yaffs_DeviceToContext(dev)->spareBuffer);
- yaffs_DeviceToContext(dev)->spareBuffer = NULL;
+ if (yaffs_DeviceToLC(dev)->spareBuffer) {
+ YFREE(yaffs_DeviceToLC(dev)->spareBuffer);
+ yaffs_DeviceToLC(dev)->spareBuffer = NULL;
}
kfree(dev);
static void yaffs_MTDPutSuper(struct super_block *sb)
{
- struct mtd_info *mtd = yaffs_DeviceToContext(yaffs_SuperToDevice(sb))->mtd;
+ struct mtd_info *mtd = yaffs_DeviceToMtd(yaffs_SuperToDevice(sb));
if (mtd->sync)
mtd->sync(mtd);
static void yaffs_MarkSuperBlockDirty(yaffs_Device *dev)
{
- struct super_block *sb = yaffs_DeviceToContext(dev)->superBlock;
+ struct super_block *sb = yaffs_DeviceToLC(dev)->superBlock;
T(YAFFS_TRACE_OS, (TSTR("yaffs_MarkSuperBlockDirty() sb = %p\n"), sb));
if (sb)
yaffs_options options;
+ unsigned mount_id;
+ int found;
+ struct yaffs_LinuxContext *context_iterator;
+ struct ylist_head *l;
+
sb->s_magic = YAFFS_MAGIC;
sb->s_op = &yaffs_super_ops;
sb->s_flags |= MS_NOATIME;
param = &(dev->param);
memset(context,0,sizeof(struct yaffs_LinuxContext));
- dev->context = context;
+ dev->osContext = context;
YINIT_LIST_HEAD(&(context->contextList));
context->dev = dev;
context->superBlock = sb;
sb->u.generic_sbp = dev;
#endif
- yaffs_DeviceToContext(dev)->mtd = mtd;
+ dev->driverContext = mtd;
param->name = mtd->name;
/* Set up the memory size parameters.... */
nandmtd2_ReadChunkWithTagsFromNAND;
param->markNANDBlockBad = nandmtd2_MarkNANDBlockBad;
param->queryNANDBlock = nandmtd2_QueryNANDBlock;
- yaffs_DeviceToContext(dev)->spareBuffer = YMALLOC(mtd->oobsize);
+ yaffs_DeviceToLC(dev)->spareBuffer = YMALLOC(mtd->oobsize);
param->isYaffs2 = 1;
#if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 17))
param->totalBytesPerChunk = mtd->writesize;
param->eraseBlockInNAND = nandmtd_EraseBlockInNAND;
param->initialiseNAND = nandmtd_InitialiseNAND;
- yaffs_DeviceToContext(dev)->putSuperFunc = yaffs_MTDPutSuper;
+ yaffs_DeviceToLC(dev)->putSuperFunc = yaffs_MTDPutSuper;
param->markSuperBlockDirty = yaffs_MarkSuperBlockDirty;
param->gcControl = yaffs_gc_control_callback;
- yaffs_DeviceToContext(dev)->superBlock= sb;
+ yaffs_DeviceToLC(dev)->superBlock= sb;
#ifndef CONFIG_YAFFS_DOES_ECC
param->skipCheckpointRead = options.skip_checkpoint_read;
param->skipCheckpointWrite = options.skip_checkpoint_write;
- /* we assume this is protected by lock_kernel() in mount/umount */
down(&yaffs_context_lock);
- ylist_add_tail(&(yaffs_DeviceToContext(dev)->contextList), &yaffs_context_list);
+ /* Get a mount id */
+ found = 0;
+ for(mount_id=0; ! found; mount_id++){
+ found = 1;
+ ylist_for_each(l,&yaffs_context_list){
+ context_iterator = ylist_entry(l,struct yaffs_LinuxContext,contextList);
+ if(context_iterator->mount_id == mount_id)
+ found = 0;
+ }
+ }
+ context->mount_id = mount_id;
+
+ ylist_add_tail(&(yaffs_DeviceToLC(dev)->contextList), &yaffs_context_list);
up(&yaffs_context_lock);
/* Directory search handling...*/
- YINIT_LIST_HEAD(&(yaffs_DeviceToContext(dev)->searchContexts));
+ YINIT_LIST_HEAD(&(yaffs_DeviceToLC(dev)->searchContexts));
param->removeObjectCallback = yaffs_RemoveObjectCallback;
- init_MUTEX(&(yaffs_DeviceToContext(dev)->grossLock));
+ init_MUTEX(&(yaffs_DeviceToLC(dev)->grossLock));
yaffs_GrossLock(dev);
buf += sprintf(buf, "nErasedBlocks...... %d\n", dev->nErasedBlocks);
buf += sprintf(buf, "blocksInCheckpoint. %d\n", dev->blocksInCheckpoint);
buf += sprintf(buf, "\n");
- buf += sprintf(buf, "nTnodesCreated..... %d\n", dev->nTnodesCreated);
- buf += sprintf(buf, "nFreeTnodes........ %d\n", dev->nFreeTnodes);
- buf += sprintf(buf, "nObjectsCreated.... %d\n", dev->nObjectsCreated);
- buf += sprintf(buf, "nFreeObjects....... %d\n", dev->nFreeObjects);
+ buf += sprintf(buf, "nTnodes............ %d\n", dev->nTnodes);
+ buf += sprintf(buf, "nObjects........... %d\n", dev->nObjects);
buf += sprintf(buf, "nFreeChunks........ %d\n", dev->nFreeChunks);
buf += sprintf(buf, "\n");
buf += sprintf(buf, "nPageWrites........ %u\n", dev->nPageWrites);
yaffs_Device *dev = dc->dev;
int erasedChunks;
- int nObjects;
- int nTnodes;
erasedChunks = dev->nErasedBlocks * dev->param.nChunksPerBlock;
- nObjects = dev->nObjectsCreated -dev->nFreeObjects;
- nTnodes = dev->nTnodesCreated - dev->nFreeTnodes;
-
- buf += sprintf(buf,"%d, %d, %d, %u, %u, %d, %d\n",
+ buf += sprintf(buf,"%d, %d, %d, %u, %u, %u, %u\n",
n, dev->nFreeChunks, erasedChunks,
dev->backgroundGCs, dev->oldestDirtyGCs,
- nObjects, nTnodes);
+ dev->nObjects, dev->nTnodes);
}
up(&yaffs_context_lock);