Beispiel #1
0
static int minix_mkdir(struct inode * dir, struct dentry *dentry, int mode)
{
	struct inode * inode;
	int err;

	inode_inc_link_count(dir);

	inode = minix_new_inode(dir, S_IFDIR | mode, &err);
	if (!inode)
		goto out_dir;

	minix_set_inode(inode, 0);

	inode_inc_link_count(inode);

	err = minix_make_empty(inode, dir);
	if (err)
		goto out_fail;

	err = minix_add_link(dentry, inode);
	if (err)
		goto out_fail;

	d_instantiate(dentry, inode);
out:
	return err;

out_fail:
	inode_dec_link_count(inode);
	inode_dec_link_count(inode);
	iput(inode);
out_dir:
	inode_dec_link_count(dir);
	goto out;
}
Beispiel #2
0
static int nilfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
{
	struct inode *inode;
	struct nilfs_transaction_info ti;
	int err;

	if (dir->i_nlink >= NILFS_LINK_MAX)
		return -EMLINK;

	err = nilfs_transaction_begin(dir->i_sb, &ti, 1);
	if (err)
		return err;

	inode_inc_link_count(dir);

	inode = nilfs_new_inode(dir, S_IFDIR | mode);
	err = PTR_ERR(inode);
	if (IS_ERR(inode))
		goto out_dir;

	inode->i_op = &nilfs_dir_inode_operations;
	inode->i_fop = &nilfs_dir_operations;
	inode->i_mapping->a_ops = &nilfs_aops;

	inode_inc_link_count(inode);

	err = nilfs_make_empty(inode, dir);
	if (err)
		goto out_fail;

	err = nilfs_add_link(dentry, inode);
	if (err)
		goto out_fail;

	d_instantiate(dentry, inode);
out:
	if (!err)
		err = nilfs_transaction_commit(dir->i_sb);
	else
		nilfs_transaction_abort(dir->i_sb);

	return err;

out_fail:
	inode_dec_link_count(inode);
	inode_dec_link_count(inode);
	iput(inode);
out_dir:
	inode_dec_link_count(dir);
	goto out;
}
Beispiel #3
0
static int replayfs_link(struct dentry *old_dentry, struct inode *dir,
		struct dentry *new_dentry) {
	struct inode *inode;
	int ret;

	replayfs_log_t log;
	replayfs_log_inode_t log_inode;

	inode = old_dentry->d_inode;

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	atomic_inc(&inode->i_count);

	ret = replayfs_begin_log_operation(&log);
	if (ret) {
		goto out;
	}

	replayfs_log_add_inode(&log, &log_inode, inode);

	ret = replayfs_dir_add_nondir(new_dentry, inode, &log, &log_inode);

	replayfs_log_inode_done(&log, &log_inode, inode->i_size);

	replayfs_end_log_operation(&log);

out:
	return ret;
}
Beispiel #4
0
static int __tux3_mknod(struct inode *dir, struct dentry *dentry,
			struct tux_iattr *iattr, dev_t rdev)
{
	struct inode *inode;
	int err, is_dir = S_ISDIR(iattr->mode);

	if (!huge_valid_dev(rdev))
		return -EINVAL;

	if (is_dir && dir->i_nlink >= TUX_LINK_MAX)
		return -EMLINK;

	change_begin(tux_sb(dir->i_sb));
	inode = tux_new_inode(dir, iattr, rdev);
	err = PTR_ERR(inode);
	if (!IS_ERR(inode)) {
		err = tux_add_dirent(dir, dentry, inode);
		if (!err) {
			unlock_new_inode(inode);
			if (is_dir)
				inode_inc_link_count(dir);
		}
	}
	change_end(tux_sb(dir->i_sb));
	return err;
}
Beispiel #5
0
static int nilfs_link(struct dentry *old_dentry, struct inode *dir,
		      struct dentry *dentry)
{
	struct inode *inode = d_inode(old_dentry);
	struct nilfs_transaction_info ti;
	int err;

	err = nilfs_transaction_begin(dir->i_sb, &ti, 1);
	if (err)
		return err;

	inode->i_ctime = current_time(inode);
	inode_inc_link_count(inode);
	ihold(inode);

	err = nilfs_add_link(dentry, inode);
	if (!err) {
		d_instantiate(dentry, inode);
		err = nilfs_transaction_commit(dir->i_sb);
	} else {
		inode_dec_link_count(inode);
		iput(inode);
		nilfs_transaction_abort(dir->i_sb);
	}

	return err;
}
Beispiel #6
0
static int tux3_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
{
	struct inode *inode;
	int err;

	if (!huge_valid_dev(rdev))
		return -EINVAL;

	change_begin(tux_sb(dir->i_sb));
	inode = tux_create_inode(dir, mode, rdev);
	err = PTR_ERR(inode);
	if (!IS_ERR(inode)) {
		err = tux_add_dirent(dir, dentry, inode);
		if (!err) {
			if ((inode->i_mode & S_IFMT) == S_IFDIR)
				inode_inc_link_count(dir);
			goto out;
		}
		clear_nlink(inode);
		mark_inode_dirty(inode);
		iput(inode);
	}
out:
	change_end(tux_sb(dir->i_sb));
	return err;
}
Beispiel #7
0
static int tux3_link(struct dentry *old_dentry, struct inode *dir,
		     struct dentry *dentry)
{
	if(DEBUG_MODE_K==1)
	{
		printf("\t\t\t\t%25s[K]  %25s  %4d  #in\n",__FILE__,__func__,__LINE__);
	}
	struct inode *inode = old_dentry->d_inode;
	struct sb *sb = tux_sb(inode->i_sb);
	int err;

	if (inode->i_nlink >= TUX_LINK_MAX)
		return -EMLINK;

	change_begin(sb);
	tux3_iattrdirty(inode);
	inode->i_ctime = gettime();
	inode_inc_link_count(inode);
	ihold(inode);
	err = tux_add_dirent(dir, dentry, inode);
	if (err) {
		inode_dec_link_count(inode);
		iput(inode);
	}
	change_end(sb);

	return err;
}
Beispiel #8
0
static int nilfs_link(struct dentry *old_dentry, struct inode *dir,
		      struct dentry *dentry)
{
	struct inode *inode = old_dentry->d_inode;
	struct nilfs_transaction_info ti;
	int err;

	if (inode->i_nlink >= NILFS_LINK_MAX)
		return -EMLINK;

	err = nilfs_transaction_begin(dir->i_sb, &ti, 1);
	if (err)
		return err;

	inode->i_ctime = CURRENT_TIME;
	inode_inc_link_count(inode);
	atomic_inc(&inode->i_count);

	err = nilfs_add_nondir(dentry, inode);
	if (!err)
		err = nilfs_transaction_commit(dir->i_sb);
	else
		nilfs_transaction_abort(dir->i_sb);

	return err;
}
static int ufs_mkdir(struct inode * dir, struct dentry * dentry, int mode)
{
	struct inode * inode;
	int err = -EMLINK;

	if (dir->i_nlink >= UFS_LINK_MAX)
		goto out;

	dquot_initialize(dir);

	lock_kernel();
	inode_inc_link_count(dir);

	inode = ufs_new_inode(dir, S_IFDIR|mode);
	err = PTR_ERR(inode);
	if (IS_ERR(inode))
		goto out_dir;

	inode->i_op = &ufs_dir_inode_operations;
	inode->i_fop = &ufs_dir_operations;
	inode->i_mapping->a_ops = &ufs_aops;

	inode_inc_link_count(inode);

	err = ufs_make_empty(inode, dir);
	if (err)
		goto out_fail;

	err = ufs_add_link(dentry, inode);
	if (err)
		goto out_fail;
	unlock_kernel();

	d_instantiate(dentry, inode);
out:
	return err;

out_fail:
	inode_dec_link_count(inode);
	inode_dec_link_count(inode);
	iput (inode);
out_dir:
	inode_dec_link_count(dir);
	unlock_kernel();
	goto out;
}
Beispiel #10
0
static int ext2_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
{
    struct inode * inode;
    int err;

    dquot_initialize(dir);

    inode_inc_link_count(dir);

    inode = ext2_new_inode(dir, S_IFDIR | mode, &dentry->d_name);
    err = PTR_ERR(inode);
    if (IS_ERR(inode))
        goto out_dir;

    inode->i_op = &ext2_dir_inode_operations;
    inode->i_fop = &ext2_dir_operations;
    if (test_opt(inode->i_sb, NOBH))
        inode->i_mapping->a_ops = &ext2_nobh_aops;
    else
        inode->i_mapping->a_ops = &ext2_aops;

    inode_inc_link_count(inode);

    err = ext2_make_empty(inode, dir);
    if (err)
        goto out_fail;

    err = ext2_add_link(dentry, inode);
    if (err)
        goto out_fail;

    unlock_new_inode(inode);
    d_instantiate(dentry, inode);
out:
    return err;

out_fail:
    inode_dec_link_count(inode);
    inode_dec_link_count(inode);
    unlock_new_inode(inode);
    iput(inode);
out_dir:
    inode_dec_link_count(dir);
    goto out;
}
Beispiel #11
0
static int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode)
{
    struct inode * inode;
    int err = -EMLINK;

    if (dir->i_nlink >= EXT2_LINK_MAX)
        goto out;

    inode_inc_link_count(dir);

    inode = ext2_new_inode (dir, S_IFDIR | mode);
    err = PTR_ERR(inode);
    if (IS_ERR(inode))
        goto out_dir;

    inode->i_op = &ext2_dir_inode_operations;
    inode->i_fop = &ext2_dir_operations;
    if (test_opt(inode->i_sb, NOBH))
        inode->i_mapping->a_ops = &ext2_nobh_aops;
    else
        inode->i_mapping->a_ops = &ext2_aops;

    inode_inc_link_count(inode);

    err = ext2_make_empty(inode, dir);
    if (err)
        goto out_fail;

    err = ext2_add_link(dentry, inode);
    if (err)
        goto out_fail;

    d_instantiate(dentry, inode);
out:
    return err;

out_fail:
    inode_dec_link_count(inode);
    inode_dec_link_count(inode);
    iput(inode);
out_dir:
    inode_dec_link_count(dir);
    goto out;
}
Beispiel #12
0
static int ufs_mkdir(struct inode * dir, struct dentry * dentry, umode_t mode)
{
	struct inode * inode;
	int err;

	lock_ufs(dir->i_sb);
	inode_inc_link_count(dir);

	inode = ufs_new_inode(dir, S_IFDIR|mode);
	err = PTR_ERR(inode);
	if (IS_ERR(inode))
		goto out_dir;

	inode->i_op = &ufs_dir_inode_operations;
	inode->i_fop = &ufs_dir_operations;
	inode->i_mapping->a_ops = &ufs_aops;

	inode_inc_link_count(inode);

	err = ufs_make_empty(inode, dir);
	if (err)
		goto out_fail;

	err = ufs_add_link(dentry, inode);
	if (err)
		goto out_fail;
	unlock_ufs(dir->i_sb);

	unlock_new_inode(inode);
	d_instantiate(dentry, inode);
out:
	return err;

out_fail:
	inode_dec_link_count(inode);
	inode_dec_link_count(inode);
	unlock_new_inode(inode);
	iput (inode);
out_dir:
	inode_dec_link_count(dir);
	unlock_ufs(dir->i_sb);
	goto out;
}
Beispiel #13
0
static int minix_link(struct dentry * old_dentry, struct inode * dir,
	struct dentry *dentry)
{
	struct inode *inode = old_dentry->d_inode;

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	ihold(inode);
	return add_nondir(dentry, inode);
}
Beispiel #14
0
static int minix_link(struct dentry * old_dentry, struct inode * dir,
                      struct dentry *dentry)
{
    struct inode *inode = d_inode(old_dentry);

    inode->i_ctime = current_time(inode);
    inode_inc_link_count(inode);
    ihold(inode);
    return add_nondir(dentry, inode);
}
Beispiel #15
0
static int minix_mkdir(struct inode * dir, struct dentry *dentry, int mode)
{
	struct inode * inode;
	int err = -EMLINK;

	if (dir->i_nlink >= minix_sb(dir->i_sb)->s_link_max)
		goto out;

	inode_inc_link_count(dir);

	inode = minix_new_inode(dir, &err);
	if (!inode)
		goto out_dir;

	inode->i_mode = S_IFDIR | mode;
	if (dir->i_mode & S_ISGID)
		inode->i_mode |= S_ISGID;
	minix_set_inode(inode, 0);

	inode_inc_link_count(inode);

	err = minix_make_empty(inode, dir);
	if (err)
		goto out_fail;

	err = minix_add_link(dentry, inode);
	if (err)
		goto out_fail;

	d_instantiate(dentry, inode);
out:
	return err;

out_fail:
	inode_dec_link_count(inode);
	inode_dec_link_count(inode);
	iput(inode);
out_dir:
	inode_dec_link_count(dir);
	goto out;
}
static int minix_link(struct dentry * old_dentry, struct inode * dir,
	struct dentry *dentry)
{
	struct inode *inode = old_dentry->d_inode;

	if (inode->i_nlink >= minix_sb(inode->i_sb)->s_link_max)
		return -EMLINK;

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	atomic_inc(&inode->i_count);
	return add_nondir(dentry, inode);
}
Beispiel #17
0
static int sysv_mkdir(struct inode * dir, struct dentry *dentry, int mode)
{
    struct inode * inode;
    int err = -EMLINK;

    if (dir->i_nlink >= SYSV_SB(dir->i_sb)->s_link_max)
        goto out;
    inode_inc_link_count(dir);

    inode = sysv_new_inode(dir, S_IFDIR|mode);
    err = PTR_ERR(inode);
    if (IS_ERR(inode))
        goto out_dir;

    sysv_set_inode(inode, 0);

    inode_inc_link_count(inode);

    err = sysv_make_empty(inode, dir);
    if (err)
        goto out_fail;

    err = sysv_add_link(dentry, inode);
    if (err)
        goto out_fail;

    d_instantiate(dentry, inode);
out:
    return err;

out_fail:
    inode_dec_link_count(inode);
    inode_dec_link_count(inode);
    iput(inode);
out_dir:
    inode_dec_link_count(dir);
    goto out;
}
Beispiel #18
0
static int sysv_link(struct dentry * old_dentry, struct inode * dir, 
	struct dentry * dentry)
{
	struct inode *inode = old_dentry->d_inode;

	if (inode->i_nlink >= SYSV_SB(inode->i_sb)->s_link_max)
		return -EMLINK;

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	ihold(inode);

	return add_nondir(dentry, inode);
}
static int ext2_link (struct dentry * old_dentry, struct inode * dir,
	struct dentry *dentry)
{
	struct inode *inode = old_dentry->d_inode;

	if (inode->i_nlink >= EXT2_LINK_MAX)
		return -EMLINK;

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	atomic_inc(&inode->i_count);

	return ext2_add_nondir(dentry, inode);
}
Beispiel #20
0
static int ufs_link (struct dentry * old_dentry, struct inode * dir,
	struct dentry *dentry)
{
	struct inode *inode = old_dentry->d_inode;
	int error;

	lock_ufs(dir->i_sb);

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	ihold(inode);

	error = ufs_add_nondir(dentry, inode);
	unlock_ufs(dir->i_sb);
	return error;
}
Beispiel #21
0
static int simplefs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) {
	struct inode *inode = old_dentry->d_inode;
	int err;

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	atomic_inc(&inode->i_count);
	err = simplefs_insert_dentry(dentry, inode);
	if (!err) {
		d_instantiate(dentry, inode);
		return 0;
	}
	inode_dec_link_count(inode);
	iput(inode);
	return err;
}
Beispiel #22
0
// ln A/B C/D
// Here, old_dentry points to B
// dir points to C
static int ext2_link (struct dentry * old_dentry, struct inode * dir,
                      struct dentry *dentry)
{
    struct inode *inode = old_dentry->d_inode;

    if (inode->i_nlink >= EXT2_LINK_MAX)
        return -EMLINK;

    ext2bp_debug("Linking with old inode: %d\n", inode->i_ino);
    ext2bp_debug("Linking new dir: %d\n", dir->i_ino);

    inode->i_ctime = CURRENT_TIME_SEC;
    inode_inc_link_count(inode);
    atomic_inc(&inode->i_count);

    return ext2_add_nondir(dentry, inode);
}
Beispiel #23
0
static int ufs_link (struct dentry * old_dentry, struct inode * dir,
	struct dentry *dentry)
{
	struct inode *inode = d_inode(old_dentry);
	int error;

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	ihold(inode);

	error = ufs_add_link(dentry, inode);
	if (error) {
		inode_dec_link_count(inode);
		iput(inode);
	} else
		d_instantiate(dentry, inode);
	return error;
}
Beispiel #24
0
static int ufs_link (struct dentry * old_dentry, struct inode * dir,
	struct dentry *dentry)
{
	struct inode *inode = old_dentry->d_inode;
	int error;

	lock_kernel();
	if (inode->i_nlink >= UFS_LINK_MAX) {
		unlock_kernel();
		return -EMLINK;
	}

	inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count(inode);
	atomic_inc(&inode->i_count);

	error = ufs_add_nondir(dentry, inode);
	unlock_kernel();
	return error;
}
Beispiel #25
0
static int ext2_link (struct dentry * old_dentry, struct inode * dir,
                      struct dentry *dentry)
{
    struct inode *inode = old_dentry->d_inode;
    int err;

    dquot_initialize(dir);

    inode->i_ctime = CURRENT_TIME_SEC;
    inode_inc_link_count(inode);
    ihold(inode);

    err = ext2_add_link(dentry, inode);
    if (!err) {
        d_instantiate(dentry, inode);
        return 0;
    }
    inode_dec_link_count(inode);
    iput(inode);
    return err;
}
Beispiel #26
0
static int tux3_link(struct dentry *old_dentry, struct inode *dir,
		     struct dentry *dentry)
{
	struct inode *inode = old_dentry->d_inode;
	int err;

	if (inode->i_nlink >= TUX_LINK_MAX)
		return -EMLINK;

	change_begin(tux_sb(inode->i_sb));
	inode->i_ctime = gettime();
	inode_inc_link_count(inode);
	atomic_inc(&inode->i_count);
	err = tux_add_dirent(dir, dentry, inode);
	if (err) {
		inode_dec_link_count(inode);
		iput(inode);
	}
	change_end(tux_sb(inode->i_sb));
	return err;
}
Beispiel #27
0
static int simplefs_mkdir(struct inode *dir, struct dentry *dentry, int mode) {
	struct inode *inode = NULL;
	long ino;
	int err = 0;

	printk(KERN_INFO "simplefs_mkdir: %s %d\n", dentry->d_name.name, mode);
	inode_inc_link_count(dir);
	
	ino = bitmap_alloc_inode(dir->i_sb);
	if (ino < 0)
		return -EIO;
	inode = simplefs_iget(dir->i_sb, ino);
	if (IS_ERR(inode))
		return -EIO;

	// set inode operations
	inode->i_op = &simplefs_file_inode_operations;
	inode->i_fop = &simplefs_file_operations;
	inode->i_mapping->a_ops = &simplefs_aops;

	inode->i_mode = mode | S_IFDIR;
	inode->i_nlink = 2;
	inode->i_size = inode->i_blocks = inode->i_bytes = 0;
	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;

	mark_inode_dirty(inode);
	err = simplefs_insert_dentry(dentry, inode);
	if (!err) {
		d_instantiate(dentry, inode);
		return 0;
	}

	inode_dec_link_count(inode);
	inode_dec_link_count(inode);
	iput(inode);
	inode_dec_link_count(dir);
	return err;
}
Beispiel #28
0
static int __tux3_mknod(struct inode *dir, struct dentry *dentry,
			struct tux_iattr *iattr, dev_t rdev)
{
	if(DEBUG_MODE_K==1)
	{
		printf("\t\t\t\t%25s[K]  %25s  %4d  #in\n",__FILE__,__func__,__LINE__);
	}
	struct inode *inode;
	int err, is_dir = S_ISDIR(iattr->mode);

	if (!huge_valid_dev(rdev))
		return -EINVAL;

	if (is_dir && dir->i_nlink >= TUX_LINK_MAX)
		return -EMLINK;

	change_begin(tux_sb(dir->i_sb));
	inode = tux_create_inode(dir, iattr, rdev);
	err = PTR_ERR(inode);
	if (!IS_ERR(inode)) {
		err = tux_add_dirent(dir, dentry, inode);
		if (!err) {
			unlock_new_inode(inode);
			if (is_dir)
				inode_inc_link_count(dir);
			goto out;
		}
		clear_nlink(inode);
		tux3_mark_inode_dirty(inode);
		unlock_new_inode(inode);
		iput(inode);
	}
out:
	change_end(tux_sb(dir->i_sb));
	return err;
}
/*
==================================================================================
	Function	:me2fsLink
	Input		:struct dentry *old_dentry
				 < old file name >
				 struct inode *dir
				 < vfs inode of parent >
				 struct dentry *dentry
				 < new file name >
	Output		:void
	Return		:int
				 < result >

	Description	:link old file to new file
==================================================================================
*/
static int
me2fsLink( struct dentry *old_dentry, struct inode *dir, struct dentry *dentry )
{
	struct inode	*old_inode;
	int				err;

	old_inode = old_dentry->d_inode;

	old_inode->i_ctime = CURRENT_TIME_SEC;
	inode_inc_link_count( old_inode );
	ihold( old_inode );

	if( !( err = me2fsAddLink( dentry, old_inode ) ) )
	{
		d_instantiate( dentry, old_inode );
		return( 0 );
	}

	inode_dec_link_count( old_inode );
	iput( old_inode );

	return( err );

}
Beispiel #30
0
int uxfs_mkdir(struct inode *dip, struct dentry *dentry, umode_t mode)
{
	struct uxfs_inode *nip;
	struct buffer_head *bh;
	struct super_block *sb = dip->i_sb;
	struct uxfs_dirent *dirent;
	struct inode *inode;
	ino_t inum = 0;
	int blk;

	/*
	 * Make sure there isn't already an entry. If not, 
	 * allocate one, a new inode and new incore inode.
	 */

	inum = uxfs_find_entry(dip, (char *)dentry->d_name.name);
	if (inum)
		return -EEXIST;
	inode = new_inode(sb);
	if (!inode)
		return -ENOSPC;
	inum = uxfs_ialloc(sb);
	if (!inum) {
		iput(inode);
		return -ENOSPC;
	}
	uxfs_diradd(dip, (char *)dentry->d_name.name, inum);

	inode->i_uid = current_fsuid();
	inode->i_gid =
	    (dip->i_mode & S_ISGID) ? dip->i_gid : current_fsgid();
	inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
	inode->i_blocks = 1;
//      inode->i_blksize = UXFS_BSIZE;
	inode->i_op = &uxfs_dir_inops;
	inode->i_fop = &uxfs_dir_operations;
	inode->i_mapping->a_ops = &uxfs_aops;
	inode->i_mode = mode | S_IFDIR;
	inode->i_ino = inum;
	inode->i_size = UXFS_BSIZE;
	inode->i_private = uxfs_i(inode);	//initialize private, again!
	set_nlink(inode, 2);

	nip = (struct uxfs_inode *)inode->i_private;
	nip->i_mode = mode | S_IFDIR;
	nip->i_nlink = 2;
	nip->i_atime = nip->i_ctime = nip->i_mtime = CURRENT_TIME.tv_sec;
	nip->i_uid = current_fsuid();
	nip->i_gid =
	    (dip->i_mode & S_ISGID) ? dip->i_gid : current_fsgid();
	nip->i_size = 512;
	nip->i_blocks = 1;
	memset(nip->i_addr, 0,
	       UXFS_DIRECT_BLOCKS * sizeof(nip->i_addr[0]));

	blk = uxfs_block_alloc(sb);
	nip->i_addr[0] = blk;
	bh = sb_bread(sb, blk);
	memset(bh->b_data, 0, UXFS_BSIZE);
	dirent = (struct uxfs_dirent *)bh->b_data;
	dirent->d_ino = inum;
	strcpy(dirent->d_name, ".");
	dirent++;
	dirent->d_ino = inode->i_ino;
	strcpy(dirent->d_name, "..");

	mark_buffer_dirty(bh);
	brelse(bh);
	insert_inode_hash(inode);
	d_instantiate(dentry, inode);
	mark_inode_dirty(inode);

	/*
	 * Increment the link count of the parent directory.
	 */

	inode_inc_link_count(dip);
	mark_inode_dirty(dip);
	return 0;
}