示例#1
0
文件: dir.c 项目: Nukil/linux-2.6
static int coda_symlink(struct inode *dir_inode, struct dentry *de,
                        const char *symname)
{
    const char *name = de->d_name.name;
    int len = de->d_name.len;
    int symlen;
    int error;

    if (is_root_inode(dir_inode) && coda_iscontrol(name, len))
        return -EPERM;

    symlen = strlen(symname);
    if (symlen > CODA_MAXPATHLEN)
        return -ENAMETOOLONG;

    /*
     * This entry is now negative. Since we do not create
     * an inode for the entry we have to drop it.
     */
    d_drop(de);
    error = venus_symlink(dir_inode->i_sb, coda_i2f(dir_inode), name, len,
                          symname, symlen);

    /* mtime is no good anymore */
    if (!error)
        coda_dir_update_mtime(dir_inode);

    return error;
}
示例#2
0
文件: dir.c 项目: Nukil/linux-2.6
static int coda_mkdir(struct inode *dir, struct dentry *de, umode_t mode)
{
    struct inode *inode;
    struct coda_vattr attrs;
    const char *name = de->d_name.name;
    int len = de->d_name.len;
    int error;
    struct CodaFid newfid;

    if (is_root_inode(dir) && coda_iscontrol(name, len))
        return -EPERM;

    attrs.va_mode = mode;
    error = venus_mkdir(dir->i_sb, coda_i2f(dir),
                        name, len, &newfid, &attrs);
    if (error)
        goto err_out;

    inode = coda_iget(dir->i_sb, &newfid, &attrs);
    if (IS_ERR(inode)) {
        error = PTR_ERR(inode);
        goto err_out;
    }

    /* invalidate the directory cnode's attributes */
    coda_dir_inc_nlink(dir);
    coda_dir_update_mtime(dir);
    d_instantiate(de, inode);
    return 0;
err_out:
    d_drop(de);
    return error;
}
示例#3
0
文件: dir.c 项目: 303750856/linux-3.1
/* creation routines: create, mknod, mkdir, link, symlink */
static int coda_create(struct inode *dir, struct dentry *de, int mode, struct nameidata *nd)
{
	int error;
	const char *name=de->d_name.name;
	int length=de->d_name.len;
	struct inode *inode;
	struct CodaFid newfid;
	struct coda_vattr attrs;

	if (coda_isroot(dir) && coda_iscontrol(name, length))
		return -EPERM;

	error = venus_create(dir->i_sb, coda_i2f(dir), name, length, 
				0, mode, &newfid, &attrs);
	if (error)
		goto err_out;

	inode = coda_iget(dir->i_sb, &newfid, &attrs);
	if (IS_ERR(inode)) {
		error = PTR_ERR(inode);
		goto err_out;
	}

	/* invalidate the directory cnode's attributes */
	coda_dir_update_mtime(dir);
	d_instantiate(de, inode);
	return 0;
err_out:
	d_drop(de);
	return error;
}
示例#4
0
static int coda_symlink(struct inode *dir_inode, struct dentry *de,
			const char *symname)
{
	const char *name = de->d_name.name;
	int len = de->d_name.len;
	int symlen;
	int error;

	if (coda_isroot(dir_inode) && coda_iscontrol(name, len))
		return -EPERM;

	symlen = strlen(symname);
	if (symlen > CODA_MAXPATHLEN)
		return -ENAMETOOLONG;

	d_drop(de);
	error = venus_symlink(dir_inode->i_sb, coda_i2f(dir_inode), name, len,
			      symname, symlen);

	
	if (!error)
		coda_dir_update_mtime(dir_inode);

	return error;
}
示例#5
0
/* try to make de an entry in dir_inodde linked to source_de */ 
static int coda_link(struct dentry *source_de, struct inode *dir_inode, 
	  struct dentry *de)
{
	struct inode *inode = source_de->d_inode;
        const char * name = de->d_name.name;
	int len = de->d_name.len;
	int error;

	lock_kernel();

	if (coda_isroot(dir_inode) && coda_iscontrol(name, len)) {
		unlock_kernel();
		return -EPERM;
	}

	error = venus_link(dir_inode->i_sb, coda_i2f(inode),
			   coda_i2f(dir_inode), (const char *)name, len);

	if (error) {
		d_drop(de);
		goto out;
	}

	coda_dir_update_mtime(dir_inode);
	atomic_inc(&inode->i_count);
	d_instantiate(de, inode);
	inc_nlink(inode);

out:
	unlock_kernel();
	return(error);
}
示例#6
0
文件: dir.c 项目: CSCLOG/beaglebone
/* destruction routines: unlink, rmdir */
static int coda_unlink(struct inode *dir, struct dentry *de)
{
        int error;
	const char *name = de->d_name.name;
	int len = de->d_name.len;

	error = venus_remove(dir->i_sb, coda_i2f(dir), name, len);
	if (error)
		return error;

	coda_dir_update_mtime(dir);
	drop_nlink(de->d_inode);
	return 0;
}
示例#7
0
文件: dir.c 项目: CSCLOG/beaglebone
static int coda_rmdir(struct inode *dir, struct dentry *de)
{
	const char *name = de->d_name.name;
	int len = de->d_name.len;
	int error;

	error = venus_rmdir(dir->i_sb, coda_i2f(dir), name, len);
	if (!error) {
		/* VFS may delete the child */
		if (de->d_inode)
		    de->d_inode->i_nlink = 0;

		/* fix the link count of the parent */
		coda_dir_drop_nlink(dir);
		coda_dir_update_mtime(dir);
	}
	return error;
}
示例#8
0
static int coda_rmdir(struct inode *dir, struct dentry *de)
{
	const char *name = de->d_name.name;
	int len = de->d_name.len;
	int error;

	error = venus_rmdir(dir->i_sb, coda_i2f(dir), name, len);
	if (!error) {
		
		if (de->d_inode)
			clear_nlink(de->d_inode);

		
		coda_dir_drop_nlink(dir);
		coda_dir_update_mtime(dir);
	}
	return error;
}
示例#9
0
文件: dir.c 项目: CSCLOG/beaglebone
/* try to make de an entry in dir_inodde linked to source_de */ 
static int coda_link(struct dentry *source_de, struct inode *dir_inode, 
	  struct dentry *de)
{
	struct inode *inode = source_de->d_inode;
        const char * name = de->d_name.name;
	int len = de->d_name.len;
	int error;

	if (coda_isroot(dir_inode) && coda_iscontrol(name, len))
		return -EPERM;

	error = venus_link(dir_inode->i_sb, coda_i2f(inode),
			   coda_i2f(dir_inode), (const char *)name, len);
	if (error) {
		d_drop(de);
		return error;
	}

	coda_dir_update_mtime(dir_inode);
	ihold(inode);
	d_instantiate(de, inode);
	inc_nlink(inode);
	return 0;
}