Esempio n. 1
0
URET uffs_InitDevice(uffs_Device *dev)
{
    URET ret;

    ret = uffs_InitDeviceConfig(dev);
    if (ret != U_SUCC)
        return U_FAIL;

    if (dev->mem.init) {
        if (dev->mem.init(dev) != U_SUCC) {
            uffs_Perror(UFFS_MSG_SERIOUS, "Init memory allocator fail.");
            return U_FAIL;
        }
    }

    memset(&(dev->st), 0, sizeof(uffs_FlashStat));

    uffs_DeviceInitLock(dev);
    uffs_BadBlockInit(dev);


    if (uffs_FlashInterfaceInit(dev) != U_SUCC) {
        uffs_Perror(UFFS_MSG_SERIOUS, "Can't initialize flash interface !");
        goto fail;
    }

    uffs_Perror(UFFS_MSG_NOISY, "init page buf");
    ret = uffs_BufInit(dev, dev->cfg.page_buffers, dev->cfg.dirty_pages);
    if (ret != U_SUCC) {
        uffs_Perror(UFFS_MSG_DEAD, "Initialize page buffers fail");
        goto fail;
    }
    uffs_Perror(UFFS_MSG_NOISY, "init block info cache");
    ret = uffs_BlockInfoInitCache(dev, dev->cfg.bc_caches);
    if (ret != U_SUCC) {
        uffs_Perror(UFFS_MSG_DEAD, "Initialize block info fail");
        goto fail;
    }

    ret = uffs_TreeInit(dev);
    if (ret != U_SUCC) {
        uffs_Perror(UFFS_MSG_SERIOUS, "fail to init tree buffers");
        goto fail;
    }

    ret = uffs_BuildTree(dev);
    if (ret != U_SUCC) {
        uffs_Perror(UFFS_MSG_SERIOUS, "fail to build tree");
        goto fail;
    }

    return U_SUCC;

fail:
    uffs_DeviceReleaseLock(dev);

    return U_FAIL;
}
Esempio n. 2
0
URET uffs_InitDevice(uffs_Device *dev)
{
	URET ret;

	if (dev->mem.init) {
		if (dev->mem.init(dev) != U_SUCC) {
			uffs_Perror(UFFS_ERR_SERIOUS, "Init memory allocator fail.");
			return U_FAIL;
		}
	}

	memset(&(dev->st), 0, sizeof(uffs_FlashStat));

	uffs_DeviceInitLock(dev);
	uffs_BadBlockInit(dev);

	if (uffs_FlashInterfaceInit(dev) != U_SUCC) {
		uffs_Perror(UFFS_ERR_SERIOUS, "Can't initialize flash interface !");
		goto fail;
	}

	uffs_Perror(UFFS_ERR_NOISY, "init page buf");
	ret = uffs_BufInit(dev, MAX_PAGE_BUFFERS, MAX_DIRTY_PAGES_IN_A_BLOCK);
	if (ret != U_SUCC) {
		uffs_Perror(UFFS_ERR_DEAD, "Initialize page buffers fail");
		goto fail;
	}
	uffs_Perror(UFFS_ERR_NOISY, "init block info cache");
	ret = uffs_BlockInfoInitCache(dev, MAX_CACHED_BLOCK_INFO);
	if (ret != U_SUCC) {
		uffs_Perror(UFFS_ERR_DEAD, "Initialize block info fail");
		goto fail;
	}

	ret = uffs_TreeInit(dev);
	if (ret != U_SUCC) {
		uffs_Perror(UFFS_ERR_SERIOUS, "fail to init tree buffers");
		goto fail;
	}

	ret = uffs_BuildTree(dev);
	if (ret != U_SUCC) {
		uffs_Perror(UFFS_ERR_SERIOUS, "fail to build tree");
		goto fail;
	}

	return U_SUCC;

fail:
	uffs_DeviceReleaseLock(dev);

	return U_FAIL;
}
URET uffs_FormatDevice(uffs_Device *dev, UBOOL force)
{
	u16 i, slot;
	URET ret = U_SUCC;
	
	if (dev == NULL)
		return U_FAIL;

	if (dev->ops == NULL) 
		return U_FAIL;

	uffs_GlobalFsLockLock();

	ret = uffs_BufFlushAll(dev);

	if (dev->ref_count > 1 && !force) {
		uffs_Perror(UFFS_MSG_NORMAL,
					"can't format when dev->ref_count = %d",
					dev->ref_count);
		ret = U_FAIL;
	}

	if (ret == U_SUCC && force) {
		uffs_DirEntryBufPutAll(dev);
		uffs_PutAllObjectBuf(dev);
		uffs_FdSignatureIncrease();
	}

	if (ret == U_SUCC &&
		uffs_BufIsAllFree(dev) == U_FALSE &&
		!force)
	{
		uffs_Perror(UFFS_MSG_NORMAL, "some page still in used!");
		ret = U_FAIL;
	}

	if (!force) {
		for (slot = 0; ret == U_SUCC && slot < dev->cfg.dirty_groups; slot++) {
			if (dev->buf.dirtyGroup[slot].count > 0) {
				uffs_Perror(UFFS_MSG_SERIOUS, "there still have dirty pages!");
				ret = U_FAIL;
			}
		}
	}

	if (ret == U_SUCC)
		uffs_BufSetAllEmpty(dev);


	if (ret == U_SUCC && uffs_BlockInfoIsAllFree(dev) == U_FALSE && !force) {
		uffs_Perror(UFFS_MSG_NORMAL,
					"there still have block info cache ? fail to format");
		ret = U_FAIL;
	}

	if (ret == U_SUCC)
		uffs_BlockInfoExpireAll(dev);

	for (i = dev->par.start; ret == U_SUCC && i <= dev->par.end; i++) {
		if (uffs_FlashIsBadBlock(dev, i) == U_FALSE) {
			uffs_FlashEraseBlock(dev, i);
			if (HAVE_BADBLOCK(dev))
				uffs_BadBlockProcess(dev, NULL);
		}
		else {
#ifdef CONFIG_ENABLE_BAD_BLOCK_VERIFY
			_ForceFormatAndCheckBlock(dev, i);
#endif
		}
	}

	if (ret == U_SUCC && uffs_TreeRelease(dev) == U_FAIL) {
		ret = U_FAIL;
	}

	if (ret == U_SUCC && uffs_TreeInit(dev) == U_FAIL) {
		ret = U_FAIL;
	}

	if (ret == U_SUCC && uffs_BuildTree(dev) == U_FAIL) {
		ret = U_FAIL;
	}

	uffs_GlobalFsLockUnlock();

	return ret;
}