int isNodeContinuous(struct inode *inode) { struct fat_entry fatent; int dclus = 0; int nr = 0; struct msdos_inode_info * msinode= NULL; struct super_block *sb = NULL; struct msdos_sb_info *sbi = NULL; struct msdos_dir_entry *uninitialized_var(de); /*if (NULL != file && NULL != file->f_mapping) { inode = file->f_mapping->host; } else { printk(KERN_INFO "file or file->f_mapping is null, file:%x\n", (unsigned int)file); return 0; }*/ if (NULL != inode) { msinode= MSDOS_I(inode); sb = inode->i_sb; } else { printk(KERN_INFO "inode is null\n"); return 0; } //printk(KERN_INFO "3, inode:%x\n", (unsigned int)inode); if (NULL == msinode) { printk(KERN_INFO "msinode is null\n"); return 0; } if (NULL != sb) { sbi = MSDOS_SB(sb); } if (NULL == sbi) { printk(KERN_INFO "sbi is null\n"); return 0; } if (msinode->i_start < FAT_START_ENT || msinode->i_start > sbi->max_cluster) { printk(KERN_INFO "!!!start cluster is not correct\n"); return 1; } lock_fat2(sbi); dclus = msinode->i_start; fatent_init(&fatent); while (dclus < FAT_ENT_EOF) { //printk(KERN_INFO "%d ", dclus); nr = fat_ent_read(inode, &fatent, dclus); if (FAT_ENT_EOF != nr && nr != (dclus + 1)) { fatent_brelse(&fatent); unlock_fat2(sbi); printk(KERN_INFO "file is not contiguous\n"); return 0; } dclus = nr; } fatent_brelse(&fatent); unlock_fat2(sbi); return 1; }
/* Free all clusters after the skip'th cluster. */ static int fat_free(struct inode *inode, int skip) { struct super_block *sb = inode->i_sb; int err, wait, free_start, i_start, i_logstart; if (MSDOS_I(inode)->i_start == 0) return 0; fat_cache_inval_inode(inode); wait = IS_DIRSYNC(inode); i_start = free_start = MSDOS_I(inode)->i_start; i_logstart = MSDOS_I(inode)->i_logstart; /* First, we write the new file size. */ if (!skip) { MSDOS_I(inode)->i_start = 0; MSDOS_I(inode)->i_logstart = 0; } MSDOS_I(inode)->i_attrs |= ATTR_ARCH; inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC; if (wait) { err = fat_sync_inode(inode); if (err) { MSDOS_I(inode)->i_start = i_start; MSDOS_I(inode)->i_logstart = i_logstart; return err; } } else mark_inode_dirty(inode); /* Write a new EOF, and get the remaining cluster chain for freeing. */ if (skip) { struct fat_entry fatent; int ret, fclus, dclus; ret = fat_get_cluster(inode, skip - 1, &fclus, &dclus); if (ret < 0) return ret; else if (ret == FAT_ENT_EOF) return 0; fatent_init(&fatent); ret = fat_ent_read(inode, &fatent, dclus); if (ret == FAT_ENT_EOF) { fatent_brelse(&fatent); return 0; } else if (ret == FAT_ENT_FREE) { fat_fs_panic(sb, "%s: invalid cluster chain (i_pos %lld)", __FUNCTION__, MSDOS_I(inode)->i_pos); ret = -EIO; } else if (ret > 0) { err = fat_ent_write(inode, &fatent, FAT_ENT_EOF, wait); if (err) ret = err; } fatent_brelse(&fatent); if (ret < 0) return ret; free_start = ret; } inode->i_blocks = skip << (MSDOS_SB(sb)->cluster_bits - 9); /* Freeing the remained cluster chain */ return fat_free_clusters(inode, free_start); }