summaryrefslogtreecommitdiffstats
path: root/fragment.c
blob: 53b9271e02c4f12e124be049a4c3e1ae30c99533 (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
/*
*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
*/
#include "fragment.h"
#include "malloc.h"
#include "fatcache.h"
static int fsck_msdos_fragment_compare(struct fragment *frag1 ,struct fragment *frag2)
{
	if(frag1->head > frag2->head)
         return 1;
    else if(frag1->head < frag2->head)
         return -1;
    else
         return 0;
}
RB_GENERATE(FSCK_MSDOS_FRAGMENT,fragment,rb,fsck_msdos_fragment_compare);
struct fragment* New_fragment(void)
{
    struct fragment *frag;
    frag = calloc(1,sizeof(struct fragment));
    if(!frag){
        fsck_warn("%s,No space left \n",__func__);
        return EMPTY_FRAGMENT;
    }
	RB_SET(frag,NULL,rb);
    return frag;
}


void free_fragment_tree(struct FSCK_MSDOS_FRAGMENT* head)
{
	struct fragment * frag,*next_frag;
	/*
	 *avoid using function RB_FOREACH here
	 *RB_FOREACH(frag, FSCK_MSDOS_FRAGMENT,head)
	 *	free(frag);
	 * is dangerous here
	 */
	fsck_info("free_fragment_tree\n");
	frag = RB_MIN(FSCK_MSDOS_FRAGMENT,head);
	if(!frag){
		fsck_info("%s: rb_tree is empty \n",__func__);
		return ;
	}
	while(frag){
		next_frag = RB_NEXT(FSCK_MSDOS_FRAGMENT,0,frag);
		/*before free it ,must remove it from the rb_tree*/
		RB_REMOVE(FSCK_MSDOS_FRAGMENT,head,frag);
		free(frag);
		frag = next_frag;
	}
}

struct FSCK_MSDOS_FRAGMENT rb_free_root,rb_bad_root;