blob: 6db35a6807cd056613678dc760f290d0066c239d [file] [log] [blame]
/*
*Copyright (c) 2012, The Linux Foundation. All rights reserved.
*Redistribution and use in source and binary forms, with or without
*modification, are permitted provided that the following conditions are
*met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following
disclaimer in the documentation and/or other materials provided
with the distribution.
* Neither the name of The Linux Foundation nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
*THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
*WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
*MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
*ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
*BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
*CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
*SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
*WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
*OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
*IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
*/
#ifndef _FATCACHE_H_
#define _FATCACHE_H_
#include "dosfs.h"
#include "tree.h"
#include "stddef.h"
#include <cutils/log.h>
#include <android/log.h>
#define EMPTY_FAT (( struct cluster_chain_descriptor*)0)
#define EMPTY_CACHE (( struct fatcache*)0)
#define BIT(x,n) (((x)>>(n)) & 0x1)
#define SET_BIT(x,n) do{ \
x |= 1<<n;}while(0)
#define CLEAR_BIT(x,n) do{ \
x &= ~(1<<n);}while(0)
/*
*print information when handle cluster chain
*/
#define FSCK_SLOGI(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_INFO,"fsck_msdos", __VA_ARGS__))
#define FSCK_SLOGW(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_WARN,"fsck_msdos", __VA_ARGS__))
#define FSCK_SLOGE(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_ERROR,"fsck_msdos", __VA_ARGS__))
#define FSCK_SLOGD(...) ((void)__android_log_buf_print(LOG_ID_SYSTEM, ANDROID_LOG_DEBUG,"fsck_msdos", __VA_ARGS__))
#define fsck_info FSCK_SLOGI
#define fsck_warn FSCK_SLOGW
#define fsck_err FSCK_SLOGE
#define fsck_debug FSCK_SLOGD
#ifndef offsetof
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
#define container_of(ptr, type, member) \
((type *)((unsigned long)(ptr) - offsetof(type, member)))
int fsck_msdos_cache_compare(struct cluster_chain_descriptor *fat1,struct cluster_chain_descriptor *fat2);
RB_HEAD(FSCK_MSDOS_CACHE,cluster_chain_descriptor);
struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_FIND(struct FSCK_MSDOS_CACHE* x, struct cluster_chain_descriptor *y);
struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_REMOVE(struct FSCK_MSDOS_CACHE* x, struct cluster_chain_descriptor *y);
struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_NEXT(struct cluster_chain_descriptor *y);
struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_INSERT(struct FSCK_MSDOS_CACHE* x, struct cluster_chain_descriptor *y);
struct cluster_chain_descriptor* FSCK_MSDOS_CACHE_RB_MINMAX(struct FSCK_MSDOS_CACHE* x, int val);
extern struct FSCK_MSDOS_CACHE rb_root;
extern unsigned int * fat_bitmap;
typedef unsigned char u_char;
/*if necessary ,we can find the nextclust from FAT table*/
unsigned int GetNextClusFromFAT(struct bootblock *boot,u_char*fatable,unsigned int clust);
/*set the next cluster in FAT table*/
void SetNextClusToFAT(struct bootblock*boot,u_char*fat ,unsigned int cl ,unsigned int next);
struct cluster_chain_descriptor* New_fatentry(void);
struct fatcache* New_fatcache(void);
/*insert an new fatcache to fatentry . if exist ,merge it*/
int add_fatcache_To_ClusterChain(struct cluster_chain_descriptor *fatentry ,struct fatcache *new);
/*add an new fatcache to the tail of fatentry*/
int add_fatcache_Totail(struct cluster_chain_descriptor *fatentry ,struct fatcache *new);
/*find the cache which the cl is belong to ,cache2 return the prev fatcache*/
struct fatcache *Find_cache(struct cluster_chain_descriptor *fat,unsigned int cl,struct fatcache**cache2);
/*find the next cluster*/
struct fatcache *Find_nextclus(struct cluster_chain_descriptor* fat,unsigned int clus, unsigned int* cl);
int delete_fatcache_below(struct cluster_chain_descriptor* fatentry,struct fatcache*cache);
void Trunc(struct bootblock *boot, struct cluster_chain_descriptor *fat, unsigned int cl);
void free_rb_tree(void);
/*for test*/
void Dump_fatentry(struct cluster_chain_descriptor *fat);
#endif