void yaffs_DeinitialiseRawTnodesAndObjects(yaffs_Device *dev) { yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator; T(YAFFS_TRACE_ALLOCATE,(TSTR("Deinitialising yaffs allocator\n"))); if(allocator){ if(allocator->tnode_cache){ kmem_cache_destroy(allocator->tnode_cache); allocator->tnode_cache = NULL; } else { T(YAFFS_TRACE_ALWAYS, (TSTR("NULL tnode cache\n"))); YBUG(); } if(allocator->object_cache){ kmem_cache_destroy(allocator->object_cache); allocator->object_cache = NULL; } else { T(YAFFS_TRACE_ALWAYS, (TSTR("NULL object cache\n"))); YBUG(); } YFREE(allocator); } else { T(YAFFS_TRACE_ALWAYS, (TSTR("Deinitialising NULL allocator\n"))); YBUG(); } dev->allocator = NULL; }
int yaffs_WriteChunkWithTagsToNAND(yaffs_Device * dev, int chunkInNAND, const __u8 * buffer, yaffs_ExtendedTags * tags) { chunkInNAND -= dev->chunkOffset; if (tags) { tags->sequenceNumber = dev->sequenceNumber; tags->chunkUsed = 1; if (!yaffs_ValidateTags(tags)) { T(YAFFS_TRACE_ERROR, (TSTR("Writing uninitialised tags" TENDSTR))); YBUG(); } T(YAFFS_TRACE_WRITE, (TSTR("Writing chunk %d tags %d %d" TENDSTR), chunkInNAND, tags->objectId, tags->chunkId)); } else { T(YAFFS_TRACE_ERROR, (TSTR("Writing with no tags" TENDSTR))); YBUG(); } if (dev->writeChunkWithTagsToNAND) return dev->writeChunkWithTagsToNAND(dev, chunkInNAND, buffer, tags); else return yaffs_TagsCompatabilityWriteChunkWithTagsToNAND(dev, chunkInNAND, buffer, tags); }
int yaffs_wr_chunk_tags_nand(struct yaffs_dev *dev, int nand_chunk, const u8 * buffer, struct yaffs_ext_tags *tags) { dev->n_page_writes++; nand_chunk -= dev->chunk_offset; if (tags) { tags->seq_number = dev->seq_number; tags->chunk_used = 1; if (!yaffs_validate_tags(tags)) { yaffs_trace(YAFFS_TRACE_ERROR, "Writing uninitialised tags"); YBUG(); } yaffs_trace(YAFFS_TRACE_WRITE, "Writing chunk %d tags %d %d", nand_chunk, tags->obj_id, tags->chunk_id); } else { yaffs_trace(YAFFS_TRACE_ERROR, "Writing with no tags"); YBUG(); } if (dev->param.write_chunk_tags_fn) return dev->param.write_chunk_tags_fn(dev, nand_chunk, buffer, tags); else return yaffs_tags_compat_wr(dev, nand_chunk, buffer, tags); }
yaffs_Object *yaffs_AllocateRawObject(yaffs_Device *dev) { yaffs_Allocator *allocator = dev->allocator; if(!allocator){ YBUG(); return NULL; } if(!allocator->object_cache){ YBUG(); return NULL; } return kmem_cache_alloc(allocator->object_cache, GFP_NOFS); }
static int yaffs_create_tnodes(struct yaffs_dev *dev, int n_tnodes) { struct yaffs_allocator *allocator = (struct yaffs_allocator *)dev->allocator; int i; struct yaffs_tnode *new_tnodes; u8 *mem; struct yaffs_tnode *curr; struct yaffs_tnode *next; struct yaffs_tnode_list *tnl; if (!allocator) { YBUG(); return YAFFS_FAIL; } if (n_tnodes < 1) return YAFFS_OK; new_tnodes = kmalloc(n_tnodes * dev->tnode_size, GFP_NOFS); mem = (u8 *) new_tnodes; if (!new_tnodes) { yaffs_trace(YAFFS_TRACE_ERROR, "yaffs: Could not allocate Tnodes"); return YAFFS_FAIL; } for (i = 0; i < n_tnodes - 1; i++) { curr = (struct yaffs_tnode *)&mem[i * dev->tnode_size]; next = (struct yaffs_tnode *)&mem[(i + 1) * dev->tnode_size]; curr->internal[0] = next; } curr = (struct yaffs_tnode *)&mem[(n_tnodes - 1) * dev->tnode_size]; curr->internal[0] = allocator->free_tnodes; allocator->free_tnodes = (struct yaffs_tnode *)mem; allocator->n_free_tnodes += n_tnodes; allocator->n_tnodes_created += n_tnodes; tnl = kmalloc(sizeof(struct yaffs_tnode_list), GFP_NOFS); if (!tnl) { yaffs_trace(YAFFS_TRACE_ERROR, "Could not add tnodes to management list"); return YAFFS_FAIL; } else { tnl->tnodes = new_tnodes; tnl->next = allocator->alloc_tnode_list; allocator->alloc_tnode_list = tnl; } yaffs_trace(YAFFS_TRACE_ALLOCATE,"Tnodes added"); return YAFFS_OK; }
static void yaffs_deinit_raw_tnodes(yaffs_dev_t *dev) { yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator; yaffs_tnodelist_t *tmp; if(!allocator){ YBUG(); return; } while (allocator->allocatedTnodeList) { tmp = allocator->allocatedTnodeList->next; YFREE(allocator->allocatedTnodeList->tnodes); YFREE(allocator->allocatedTnodeList); allocator->allocatedTnodeList = tmp; } allocator->freeTnodes = NULL; allocator->nFreeTnodes = 0; allocator->n_tnodesCreated = 0; }
yaffs_Tnode *yaffs_AllocateRawTnode(yaffs_Device *dev) { yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator; yaffs_Tnode *tn = NULL; if(!allocator){ YBUG(); return NULL; } /* If there are none left make more */ if (!allocator->freeTnodes) yaffs_CreateTnodes(dev, YAFFS_ALLOCATION_NTNODES); if (allocator->freeTnodes) { tn = allocator->freeTnodes; #ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG if (tn->internal[YAFFS_NTNODES_INTERNAL] != (void *)1) { /* Hoosterman, this thing looks like it isn't in the list */ T(YAFFS_TRACE_ALWAYS, (TSTR("yaffs: Tnode list bug 1" TENDSTR))); } #endif allocator->freeTnodes = allocator->freeTnodes->internal[0]; allocator->nFreeTnodes--; } return tn; }
static void yaffs_DeinitialiseRawTnodes(yaffs_Device *dev) { yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator; yaffs_TnodeList *tmp; if(!allocator){ YBUG(); return; } while (allocator->allocatedTnodeList) { tmp = allocator->allocatedTnodeList->next; YFREE(allocator->allocatedTnodeList->tnodes); YFREE(allocator->allocatedTnodeList); allocator->allocatedTnodeList = tmp; } allocator->freeTnodes = NULL; allocator->nFreeTnodes = 0; allocator->nTnodesCreated = 0; }
static void yaffs_deinit_raw_tnodes(struct yaffs_dev *dev) { struct yaffs_allocator *allocator = (struct yaffs_allocator *)dev->allocator; struct yaffs_tnode_list *tmp; if (!allocator) { YBUG(); return; } while (allocator->alloc_tnode_list) { tmp = allocator->alloc_tnode_list->next; kfree(allocator->alloc_tnode_list->tnodes); kfree(allocator->alloc_tnode_list); allocator->alloc_tnode_list = tmp; } allocator->free_tnodes = NULL; allocator->n_free_tnodes = 0; allocator->n_tnodes_created = 0; }
void nandmtd2_pt2buf(yaffs_Device *dev, yaffs_PackedTags2 *pt, int is_raw) { struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); __u8 *ptab = (__u8 *)pt; int i, j = 0, k, n; #ifdef CONFIG_YAFFS_DOES_ECC size_t packed_size = sizeof(yaffs_PackedTags2); #else size_t packed_size = sizeof(yaffs_PackedTags2TagsPart); #endif for (i = 0; i < mtd->oobsize; i++) dev->spareBuffer[i] = 0xff; if(!is_raw){ memcpy(dev->spareBuffer,pt,packed_size); } else { j = 0; k = mtd->ecclayout->oobfree[j].offset; n = mtd->ecclayout->oobfree[j].length; if (n == 0) { T(YAFFS_TRACE_ERROR, (TSTR("No OOB space for tags" TENDSTR))); YBUG(); } for (i = 0; i < packed_size; i++) { if (n == 0) { j++; k = mtd->ecclayout->oobfree[j].offset; n = mtd->ecclayout->oobfree[j].length; if (n == 0 || j >= (sizeof(mtd->ecclayout->oobfree) / sizeof(mtd->ecclayout->oobfree[0]))) { T(YAFFS_TRACE_ERROR, (TSTR("No OOB space for tags" TENDSTR))); YBUG(); } } dev->spareBuffer[k] = ptab[i]; k++; n--; } } }
yaffs_Tnode *yaffs_AllocateRawTnode(yaffs_Device *dev) { yaffs_Allocator *allocator = dev->allocator; if(!allocator || !allocator->tnode_cache){ YBUG(); return NULL; } return kmem_cache_alloc(allocator->tnode_cache, GFP_NOFS); }
void yaffs_verify_chunk_bit_id(struct yaffs_dev *dev, int blk, int chunk) { if (blk < dev->internal_start_block || blk > dev->internal_end_block || chunk < 0 || chunk >= dev->param.chunks_per_block) { yaffs_trace(YAFFS_TRACE_ERROR, "Chunk Id (%d:%d) invalid", blk, chunk); YBUG(); } }
void yaffs_VerifyChunkBitId(yaffs_Device *dev, int blk, int chunk) { if (blk < dev->internalStartBlock || blk > dev->internalEndBlock || chunk < 0 || chunk >= dev->param.nChunksPerBlock) { T(YAFFS_TRACE_ERROR, (TSTR("**>> yaffs: Chunk Id (%d:%d) invalid"TENDSTR), blk, chunk)); YBUG(); } }
static inline u8 *yaffs_block_bits(struct yaffs_dev *dev, int blk) { if (blk < dev->internal_start_block || blk > dev->internal_end_block) { yaffs_trace(YAFFS_TRACE_ERROR, "BlockBits block %d is not valid", blk); YBUG(); } return dev->chunk_bits + (dev->chunk_bit_stride * (blk - dev->internal_start_block)); }
void yaffs_DeinitialiseRawTnodesAndObjects(yaffs_Device *dev) { if(dev->allocator){ yaffs_DeinitialiseRawTnodes(dev); yaffs_DeinitialiseRawObjects(dev); YFREE(dev->allocator); dev->allocator=NULL; } else YBUG(); }
static void yaffs_InitialiseRawObjects(yaffs_Device *dev) { yaffs_Allocator *allocator = dev->allocator; if(allocator) { allocator->allocatedObjectList = NULL; allocator->freeObjects = NULL; allocator->nFreeObjects = 0; } else YBUG(); }
static void yaffs_init_raw_objs(yaffs_dev_t *dev) { yaffs_Allocator *allocator = dev->allocator; if(allocator) { allocator->allocatedObjectList = NULL; allocator->freeObjects = NULL; allocator->nFreeObjects = 0; } else YBUG(); }
static Y_INLINE __u8 *yaffs_BlockBits(yaffs_Device *dev, int blk) { if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) { T(YAFFS_TRACE_ERROR, (TSTR("**>> yaffs: BlockBits block %d is not valid" TENDSTR), blk)); YBUG(); } return dev->chunkBits + (dev->chunkBitmapStride * (blk - dev->internalStartBlock)); }
void yaffs_deinit_raw_tnodes_and_objs(yaffs_dev_t *dev) { if(dev->allocator){ yaffs_deinit_raw_tnodes(dev); yaffs_deinit_raw_objs(dev); YFREE(dev->allocator); dev->allocator=NULL; } else YBUG(); }
static void yaffs_init_raw_objs(struct yaffs_dev *dev) { struct yaffs_allocator *allocator = dev->allocator; if (allocator) { allocator->allocated_obj_list = NULL; allocator->free_objs = NULL; allocator->n_free_objects = 0; } else { YBUG(); } }
static int yaffs_create_free_objs(struct yaffs_dev *dev, int n_obj) { struct yaffs_allocator *allocator = dev->allocator; int i; struct yaffs_obj *new_objs; struct yaffs_obj_list *list; if (!allocator) { YBUG(); return YAFFS_FAIL; } if (n_obj < 1) return YAFFS_OK; new_objs = kmalloc(n_obj * sizeof(struct yaffs_obj), GFP_NOFS); list = kmalloc(sizeof(struct yaffs_obj_list), GFP_NOFS); if (!new_objs || !list) { if (new_objs) { kfree(new_objs); new_objs = NULL; } if (list) { kfree(list); list = NULL; } yaffs_trace(YAFFS_TRACE_ALLOCATE, "Could not allocate more objects"); return YAFFS_FAIL; } for (i = 0; i < n_obj - 1; i++) { new_objs[i].siblings.next = (struct list_head *)(&new_objs[i + 1]); } new_objs[n_obj - 1].siblings.next = (void *)allocator->free_objs; allocator->free_objs = new_objs; allocator->n_free_objects += n_obj; allocator->n_obj_created += n_obj; list->objects = new_objs; list->next = allocator->allocated_obj_list; allocator->allocated_obj_list = list; return YAFFS_OK; }
void yaffs_deinit_raw_tnodes_and_objs(struct yaffs_dev *dev) { if (dev->allocator) { yaffs_deinit_raw_tnodes(dev); yaffs_deinit_raw_objs(dev); kfree(dev->allocator); dev->allocator = NULL; } else { YBUG(); } }
static void yaffs_InitialiseRawTnodes(yaffs_Device *dev) { yaffs_Allocator *allocator = dev->allocator; if(allocator){ allocator->allocatedTnodeList = NULL; allocator->freeTnodes = NULL; allocator->nFreeTnodes = 0; allocator->nTnodesCreated = 0; } else YBUG(); }
static void yaffs_init_raw_tnodes(yaffs_dev_t *dev) { yaffs_Allocator *allocator = dev->allocator; if(allocator){ allocator->allocatedTnodeList = NULL; allocator->freeTnodes = NULL; allocator->nFreeTnodes = 0; allocator->n_tnodesCreated = 0; } else YBUG(); }
static int yaffs_create_free_objs(yaffs_dev_t *dev, int n_obj) { yaffs_Allocator *allocator = dev->allocator; int i; yaffs_obj_t *newObjects; yaffs_obj_tList *list; if(!allocator){ YBUG(); return YAFFS_FAIL; } if (n_obj < 1) return YAFFS_OK; /* make these things */ newObjects = YMALLOC(n_obj * sizeof(yaffs_obj_t)); list = YMALLOC(sizeof(yaffs_obj_tList)); if (!newObjects || !list) { if (newObjects){ YFREE(newObjects); newObjects = NULL; } if (list){ YFREE(list); list = NULL; } T(YAFFS_TRACE_ALLOCATE, (TSTR("yaffs: Could not allocate more objects" TENDSTR))); return YAFFS_FAIL; } /* Hook them into the free list */ for (i = 0; i < n_obj - 1; i++) { newObjects[i].siblings.next = (struct ylist_head *)(&newObjects[i + 1]); } newObjects[n_obj - 1].siblings.next = (void *)allocator->freeObjects; allocator->freeObjects = newObjects; allocator->nFreeObjects += n_obj; allocator->n_objCreated += n_obj; /* Now add this bunch of Objects to a list for freeing up. */ list->objects = newObjects; list->next = allocator->allocatedObjectList; allocator->allocatedObjectList = list; return YAFFS_OK; }
void nandmtd2_pt2buf(yaffs_Device *dev, yaffs_PackedTags2 *pt, int is_raw) { struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); __u8 *ptab = (__u8 *)pt; /* packed tags as bytes */ int i, j = 0, k, n; /* Pack buffer with 0xff */ for (i = 0; i < mtd->oobsize; i++) dev->spareBuffer[i] = 0xff; if(!is_raw){ memcpy(dev->spareBuffer,pt,sizeof(yaffs_PackedTags2)); } else { j = 0; k = mtd->oobinfo.oobfree[j][0]; n = mtd->oobinfo.oobfree[j][1]; if (n == 0) { T(YAFFS_TRACE_ERROR, (TSTR("No OOB space for tags" TENDSTR))); YBUG(); } for (i = 0; i < sizeof(yaffs_PackedTags2); i++) { if (n == 0) { j++; k = mtd->oobinfo.oobfree[j][0]; n = mtd->oobinfo.oobfree[j][1]; if (n == 0) { T(YAFFS_TRACE_ERROR, (TSTR("No OOB space for tags" TENDSTR))); YBUG(); } } dev->spareBuffer[k] = ptab[i]; k++; n--; } } }
static void yaffs_init_raw_tnodes(struct yaffs_dev *dev) { struct yaffs_allocator *allocator = dev->allocator; if (allocator) { allocator->alloc_tnode_list = NULL; allocator->free_tnodes = NULL; allocator->n_free_tnodes = 0; allocator->n_tnodes_created = 0; } else { YBUG(); } }
void nandmtd2_buf2pt(yaffs_Device *dev, yaffs_PackedTags2 *pt, int is_raw) { struct mtd_info *mtd = (struct mtd_info *)(dev->genericDevice); int i, j = 0, k, n; __u8 *ptab = (__u8 *)pt; /* packed tags as bytes */ if (!is_raw) { memcpy(pt,dev->spareBuffer,sizeof(yaffs_PackedTags2)); } else { j = 0; k = mtd->oobinfo.oobfree[j][0]; n = mtd->oobinfo.oobfree[j][1]; if (n == 0) { T(YAFFS_TRACE_ERROR, (TSTR("No space in OOB for tags" TENDSTR))); YBUG(); } for (i = 0; i < sizeof(yaffs_PackedTags2); i++) { if (n == 0) { j++; k = mtd->oobinfo.oobfree[j][0]; n = mtd->oobinfo.oobfree[j][1]; if (n == 0) { T(YAFFS_TRACE_ERROR, (TSTR("No space in OOB for tags" TENDSTR))); YBUG(); } } ptab[i] = dev->spareBuffer[k]; //(__u8)pt[i] = (__u8)dev->spareBuffer[k];//zswan k++; n--; } } }
void yaffs_init_raw_tnodes_and_objs(yaffs_dev_t *dev) { yaffs_Allocator *allocator; if(!dev->allocator){ allocator = YMALLOC(sizeof(yaffs_Allocator)); if(allocator){ dev->allocator = allocator; yaffs_init_raw_tnodes(dev); yaffs_init_raw_objs(dev); } } else YBUG(); }
void yaffs_free_raw_obj(yaffs_dev_t *dev, yaffs_obj_t *obj) { yaffs_Allocator *allocator = dev->allocator; if(!allocator) YBUG(); else { /* Link into the free list. */ obj->siblings.next = (struct ylist_head *)(allocator->freeObjects); allocator->freeObjects = obj; allocator->nFreeObjects++; } }