91 lines
4.7 KiB
C
91 lines
4.7 KiB
C
/*
|
|
*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
|