On Thu, Aug 21, 2014 at 07:58:43PM -0500, Eric Sandeen wrote: > xfs_dir_canenter and xfs_dir_createname are > almost identical. > > Fold the former into the latter, with a helpful > wrapper for the former. If createname is called without > an inode number, it now only checks for space, and does > not actually add the entry. > > Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > > diff --git a/fs/xfs/libxfs/xfs_dir2.c b/fs/xfs/libxfs/xfs_dir2.c > index ea84e1c..fdd391f 100644 > --- a/fs/xfs/libxfs/xfs_dir2.c > +++ b/fs/xfs/libxfs/xfs_dir2.c > @@ -237,7 +237,8 @@ xfs_dir_init( > } > > /* > - Enter a name in a directory. > + * Enter a name in a directory. > + * If inum is 0, only test for available space. > */ > int > xfs_dir_createname( > @@ -254,10 +255,12 @@ xfs_dir_createname( > int v; /* type-checking value */ > > ASSERT(S_ISDIR(dp->i_d.di_mode)); > - rval = xfs_dir_ino_validate(tp->t_mountp, inum); > - if (rval) > - return rval; > - XFS_STATS_INC(xs_dir_create); > + if (inum) { > + rval = xfs_dir_ino_validate(tp->t_mountp, inum); > + if (rval) > + return rval; > + XFS_STATS_INC(xs_dir_create); > + } > > args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); > if (!args) > @@ -276,6 +279,8 @@ xfs_dir_createname( > args->whichfork = XFS_DATA_FORK; > args->trans = tp; > args->op_flags = XFS_DA_OP_ADDNAME | XFS_DA_OP_OKNOENT; > + if (!inum) > + args->op_flags |= XFS_DA_OP_JUSTCHECK; > > if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { > rval = xfs_dir2_sf_addname(args); > @@ -542,50 +547,7 @@ xfs_dir_canenter( > xfs_inode_t *dp, > struct xfs_name *name) /* name of entry to add */ > { > - struct xfs_da_args *args; > - int rval; > - int v; /* type-checking value */ > - > - ASSERT(S_ISDIR(dp->i_d.di_mode)); > - > - args = kmem_zalloc(sizeof(*args), KM_SLEEP | KM_NOFS); > - if (!args) > - return -ENOMEM; > - > - args->geo = dp->i_mount->m_dir_geo; > - args->name = name->name; > - args->namelen = name->len; > - args->filetype = name->type; > - args->hashval = dp->i_mount->m_dirnameops->hashname(name); > - args->dp = dp; > - args->whichfork = XFS_DATA_FORK; > - args->trans = tp; > - args->op_flags = XFS_DA_OP_JUSTCHECK | XFS_DA_OP_ADDNAME | > - XFS_DA_OP_OKNOENT; > - > - if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { > - rval = xfs_dir2_sf_addname(args); > - goto out_free; > - } > - > - rval = xfs_dir2_isblock(args, &v); > - if (rval) > - goto out_free; > - if (v) { > - rval = xfs_dir2_block_addname(args); > - goto out_free; > - } > - > - rval = xfs_dir2_isleaf(args, &v); > - if (rval) > - goto out_free; > - if (v) > - rval = xfs_dir2_leaf_addname(args); > - else > - rval = xfs_dir2_node_addname(args); > -out_free: > - kmem_free(args); > - return rval; > + return xfs_dir_createname(tp, dp, name, 0, NULL, NULL, 0); > } > > /* > > > _______________________________________________ > xfs mailing list > xfs@xxxxxxxxxxx > http://oss.sgi.com/mailman/listinfo/xfs _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs