summaryrefslogtreecommitdiffstats
path: root/fatcache.h
blob: 6db35a6807cd056613678dc760f290d0066c239d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
*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