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;
}
Exemple #2
0
/* 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);
}