예제 #1
0
    def clean_segment(self):
        segment = Segment.SegmentClass(self.next_segment_to_clean)

        for i in range(0, NUMBLOCKS):
            blockidtocheck = segment.segmentbase + 1 + i
            data = Disk.disk.blockread(blockidtocheck)
            data = data[BLOCKSIZE:]
            inodeid, blockoffset = struct.unpack("II", data)
            if not self._is_valid(inodeid, blockoffset):
                continue

            inodeblockid = InodeMap.inodemap.lookup(inodeid)
            if inodeblockid == None:
                segment.superblock.blockinuse[i] = False
                if DEBUG:
                    print "Cleaner cleaned :", blockidtocheck
            else:
                if blockoffset != INODEIDENTIFIEROFFSET:
                    inodeobject = Inode(
                        str=Segment.segmentmanager.blockread(inodeblockid))
                    if blockoffset == INDIRECTBLOCKOFFSET:
                        if inodeobject.indirectblock != blockidtocheck:
                            segment.superblock.blockinuse[i] = False
                            if DEBUG:
                                print "Cleaner cleaned :", blockidtocheck
                    else:
                        storedblockid = inodeobject.find_datablock_by_offset(
                            blockoffset)
                        if storedblockid != blockidtocheck:
                            segment.superblock.blockinuse[i] = False
                            if DEBUG:
                                print "Cleaner cleaned :", blockidtocheck
                else:
                    if inodeblockid != blockidtocheck:
                        segment.superblock.blockinuse[i] = False
                        if DEBUG:
                            print "Cleaner cleaned :", blockidtocheck