コード例 #1
0
void
affs_evict_inode(struct inode *inode)
{
    unsigned long cache_page;
    pr_debug("AFFS: evict_inode(ino=%lu, nlink=%u)\n", inode->i_ino, inode->i_nlink);
    truncate_inode_pages(&inode->i_data, 0);

    if (!inode->i_nlink) {
        inode->i_size = 0;
        affs_truncate(inode);
    }

    invalidate_inode_buffers(inode);
    end_writeback(inode);
    affs_free_prealloc(inode);
    cache_page = (unsigned long)AFFS_I(inode)->i_lc;
    if (cache_page) {
        pr_debug("AFFS: freeing ext cache\n");
        AFFS_I(inode)->i_lc = NULL;
        AFFS_I(inode)->i_ac = NULL;
        free_page(cache_page);
    }
    affs_brelse(AFFS_I(inode)->i_ext_bh);
    AFFS_I(inode)->i_ext_last = ~1;
    AFFS_I(inode)->i_ext_bh = NULL;

    if (!inode->i_nlink)
        affs_free_block(inode->i_sb, inode->i_ino);
}
コード例 #2
0
void
affs_delete_inode(struct inode *inode)
{
	pr_debug("AFFS: delete_inode(ino=%lu, nlink=%u)\n", inode->i_ino, inode->i_nlink);
	inode->i_size = 0;
	if (S_ISREG(inode->i_mode))
		affs_truncate(inode);
	clear_inode(inode);
	affs_free_block(inode->i_sb, inode->i_ino);
}
コード例 #3
0
ファイル: inode.c プロジェクト: WiseMan787/ralink_sdk
void
affs_drop_inode(struct inode *inode)
{
	mutex_lock(&inode->i_mutex);
	if (inode->i_size != AFFS_I(inode)->mmu_private)
		affs_truncate(inode);
	mutex_unlock(&inode->i_mutex);

	generic_drop_inode(inode);
}
コード例 #4
0
ファイル: inode.c プロジェクト: 325116067/semc-qsd8x50
void
affs_delete_inode(struct inode *inode)
{
	pr_debug("AFFS: delete_inode(ino=%lu, nlink=%u)\n", inode->i_ino, inode->i_nlink);
	truncate_inode_pages(&inode->i_data, 0);
	inode->i_size = 0;
	affs_truncate(inode);
	clear_inode(inode);
	affs_free_block(inode->i_sb, inode->i_ino);
}
コード例 #5
0
void
affs_put_inode(struct inode *inode)
{
	pr_debug("AFFS: put_inode(ino=%lu, nlink=%u)\n", inode->i_ino, inode->i_nlink);
	affs_free_prealloc(inode);
	if (atomic_read(&inode->i_count) == 1) {
		down(&inode->i_sem);
		if (inode->i_size != AFFS_I(inode)->mmu_private)
			affs_truncate(inode);
		up(&inode->i_sem);
	}
}
コード例 #6
0
ファイル: inode.c プロジェクト: BWhitten/linux-stable
int
affs_notify_change(struct dentry *dentry, struct iattr *attr)
{
	struct inode *inode = d_inode(dentry);
	int error;

	pr_debug("notify_change(%lu,0x%x)\n", inode->i_ino, attr->ia_valid);

	error = setattr_prepare(dentry, attr);
	if (error)
		goto out;

	if (((attr->ia_valid & ATTR_UID) &&
	      affs_test_opt(AFFS_SB(inode->i_sb)->s_flags, SF_SETUID)) ||
	    ((attr->ia_valid & ATTR_GID) &&
	      affs_test_opt(AFFS_SB(inode->i_sb)->s_flags, SF_SETGID)) ||
	    ((attr->ia_valid & ATTR_MODE) &&
	     (AFFS_SB(inode->i_sb)->s_flags &
	      (AFFS_MOUNT_SF_SETMODE | AFFS_MOUNT_SF_IMMUTABLE)))) {
		if (!affs_test_opt(AFFS_SB(inode->i_sb)->s_flags, SF_QUIET))
			error = -EPERM;
		goto out;
	}

	if ((attr->ia_valid & ATTR_SIZE) &&
	    attr->ia_size != i_size_read(inode)) {
		error = inode_newsize_ok(inode, attr->ia_size);
		if (error)
			return error;

		truncate_setsize(inode, attr->ia_size);
		affs_truncate(inode);
	}

	setattr_copy(inode, attr);
	mark_inode_dirty(inode);

	if (attr->ia_valid & ATTR_MODE)
		affs_mode_to_prot(inode);
out:
	return error;
}