blob: 53b9271e02c4f12e124be049a4c3e1ae30c99533 [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
*/
#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;