* [REVIEW #3] cleanup - remove bhv_vname_t
@ 2008-04-09 7:24 Barry Naujok
2008-04-09 7:28 ` Barry Naujok
2008-04-09 7:49 ` Christoph Hellwig
0 siblings, 2 replies; 3+ messages in thread
From: Barry Naujok @ 2008-04-09 7:24 UTC (permalink / raw)
To: xfs@oss.sgi.com, xfs-dev
[-- Attachment #1: Type: text/plain, Size: 39988 bytes --]
I gave some "loving" to xfs_rename. Stack usage for xfs_rename down from
184 bytes to 152 bytes.
xfs_name declaration is now in xfs_types.h.
There are a couple more whitespace cleanups in this patch (very minor).
This patch applies to the latest code after Dave's check-ins.
---
fs/dmapi/dmapi_event.c | 4 -
fs/dmapi/dmapi_kern.h | 4 -
fs/xfs/dmapi/xfs_dm.c | 6 +-
fs/xfs/linux-2.6/xfs_export.c | 5 -
fs/xfs/linux-2.6/xfs_iops.c | 55 ++++++++++++++-----
fs/xfs/linux-2.6/xfs_vnode.h | 9 ---
fs/xfs/xfs_dir2.c | 62 +++++++++------------
fs/xfs/xfs_dir2.h | 12 ++--
fs/xfs/xfs_mount.h | 4 -
fs/xfs/xfs_rename.c | 82 ++++++++++------------------
fs/xfs/xfs_types.h | 5 +
fs/xfs/xfs_utils.c | 4 -
fs/xfs/xfs_utils.h | 4 -
fs/xfs/xfs_vnodeops.c | 121
++++++++++++++++++------------------------
fs/xfs/xfs_vnodeops.h | 23 ++++---
15 files changed, 191 insertions(+), 209 deletions(-)
Index: kern_ci/fs/dmapi/dmapi_event.c
===================================================================
--- kern_ci.orig/fs/dmapi/dmapi_event.c
+++ kern_ci/fs/dmapi/dmapi_event.c
@@ -622,8 +622,8 @@ dm_send_namesp_event(
dm_right_t vp1_right,
struct inode *ip2,
dm_right_t vp2_right,
- char *name1,
- char *name2,
+ const char *name1,
+ const char *name2,
mode_t mode,
int retcode,
int flags)
Index: kern_ci/fs/dmapi/dmapi_kern.h
===================================================================
--- kern_ci.orig/fs/dmapi/dmapi_kern.h
+++ kern_ci/fs/dmapi/dmapi_kern.h
@@ -119,8 +119,8 @@ int dm_send_namesp_event(
dm_right_t vp1_right,
struct inode *ip2,
dm_right_t vp2_right,
- char *name1,
- char *name2,
+ const char *name1,
+ const char *name2,
mode_t mode,
int retcode,
int flags);
Index: kern_ci/fs/xfs/dmapi/xfs_dm.c
===================================================================
--- kern_ci.orig/fs/xfs/dmapi/xfs_dm.c
+++ kern_ci/fs/xfs/dmapi/xfs_dm.c
@@ -245,7 +245,7 @@ xfs_copyin_attrname(
size_t len;
strcpy(to->dan_chars, dmattr_prefix);
-
+
len = strnlen_user((char __user *)from, DM_ATTR_NAME_SIZE);
if (len == 0)
error = EFAULT;
@@ -3172,8 +3172,8 @@ xfs_dm_send_namesp_event(
dm_right_t vp1_right,
xfs_inode_t *ip2,
dm_right_t vp2_right,
- char *name1,
- char *name2,
+ const char *name1,
+ const char *name2,
mode_t mode,
int retcode,
int flags)
Index: kern_ci/fs/xfs/linux-2.6/xfs_export.c
===================================================================
--- kern_ci.orig/fs/xfs/linux-2.6/xfs_export.c
+++ kern_ci/fs/xfs/linux-2.6/xfs_export.c
@@ -22,6 +22,7 @@
#include "xfs_trans.h"
#include "xfs_sb.h"
#include "xfs_ag.h"
+#include "xfs_dir2.h"
#include "xfs_dmapi.h"
#include "xfs_mount.h"
#include "xfs_export.h"
@@ -30,8 +31,6 @@
#include "xfs_inode.h"
#include "xfs_vfsops.h"
-static struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, };
-
/*
* Note that we only accept fileids which are long enough rather than
allow
* the parent generation number to default to zero. XFS considers zero a
@@ -216,7 +215,7 @@ xfs_fs_get_parent(
struct xfs_inode *cip;
struct dentry *parent;
- error = xfs_lookup(XFS_I(child->d_inode), &dotdot, &cip);
+ error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip);
if (unlikely(error))
return ERR_PTR(-error);
Index: kern_ci/fs/xfs/linux-2.6/xfs_iops.c
===================================================================
--- kern_ci.orig/fs/xfs/linux-2.6/xfs_iops.c
+++ kern_ci/fs/xfs/linux-2.6/xfs_iops.c
@@ -239,6 +239,15 @@ xfs_init_security(
return error;
}
+static void
+xfs_dentry_to_name(
+ struct xfs_name *namep,
+ struct dentry *dentry)
+{
+ namep->name = dentry->d_name.name;
+ namep->len = dentry->d_name.len;
+}
+
STATIC void
xfs_cleanup_inode(
struct inode *dir,
@@ -246,20 +255,19 @@ xfs_cleanup_inode(
struct dentry *dentry,
int mode)
{
- struct dentry teardown = {};
+ struct xfs_name teardown;
/* Oh, the horror.
* If we can't add the ACL or we fail in
* xfs_init_security we must back out.
* ENOSPC can hit here, among other things.
*/
- teardown.d_inode = inode;
- teardown.d_name = dentry->d_name;
+ xfs_dentry_to_name(&teardown, dentry);
if (S_ISDIR(mode))
- xfs_rmdir(XFS_I(dir), &teardown);
+ xfs_rmdir(XFS_I(dir), &teardown, XFS_I(inode));
else
- xfs_remove(XFS_I(dir), &teardown);
+ xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
iput(inode);
}
@@ -273,6 +281,7 @@ xfs_vn_mknod(
struct inode *inode;
struct xfs_inode *ip = NULL;
xfs_acl_t *default_acl = NULL;
+ struct xfs_name name;
attrexists_t test_default_acl = _ACL_DEFAULT_EXISTS;
int error;
@@ -293,6 +302,8 @@ xfs_vn_mknod(
}
}
+ xfs_dentry_to_name(&name, dentry);
+
if (IS_POSIXACL(dir) && !default_acl)
mode &= ~current->fs->umask;
@@ -303,10 +314,10 @@ xfs_vn_mknod(
case S_IFSOCK:
rdev = sysv_encode_dev(rdev);
case S_IFREG:
- error = xfs_create(XFS_I(dir), dentry, mode, rdev, &ip, NULL);
+ error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL);
break;
case S_IFDIR:
- error = xfs_mkdir(XFS_I(dir), dentry, mode, &ip, NULL);
+ error = xfs_mkdir(XFS_I(dir), &name, mode, &ip, NULL);
break;
default:
error = EINVAL;
@@ -371,12 +382,14 @@ xfs_vn_lookup(
struct nameidata *nd)
{
struct xfs_inode *cip;
+ struct xfs_name name;
int error;
if (dentry->d_name.len >= MAXNAMELEN)
return ERR_PTR(-ENAMETOOLONG);
- error = xfs_lookup(XFS_I(dir), dentry, &cip);
+ xfs_dentry_to_name(&name, dentry);
+ error = xfs_lookup(XFS_I(dir), &name, &cip);
if (unlikely(error)) {
if (unlikely(error != ENOENT))
return ERR_PTR(-error);
@@ -394,12 +407,14 @@ xfs_vn_link(
struct dentry *dentry)
{
struct inode *inode; /* inode of guy being linked to */
+ struct xfs_name name;
int error;
inode = old_dentry->d_inode;
+ xfs_dentry_to_name(&name, dentry);
igrab(inode);
- error = xfs_link(XFS_I(dir), XFS_I(inode), dentry);
+ error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
if (unlikely(error)) {
iput(inode);
return -error;
@@ -417,11 +432,13 @@ xfs_vn_unlink(
struct dentry *dentry)
{
struct inode *inode;
+ struct xfs_name name;
int error;
inode = dentry->d_inode;
+ xfs_dentry_to_name(&name, dentry);
- error = xfs_remove(XFS_I(dir), dentry);
+ error = xfs_remove(XFS_I(dir), &name, XFS_I(inode));
if (likely(!error)) {
xfs_validate_fields(dir); /* size needs update */
xfs_validate_fields(inode);
@@ -437,14 +454,15 @@ xfs_vn_symlink(
{
struct inode *inode;
struct xfs_inode *cip = NULL;
+ struct xfs_name name;
int error;
mode_t mode;
mode = S_IFLNK |
(irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO);
+ xfs_dentry_to_name(&name, dentry);
- error = xfs_symlink(XFS_I(dir), dentry, (char *)symname, mode,
- &cip, NULL);
+ error = xfs_symlink(XFS_I(dir), &name, symname, mode, &cip, NULL);
if (unlikely(error))
goto out;
@@ -471,9 +489,12 @@ xfs_vn_rmdir(
struct dentry *dentry)
{
struct inode *inode = dentry->d_inode;
+ struct xfs_name name;
int error;
- error = xfs_rmdir(XFS_I(dir), dentry);
+ xfs_dentry_to_name(&name, dentry);
+
+ error = xfs_rmdir(XFS_I(dir), &name, XFS_I(inode));
if (likely(!error)) {
xfs_validate_fields(inode);
xfs_validate_fields(dir);
@@ -489,9 +510,15 @@ xfs_vn_rename(
struct dentry *ndentry)
{
struct inode *new_inode = ndentry->d_inode;
+ struct xfs_name oname;
+ struct xfs_name nname;
int error;
- error = xfs_rename(XFS_I(odir), odentry, XFS_I(ndir), ndentry);
+ xfs_dentry_to_name(&oname, odentry);
+ xfs_dentry_to_name(&nname, ndentry);
+
+ error = xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode),
+ XFS_I(ndir), &nname);
if (likely(!error)) {
if (new_inode)
xfs_validate_fields(new_inode);
Index: kern_ci/fs/xfs/linux-2.6/xfs_vnode.h
===================================================================
--- kern_ci.orig/fs/xfs/linux-2.6/xfs_vnode.h
+++ kern_ci/fs/xfs/linux-2.6/xfs_vnode.h
@@ -23,8 +23,6 @@ struct bhv_vattr;
struct xfs_iomap;
struct attrlist_cursor_kern;
-typedef struct dentry bhv_vname_t;
-typedef __u64 bhv_vnumber_t;
typedef struct inode bhv_vnode_t;
#define VN_ISLNK(vp) S_ISLNK((vp)->i_mode)
@@ -211,13 +209,6 @@ static inline bhv_vnode_t *vn_grab(bhv_v
}
/*
- * Vname handling macros.
- */
-#define VNAME(dentry) ((char *) (dentry)->d_name.name)
-#define VNAMELEN(dentry) ((dentry)->d_name.len)
-#define VNAME_TO_INODE(dentry) (XFS_I((dentry)->d_inode))
-
-/*
* Dealing with bad inodes
*/
static inline int VN_BAD(bhv_vnode_t *vp)
Index: kern_ci/fs/xfs/xfs_dir2.c
===================================================================
--- kern_ci.orig/fs/xfs/xfs_dir2.c
+++ kern_ci/fs/xfs/xfs_dir2.c
@@ -44,6 +44,7 @@
#include "xfs_error.h"
#include "xfs_vnodeops.h"
+struct xfs_name xfs_name_dotdot = {"..", 2};
void
xfs_dir_mount(
@@ -146,8 +147,7 @@ int
xfs_dir_createname(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name,
- int namelen,
+ struct xfs_name *name,
xfs_ino_t inum, /* new entry inode number */
xfs_fsblock_t *first, /* bmap's firstblock */
xfs_bmap_free_t *flist, /* bmap's freeblock list */
@@ -162,9 +162,9 @@ xfs_dir_createname(
return rval;
XFS_STATS_INC(xs_dir_create);
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.inumber = inum;
args.dp = dp;
args.firstblock = first;
@@ -197,8 +197,7 @@ int
xfs_dir_lookup(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name,
- int namelen,
+ struct xfs_name *name,
xfs_ino_t *inum) /* out: inode number */
{
xfs_da_args_t args;
@@ -207,18 +206,14 @@ xfs_dir_lookup(
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
XFS_STATS_INC(xs_dir_lookup);
+ memset(&args, 0, sizeof(xfs_da_args_t));
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
- args.inumber = 0;
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.dp = dp;
- args.firstblock = NULL;
- args.flist = NULL;
- args.total = 0;
args.whichfork = XFS_DATA_FORK;
args.trans = tp;
- args.justcheck = args.addname = 0;
args.oknoent = 1;
if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
@@ -247,8 +242,7 @@ int
xfs_dir_removename(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name,
- int namelen,
+ struct xfs_name *name,
xfs_ino_t ino,
xfs_fsblock_t *first, /* bmap's firstblock */
xfs_bmap_free_t *flist, /* bmap's freeblock list */
@@ -261,9 +255,9 @@ xfs_dir_removename(
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
XFS_STATS_INC(xs_dir_remove);
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.inumber = ino;
args.dp = dp;
args.firstblock = first;
@@ -329,8 +323,7 @@ int
xfs_dir_replace(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name, /* name of entry to replace */
- int namelen,
+ struct xfs_name *name, /* name of entry to replace */
xfs_ino_t inum, /* new inode number */
xfs_fsblock_t *first, /* bmap's firstblock */
xfs_bmap_free_t *flist, /* bmap's freeblock list */
@@ -345,9 +338,9 @@ xfs_dir_replace(
if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum)))
return rval;
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.inumber = inum;
args.dp = dp;
args.firstblock = first;
@@ -374,28 +367,29 @@ xfs_dir_replace(
/*
* See if this entry can be added to the directory without allocating
space.
+ * First checks that the caller couldn't reserve enough space (resblks =
0).
*/
int
xfs_dir_canenter(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name, /* name of entry to add */
- int namelen)
+ struct xfs_name *name, /* name of entry to add */
+ uint resblks)
{
xfs_da_args_t args;
int rval;
int v; /* type-checking value */
+ if (resblks)
+ return 0;
+
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
+ memset(&args, 0, sizeof(xfs_da_args_t));
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
- args.inumber = 0;
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.dp = dp;
- args.firstblock = NULL;
- args.flist = NULL;
- args.total = 0;
args.whichfork = XFS_DATA_FORK;
args.trans = tp;
args.justcheck = args.addname = args.oknoent = 1;
Index: kern_ci/fs/xfs/xfs_dir2.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_dir2.h
+++ kern_ci/fs/xfs/xfs_dir2.h
@@ -59,6 +59,8 @@ typedef __uint32_t xfs_dir2_db_t;
*/
typedef xfs_off_t xfs_dir2_off_t;
+extern struct xfs_name xfs_name_dotdot;
+
/*
* Generic directory interface routines
*/
@@ -68,21 +70,21 @@ extern int xfs_dir_isempty(struct xfs_in
extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp,
struct xfs_inode *pdp);
extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen, xfs_ino_t inum,
+ struct xfs_name *name, xfs_ino_t inum,
xfs_fsblock_t *first,
struct xfs_bmap_free *flist, xfs_extlen_t tot);
extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen, xfs_ino_t *inum);
+ struct xfs_name *name, xfs_ino_t *inum);
extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen, xfs_ino_t ino,
+ struct xfs_name *name, xfs_ino_t ino,
xfs_fsblock_t *first,
struct xfs_bmap_free *flist, xfs_extlen_t tot);
extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen, xfs_ino_t inum,
+ struct xfs_name *name, xfs_ino_t inum,
xfs_fsblock_t *first,
struct xfs_bmap_free *flist, xfs_extlen_t tot);
extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen);
+ struct xfs_name *name, uint resblks);
extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino);
/*
Index: kern_ci/fs/xfs/xfs_mount.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_mount.h
+++ kern_ci/fs/xfs/xfs_mount.h
@@ -73,7 +73,7 @@ typedef int (*xfs_send_destroy_t)(struct
typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *,
struct xfs_inode *, dm_right_t,
struct xfs_inode *, dm_right_t,
- char *, char *, mode_t, int, int);
+ const char *, const char *, mode_t, int, int);
typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t,
char *, char *);
typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *,
@@ -401,7 +401,7 @@ typedef struct xfs_mount {
/*
* Allow large block sizes to be reported to userspace programs if the
- * "largeio" mount option is used.
+ * "largeio" mount option is used.
*
* If compatibility mode is specified, simply return the basic unit of
caching
* so that we don't get inefficient read/modify/write I/O from user apps.
Index: kern_ci/fs/xfs/xfs_rename.c
===================================================================
--- kern_ci.orig/fs/xfs/xfs_rename.c
+++ kern_ci/fs/xfs/xfs_rename.c
@@ -83,25 +83,24 @@ int xfs_rename_skip, xfs_rename_nskip;
*/
STATIC int
xfs_lock_for_rename(
- xfs_inode_t *dp1, /* old (source) directory inode */
- xfs_inode_t *dp2, /* new (target) directory inode */
- bhv_vname_t *vname1,/* old entry name */
- bhv_vname_t *vname2,/* new entry name */
- xfs_inode_t **ipp1, /* inode of old entry */
- xfs_inode_t **ipp2, /* inode of new entry, if it
+ xfs_inode_t *dp1, /* in: old (source) directory inode */
+ xfs_inode_t *dp2, /* in: new (target) directory inode */
+ xfs_inode_t *ip1, /* in: inode of old entry */
+ struct xfs_name *name2, /* in: new entry name */
+ xfs_inode_t **ipp2, /* out: inode of new entry, if it
already exists, NULL otherwise. */
- xfs_inode_t **i_tab,/* array of inode returned, sorted */
- int *num_inodes) /* number of inodes in array */
+ xfs_inode_t **i_tab,/* out: array of inode returned, sorted */
+ int *num_inodes) /* out: number of inodes in array */
{
- xfs_inode_t *ip1 = VNAME_TO_INODE(vname1);
- xfs_inode_t *ip2, *temp;
+ xfs_inode_t *ip2 = NULL;
+ xfs_inode_t *temp;
xfs_ino_t inum1, inum2;
int error;
int i, j;
uint lock_mode;
int diff_dirs = (dp1 != dp2);
- ip2 = NULL;
+ ASSERT(ip1);
/*
* First, find out the current inums of the entries so that we
@@ -115,17 +114,15 @@ xfs_lock_for_rename(
inum1 = ip1->i_ino;
-
/*
* Unlock dp1 and lock dp2 if they are different.
*/
-
if (diff_dirs) {
xfs_iunlock_map_shared(dp1, lock_mode);
lock_mode = xfs_ilock_map_shared(dp2);
}
- error = xfs_dir_lookup_int(dp2, lock_mode, vname2, &inum2, &ip2);
+ error = xfs_dir_lookup_int(dp2, lock_mode, name2, &inum2, &ip2);
if (error == ENOENT) { /* target does not need to exist. */
inum2 = 0;
} else if (error) {
@@ -157,6 +154,7 @@ xfs_lock_for_rename(
*num_inodes = 4;
i_tab[3] = ip2;
}
+ *ipp2 = i_tab[3];
/*
* Sort the elements via bubble sort. (Remember, there are at
@@ -194,21 +192,6 @@ xfs_lock_for_rename(
xfs_lock_inodes(i_tab, *num_inodes, 0, XFS_ILOCK_SHARED);
}
- /*
- * Set the return value. Null out any unused entries in i_tab.
- */
- *ipp1 = *ipp2 = NULL;
- for (i=0; i < *num_inodes; i++) {
- if (i_tab[i]->i_ino == inum1) {
- *ipp1 = i_tab[i];
- }
- if (i_tab[i]->i_ino == inum2) {
- *ipp2 = i_tab[i];
- }
- }
- for (;i < 4; i++) {
- i_tab[i] = NULL;
- }
return 0;
}
@@ -218,12 +201,13 @@ xfs_lock_for_rename(
int
xfs_rename(
xfs_inode_t *src_dp,
- bhv_vname_t *src_vname,
+ struct xfs_name *src_name,
+ xfs_inode_t *src_ip,
xfs_inode_t *target_dp,
- bhv_vname_t *target_vname)
+ struct xfs_name *target_name)
{
xfs_trans_t *tp;
- xfs_inode_t *src_ip, *target_ip;
+ xfs_inode_t *target_ip;
xfs_mount_t *mp = src_dp->i_mount;
int new_parent; /* moving to a new dir */
int src_is_directory; /* src_name is a directory */
@@ -237,10 +221,6 @@ xfs_rename(
int spaceres;
int target_link_zero = 0;
int num_inodes;
- char *src_name = VNAME(src_vname);
- char *target_name = VNAME(target_vname);
- int src_namelen = VNAMELEN(src_vname);
- int target_namelen = VNAMELEN(target_vname);
xfs_itrace_entry(src_dp);
xfs_itrace_entry(target_dp);
@@ -250,7 +230,7 @@ xfs_rename(
error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME,
src_dp, DM_RIGHT_NULL,
target_dp, DM_RIGHT_NULL,
- src_name, target_name,
+ src_name->name, target_name->name,
0, 0, 0);
if (error) {
return error;
@@ -267,10 +247,8 @@ xfs_rename(
* does not exist in the source directory.
*/
tp = NULL;
- error = xfs_lock_for_rename(src_dp, target_dp, src_vname,
- target_vname, &src_ip, &target_ip, inodes,
- &num_inodes);
-
+ error = xfs_lock_for_rename(src_dp, target_dp, src_ip, target_name,
+ &target_ip, inodes, &num_inodes);
if (error) {
/*
* We have nothing locked, no inode references, and
@@ -316,7 +294,7 @@ xfs_rename(
XFS_BMAP_INIT(&free_list, &first_block);
tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME);
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
- spaceres = XFS_RENAME_SPACE_RES(mp, target_namelen);
+ spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
error = xfs_trans_reserve(tp, spaceres, XFS_RENAME_LOG_RES(mp), 0,
XFS_TRANS_PERM_LOG_RES, XFS_RENAME_LOG_COUNT);
if (error == ENOSPC) {
@@ -374,9 +352,8 @@ xfs_rename(
* If there's no space reservation, check the entry will
* fit before actually inserting it.
*/
- if (spaceres == 0 &&
- (error = xfs_dir_canenter(tp, target_dp, target_name,
- target_namelen)))
+ error = xfs_dir_canenter(tp, target_dp, target_name, spaceres);
+ if (error)
goto error_return;
/*
* If target does not exist and the rename crosses
@@ -384,8 +361,8 @@ xfs_rename(
* to account for the ".." reference from the new entry.
*/
error = xfs_dir_createname(tp, target_dp, target_name,
- target_namelen, src_ip->i_ino,
- &first_block, &free_list, spaceres);
+ src_ip->i_ino, &first_block,
+ &free_list, spaceres);
if (error == ENOSPC)
goto error_return;
if (error)
@@ -424,7 +401,7 @@ xfs_rename(
* name at the destination directory, remove it first.
*/
error = xfs_dir_replace(tp, target_dp, target_name,
- target_namelen, src_ip->i_ino,
+ src_ip->i_ino,
&first_block, &free_list, spaceres);
if (error)
goto abort_return;
@@ -461,7 +438,8 @@ xfs_rename(
* Rewrite the ".." entry to point to the new
* directory.
*/
- error = xfs_dir_replace(tp, src_ip, "..", 2, target_dp->i_ino,
+ error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
+ target_dp->i_ino,
&first_block, &free_list, spaceres);
ASSERT(error != EEXIST);
if (error)
@@ -497,8 +475,8 @@ xfs_rename(
goto abort_return;
}
- error = xfs_dir_removename(tp, src_dp, src_name, src_namelen,
- src_ip->i_ino, &first_block, &free_list, spaceres);
+ error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
+ &first_block, &free_list, spaceres);
if (error)
goto abort_return;
xfs_ichgtime(src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -583,7 +561,7 @@ std_return:
(void) XFS_SEND_NAMESP (mp, DM_EVENT_POSTRENAME,
src_dp, DM_RIGHT_NULL,
target_dp, DM_RIGHT_NULL,
- src_name, target_name,
+ src_name->name, target_name->name,
0, error, 0);
}
return error;
Index: kern_ci/fs/xfs/xfs_types.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_types.h
+++ kern_ci/fs/xfs/xfs_types.h
@@ -160,4 +160,9 @@ typedef enum {
XFS_BTNUM_MAX
} xfs_btnum_t;
+struct xfs_name {
+ const char *name;
+ int len;
+};
+
#endif /* __XFS_TYPES_H__ */
Index: kern_ci/fs/xfs/xfs_utils.c
===================================================================
--- kern_ci.orig/fs/xfs/xfs_utils.c
+++ kern_ci/fs/xfs/xfs_utils.c
@@ -45,7 +45,7 @@ int
xfs_dir_lookup_int(
xfs_inode_t *dp,
uint lock_mode,
- bhv_vname_t *dentry,
+ struct xfs_name *name,
xfs_ino_t *inum,
xfs_inode_t **ipp)
{
@@ -53,7 +53,7 @@ xfs_dir_lookup_int(
xfs_itrace_entry(dp);
- error = xfs_dir_lookup(NULL, dp, VNAME(dentry), VNAMELEN(dentry), inum);
+ error = xfs_dir_lookup(NULL, dp, name, inum);
if (!error) {
/*
* Unlock the directory. We do this because we can't
Index: kern_ci/fs/xfs/xfs_utils.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_utils.h
+++ kern_ci/fs/xfs/xfs_utils.h
@@ -21,8 +21,8 @@
#define IRELE(ip) VN_RELE(XFS_ITOV(ip))
#define IHOLD(ip) VN_HOLD(XFS_ITOV(ip))
-extern int xfs_dir_lookup_int(xfs_inode_t *, uint, bhv_vname_t *,
xfs_ino_t *,
- xfs_inode_t **);
+extern int xfs_dir_lookup_int(xfs_inode_t *, uint, struct xfs_name *,
+ xfs_ino_t *, xfs_inode_t **);
extern int xfs_truncate_file(xfs_mount_t *, xfs_inode_t *);
extern int xfs_dir_ialloc(xfs_trans_t **, xfs_inode_t *, mode_t,
xfs_nlink_t,
xfs_dev_t, cred_t *, prid_t, int,
Index: kern_ci/fs/xfs/xfs_vnodeops.c
===================================================================
--- kern_ci.orig/fs/xfs/xfs_vnodeops.c
+++ kern_ci/fs/xfs/xfs_vnodeops.c
@@ -1762,7 +1762,7 @@ xfs_inactive(
int
xfs_lookup(
xfs_inode_t *dp,
- bhv_vname_t *dentry,
+ struct xfs_name *name,
xfs_inode_t **ipp)
{
xfs_inode_t *ip;
@@ -1776,7 +1776,7 @@ xfs_lookup(
return XFS_ERROR(EIO);
lock_mode = xfs_ilock_map_shared(dp);
- error = xfs_dir_lookup_int(dp, lock_mode, dentry, &e_inum, &ip);
+ error = xfs_dir_lookup_int(dp, lock_mode, name, &e_inum, &ip);
if (!error) {
*ipp = ip;
xfs_itrace_ref(ip);
@@ -1788,17 +1788,16 @@ xfs_lookup(
int
xfs_create(
xfs_inode_t *dp,
- bhv_vname_t *dentry,
+ struct xfs_name *name,
mode_t mode,
xfs_dev_t rdev,
xfs_inode_t **ipp,
cred_t *credp)
{
- char *name = VNAME(dentry);
- xfs_mount_t *mp = dp->i_mount;
+ xfs_mount_t *mp = dp->i_mount;
xfs_inode_t *ip;
xfs_trans_t *tp;
- int error;
+ int error;
xfs_bmap_free_t free_list;
xfs_fsblock_t first_block;
boolean_t unlock_dp_on_error = B_FALSE;
@@ -1808,17 +1807,14 @@ xfs_create(
xfs_prid_t prid;
struct xfs_dquot *udqp, *gdqp;
uint resblks;
- int namelen;
ASSERT(!*ipp);
xfs_itrace_entry(dp);
- namelen = VNAMELEN(dentry);
-
if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) {
error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
dp, DM_RIGHT_NULL, NULL,
- DM_RIGHT_NULL, name, NULL,
+ DM_RIGHT_NULL, name->name, NULL,
mode, 0, 0);
if (error)
@@ -1850,7 +1846,7 @@ xfs_create(
tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE);
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
- resblks = XFS_CREATE_SPACE_RES(mp, namelen);
+ resblks = XFS_CREATE_SPACE_RES(mp, name->len);
/*
* Initially assume that the file does not exist and
* reserve the resources for that case. If that is not
@@ -1883,7 +1879,8 @@ xfs_create(
if (error)
goto error_return;
- if (resblks == 0 && (error = xfs_dir_canenter(tp, dp, name, namelen)))
+ error = xfs_dir_canenter(tp, dp, name, resblks);
+ if (error)
goto error_return;
error = xfs_dir_ialloc(&tp, dp, mode, 1,
rdev, credp, prid, resblks > 0,
@@ -1913,7 +1910,7 @@ xfs_create(
xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
unlock_dp_on_error = B_FALSE;
- error = xfs_dir_createname(tp, dp, name, namelen, ip->i_ino,
+ error = xfs_dir_createname(tp, dp, name, ip->i_ino,
&first_block, &free_list, resblks ?
resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
if (error) {
@@ -1974,7 +1971,7 @@ std_return:
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE,
dp, DM_RIGHT_NULL,
*ipp ? ip : NULL,
- DM_RIGHT_NULL, name, NULL,
+ DM_RIGHT_NULL, name->name, NULL,
mode, error, 0);
}
return error;
@@ -2266,12 +2263,10 @@ int remove_which_error_return = 0;
int
xfs_remove(
xfs_inode_t *dp,
- bhv_vname_t *dentry)
+ struct xfs_name *name,
+ xfs_inode_t *ip)
{
- char *name = VNAME(dentry);
xfs_mount_t *mp = dp->i_mount;
- xfs_inode_t *ip = VNAME_TO_INODE(dentry);
- int namelen = VNAMELEN(dentry);
xfs_trans_t *tp = NULL;
int error = 0;
xfs_bmap_free_t free_list;
@@ -2287,9 +2282,9 @@ xfs_remove(
return XFS_ERROR(EIO);
if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) {
- error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp,
- DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
- name, NULL, ip->i_d.di_mode, 0, 0);
+ error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp, DM_RIGHT_NULL,
+ NULL, DM_RIGHT_NULL, name->name, NULL,
+ ip->i_d.di_mode, 0, 0);
if (error)
return error;
}
@@ -2374,7 +2369,7 @@ xfs_remove(
* Entry must exist since we did a lookup in xfs_lock_dir_and_entry.
*/
XFS_BMAP_INIT(&free_list, &first_block);
- error = xfs_dir_removename(tp, dp, name, namelen, ip->i_ino,
+ error = xfs_dir_removename(tp, dp, name, ip->i_ino,
&first_block, &free_list, 0);
if (error) {
ASSERT(error != ENOENT);
@@ -2442,7 +2437,7 @@ xfs_remove(
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
dp, DM_RIGHT_NULL,
NULL, DM_RIGHT_NULL,
- name, NULL, ip->i_d.di_mode, error, 0);
+ name->name, NULL, ip->i_d.di_mode, error, 0);
}
return error;
@@ -2472,7 +2467,7 @@ int
xfs_link(
xfs_inode_t *tdp,
xfs_inode_t *sip,
- bhv_vname_t *dentry)
+ struct xfs_name *target_name)
{
xfs_mount_t *mp = tdp->i_mount;
xfs_trans_t *tp;
@@ -2483,13 +2478,10 @@ xfs_link(
int cancel_flags;
int committed;
int resblks;
- char *target_name = VNAME(dentry);
- int target_namelen;
xfs_itrace_entry(tdp);
xfs_itrace_entry(sip);
- target_namelen = VNAMELEN(dentry);
ASSERT(!S_ISDIR(sip->i_d.di_mode));
if (XFS_FORCED_SHUTDOWN(mp))
@@ -2499,7 +2491,7 @@ xfs_link(
error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK,
tdp, DM_RIGHT_NULL,
sip, DM_RIGHT_NULL,
- target_name, NULL, 0, 0, 0);
+ target_name->name, NULL, 0, 0, 0);
if (error)
return error;
}
@@ -2514,7 +2506,7 @@ xfs_link(
tp = xfs_trans_alloc(mp, XFS_TRANS_LINK);
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
- resblks = XFS_LINK_SPACE_RES(mp, target_namelen);
+ resblks = XFS_LINK_SPACE_RES(mp, target_name->len);
error = xfs_trans_reserve(tp, resblks, XFS_LINK_LOG_RES(mp), 0,
XFS_TRANS_PERM_LOG_RES, XFS_LINK_LOG_COUNT);
if (error == ENOSPC) {
@@ -2566,15 +2558,14 @@ xfs_link(
goto error_return;
}
- if (resblks == 0 &&
- (error = xfs_dir_canenter(tp, tdp, target_name, target_namelen)))
+ error = xfs_dir_canenter(tp, tdp, target_name, resblks);
+ if (error)
goto error_return;
XFS_BMAP_INIT(&free_list, &first_block);
- error = xfs_dir_createname(tp, tdp, target_name, target_namelen,
- sip->i_ino, &first_block, &free_list,
- resblks);
+ error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino,
+ &first_block, &free_list, resblks);
if (error)
goto abort_return;
xfs_ichgtime(tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -2610,7 +2601,7 @@ std_return:
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK,
tdp, DM_RIGHT_NULL,
sip, DM_RIGHT_NULL,
- target_name, NULL, 0, error, 0);
+ target_name->name, NULL, 0, error, 0);
}
return error;
@@ -2627,13 +2618,11 @@ std_return:
int
xfs_mkdir(
xfs_inode_t *dp,
- bhv_vname_t *dentry,
+ struct xfs_name *dir_name,
mode_t mode,
xfs_inode_t **ipp,
cred_t *credp)
{
- char *dir_name = VNAME(dentry);
- int dir_namelen = VNAMELEN(dentry);
xfs_mount_t *mp = dp->i_mount;
xfs_inode_t *cdp; /* inode of created dir */
xfs_trans_t *tp;
@@ -2657,7 +2646,7 @@ xfs_mkdir(
if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) {
error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
dp, DM_RIGHT_NULL, NULL,
- DM_RIGHT_NULL, dir_name, NULL,
+ DM_RIGHT_NULL, dir_name->name, NULL,
mode, 0, 0);
if (error)
return error;
@@ -2686,7 +2675,7 @@ xfs_mkdir(
tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR);
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
- resblks = XFS_MKDIR_SPACE_RES(mp, dir_namelen);
+ resblks = XFS_MKDIR_SPACE_RES(mp, dir_name->len);
error = xfs_trans_reserve(tp, resblks, XFS_MKDIR_LOG_RES(mp), 0,
XFS_TRANS_PERM_LOG_RES, XFS_MKDIR_LOG_COUNT);
if (error == ENOSPC) {
@@ -2718,8 +2707,8 @@ xfs_mkdir(
if (error)
goto error_return;
- if (resblks == 0 &&
- (error = xfs_dir_canenter(tp, dp, dir_name, dir_namelen)))
+ error = xfs_dir_canenter(tp, dp, dir_name, resblks);
+ if (error)
goto error_return;
/*
* create the directory inode.
@@ -2748,9 +2737,9 @@ xfs_mkdir(
XFS_BMAP_INIT(&free_list, &first_block);
- error = xfs_dir_createname(tp, dp, dir_name, dir_namelen, cdp->i_ino,
- &first_block, &free_list, resblks ?
- resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
+ error = xfs_dir_createname(tp, dp, dir_name, cdp->i_ino,
+ &first_block, &free_list, resblks ?
+ resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
if (error) {
ASSERT(error != ENOSPC);
goto error1;
@@ -2815,7 +2804,7 @@ std_return:
dp, DM_RIGHT_NULL,
created ? cdp : NULL,
DM_RIGHT_NULL,
- dir_name, NULL,
+ dir_name->name, NULL,
mode, error, 0);
}
return error;
@@ -2839,13 +2828,11 @@ std_return:
int
xfs_rmdir(
xfs_inode_t *dp,
- bhv_vname_t *dentry)
+ struct xfs_name *name,
+ xfs_inode_t *cdp)
{
bhv_vnode_t *dir_vp = XFS_ITOV(dp);
- char *name = VNAME(dentry);
- int namelen = VNAMELEN(dentry);
xfs_mount_t *mp = dp->i_mount;
- xfs_inode_t *cdp = VNAME_TO_INODE(dentry);
xfs_trans_t *tp;
int error;
xfs_bmap_free_t free_list;
@@ -2863,8 +2850,8 @@ xfs_rmdir(
if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) {
error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE,
dp, DM_RIGHT_NULL,
- NULL, DM_RIGHT_NULL,
- name, NULL, cdp->i_d.di_mode, 0, 0);
+ NULL, DM_RIGHT_NULL, name->name,
+ NULL, cdp->i_d.di_mode, 0, 0);
if (error)
return XFS_ERROR(error);
}
@@ -2958,7 +2945,7 @@ xfs_rmdir(
goto error_return;
}
- error = xfs_dir_removename(tp, dp, name, namelen, cdp->i_ino,
+ error = xfs_dir_removename(tp, dp, name, cdp->i_ino,
&first_block, &free_list, resblks);
if (error)
goto error1;
@@ -3038,7 +3025,7 @@ xfs_rmdir(
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
dp, DM_RIGHT_NULL,
NULL, DM_RIGHT_NULL,
- name, NULL, cdp->i_d.di_mode,
+ name->name, NULL, cdp->i_d.di_mode,
error, 0);
}
return error;
@@ -3056,8 +3043,8 @@ xfs_rmdir(
int
xfs_symlink(
xfs_inode_t *dp,
- bhv_vname_t *dentry,
- char *target_path,
+ struct xfs_name *link_name,
+ const char *target_path,
mode_t mode,
xfs_inode_t **ipp,
cred_t *credp)
@@ -3077,15 +3064,13 @@ xfs_symlink(
int nmaps;
xfs_bmbt_irec_t mval[SYMLINK_MAPS];
xfs_daddr_t d;
- char *cur_chunk;
+ const char *cur_chunk;
int byte_cnt;
int n;
xfs_buf_t *bp;
xfs_prid_t prid;
struct xfs_dquot *udqp, *gdqp;
uint resblks;
- char *link_name = VNAME(dentry);
- int link_namelen;
*ipp = NULL;
error = 0;
@@ -3097,8 +3082,6 @@ xfs_symlink(
if (XFS_FORCED_SHUTDOWN(mp))
return XFS_ERROR(EIO);
- link_namelen = VNAMELEN(dentry);
-
/*
* Check component lengths of the target path name.
*/
@@ -3109,7 +3092,7 @@ xfs_symlink(
if (DM_EVENT_ENABLED(dp, DM_EVENT_SYMLINK)) {
error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp,
DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
- link_name, target_path, 0, 0, 0);
+ link_name->name, target_path, 0, 0, 0);
if (error)
return error;
}
@@ -3141,7 +3124,7 @@ xfs_symlink(
fs_blocks = 0;
else
fs_blocks = XFS_B_TO_FSB(mp, pathlen);
- resblks = XFS_SYMLINK_SPACE_RES(mp, link_namelen, fs_blocks);
+ resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks);
error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0,
XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT);
if (error == ENOSPC && fs_blocks == 0) {
@@ -3175,8 +3158,8 @@ xfs_symlink(
/*
* Check for ability to enter directory entry, if no space reserved.
*/
- if (resblks == 0 &&
- (error = xfs_dir_canenter(tp, dp, link_name, link_namelen)))
+ error = xfs_dir_canenter(tp, dp, link_name, resblks);
+ if (error)
goto error_return;
/*
* Initialize the bmap freelist prior to calling either
@@ -3268,8 +3251,8 @@ xfs_symlink(
/*
* Create the directory entry for the symlink.
*/
- error = xfs_dir_createname(tp, dp, link_name, link_namelen, ip->i_ino,
- &first_block, &free_list, resblks);
+ error = xfs_dir_createname(tp, dp, link_name, ip->i_ino,
+ &first_block, &free_list, resblks);
if (error)
goto error1;
xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -3313,8 +3296,8 @@ std_return:
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK,
dp, DM_RIGHT_NULL,
error ? NULL : ip,
- DM_RIGHT_NULL, link_name, target_path,
- 0, error, 0);
+ DM_RIGHT_NULL, link_name->name,
+ target_path, 0, error, 0);
}
if (!error)
Index: kern_ci/fs/xfs/xfs_vnodeops.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_vnodeops.h
+++ kern_ci/fs/xfs/xfs_vnodeops.h
@@ -23,20 +23,22 @@ int xfs_fsync(struct xfs_inode *ip, int
xfs_off_t stop);
int xfs_release(struct xfs_inode *ip);
int xfs_inactive(struct xfs_inode *ip);
-int xfs_lookup(struct xfs_inode *dp, bhv_vname_t *dentry,
+int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name,
struct xfs_inode **ipp);
-int xfs_create(struct xfs_inode *dp, bhv_vname_t *dentry, mode_t mode,
+int xfs_create(struct xfs_inode *dp, struct xfs_name *name, mode_t mode,
xfs_dev_t rdev, struct xfs_inode **ipp, struct cred *credp);
-int xfs_remove(struct xfs_inode *dp, bhv_vname_t *dentry);
+int xfs_remove(struct xfs_inode *dp, struct xfs_name *name,
+ struct xfs_inode *ip);
int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
- bhv_vname_t *dentry);
-int xfs_mkdir(struct xfs_inode *dp, bhv_vname_t *dentry,
+ struct xfs_name *target_name);
+int xfs_mkdir(struct xfs_inode *dp, struct xfs_name *dir_name,
mode_t mode, struct xfs_inode **ipp, struct cred *credp);
-int xfs_rmdir(struct xfs_inode *dp, bhv_vname_t *dentry);
+int xfs_rmdir(struct xfs_inode *dp, struct xfs_name *name,
+ struct xfs_inode *cdp);
int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize,
xfs_off_t *offset, filldir_t filldir);
-int xfs_symlink(struct xfs_inode *dp, bhv_vname_t *dentry,
- char *target_path, mode_t mode, struct xfs_inode **ipp,
+int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name,
+ const char *target_path, mode_t mode, struct xfs_inode **ipp,
struct cred *credp);
int xfs_inode_flush(struct xfs_inode *ip, int flags);
int xfs_set_dmattrs(struct xfs_inode *ip, u_int evmask, u_int16_t state);
@@ -44,8 +46,9 @@ int xfs_reclaim(struct xfs_inode *ip);
int xfs_change_file_space(struct xfs_inode *ip, int cmd,
xfs_flock64_t *bf, xfs_off_t offset,
struct cred *credp, int attr_flags);
-int xfs_rename(struct xfs_inode *src_dp, bhv_vname_t *src_vname,
- struct xfs_inode *target_dp, bhv_vname_t *target_vname);
+int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name,
+ struct xfs_inode *src_ip, struct xfs_inode *target_dp,
+ struct xfs_name *target_name);
int xfs_attr_get(struct xfs_inode *ip, const char *name, char *value,
int *valuelenp, int flags, cred_t *cred);
int xfs_attr_set(struct xfs_inode *dp, const char *name, char *value,
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: remove_bhv_vname.patch --]
[-- Type: text/x-patch; name=remove_bhv_vname.patch, Size: 39163 bytes --]
---
fs/dmapi/dmapi_event.c | 4 -
fs/dmapi/dmapi_kern.h | 4 -
fs/xfs/dmapi/xfs_dm.c | 6 +-
fs/xfs/linux-2.6/xfs_export.c | 5 -
fs/xfs/linux-2.6/xfs_iops.c | 55 ++++++++++++++-----
fs/xfs/linux-2.6/xfs_vnode.h | 9 ---
fs/xfs/xfs_dir2.c | 62 +++++++++------------
fs/xfs/xfs_dir2.h | 12 ++--
fs/xfs/xfs_mount.h | 4 -
fs/xfs/xfs_rename.c | 82 ++++++++++------------------
fs/xfs/xfs_types.h | 5 +
fs/xfs/xfs_utils.c | 4 -
fs/xfs/xfs_utils.h | 4 -
fs/xfs/xfs_vnodeops.c | 121 ++++++++++++++++++------------------------
fs/xfs/xfs_vnodeops.h | 23 ++++---
15 files changed, 191 insertions(+), 209 deletions(-)
Index: kern_ci/fs/dmapi/dmapi_event.c
===================================================================
--- kern_ci.orig/fs/dmapi/dmapi_event.c
+++ kern_ci/fs/dmapi/dmapi_event.c
@@ -622,8 +622,8 @@ dm_send_namesp_event(
dm_right_t vp1_right,
struct inode *ip2,
dm_right_t vp2_right,
- char *name1,
- char *name2,
+ const char *name1,
+ const char *name2,
mode_t mode,
int retcode,
int flags)
Index: kern_ci/fs/dmapi/dmapi_kern.h
===================================================================
--- kern_ci.orig/fs/dmapi/dmapi_kern.h
+++ kern_ci/fs/dmapi/dmapi_kern.h
@@ -119,8 +119,8 @@ int dm_send_namesp_event(
dm_right_t vp1_right,
struct inode *ip2,
dm_right_t vp2_right,
- char *name1,
- char *name2,
+ const char *name1,
+ const char *name2,
mode_t mode,
int retcode,
int flags);
Index: kern_ci/fs/xfs/dmapi/xfs_dm.c
===================================================================
--- kern_ci.orig/fs/xfs/dmapi/xfs_dm.c
+++ kern_ci/fs/xfs/dmapi/xfs_dm.c
@@ -245,7 +245,7 @@ xfs_copyin_attrname(
size_t len;
strcpy(to->dan_chars, dmattr_prefix);
-
+
len = strnlen_user((char __user *)from, DM_ATTR_NAME_SIZE);
if (len == 0)
error = EFAULT;
@@ -3172,8 +3172,8 @@ xfs_dm_send_namesp_event(
dm_right_t vp1_right,
xfs_inode_t *ip2,
dm_right_t vp2_right,
- char *name1,
- char *name2,
+ const char *name1,
+ const char *name2,
mode_t mode,
int retcode,
int flags)
Index: kern_ci/fs/xfs/linux-2.6/xfs_export.c
===================================================================
--- kern_ci.orig/fs/xfs/linux-2.6/xfs_export.c
+++ kern_ci/fs/xfs/linux-2.6/xfs_export.c
@@ -22,6 +22,7 @@
#include "xfs_trans.h"
#include "xfs_sb.h"
#include "xfs_ag.h"
+#include "xfs_dir2.h"
#include "xfs_dmapi.h"
#include "xfs_mount.h"
#include "xfs_export.h"
@@ -30,8 +31,6 @@
#include "xfs_inode.h"
#include "xfs_vfsops.h"
-static struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, };
-
/*
* Note that we only accept fileids which are long enough rather than allow
* the parent generation number to default to zero. XFS considers zero a
@@ -216,7 +215,7 @@ xfs_fs_get_parent(
struct xfs_inode *cip;
struct dentry *parent;
- error = xfs_lookup(XFS_I(child->d_inode), &dotdot, &cip);
+ error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip);
if (unlikely(error))
return ERR_PTR(-error);
Index: kern_ci/fs/xfs/linux-2.6/xfs_iops.c
===================================================================
--- kern_ci.orig/fs/xfs/linux-2.6/xfs_iops.c
+++ kern_ci/fs/xfs/linux-2.6/xfs_iops.c
@@ -239,6 +239,15 @@ xfs_init_security(
return error;
}
+static void
+xfs_dentry_to_name(
+ struct xfs_name *namep,
+ struct dentry *dentry)
+{
+ namep->name = dentry->d_name.name;
+ namep->len = dentry->d_name.len;
+}
+
STATIC void
xfs_cleanup_inode(
struct inode *dir,
@@ -246,20 +255,19 @@ xfs_cleanup_inode(
struct dentry *dentry,
int mode)
{
- struct dentry teardown = {};
+ struct xfs_name teardown;
/* Oh, the horror.
* If we can't add the ACL or we fail in
* xfs_init_security we must back out.
* ENOSPC can hit here, among other things.
*/
- teardown.d_inode = inode;
- teardown.d_name = dentry->d_name;
+ xfs_dentry_to_name(&teardown, dentry);
if (S_ISDIR(mode))
- xfs_rmdir(XFS_I(dir), &teardown);
+ xfs_rmdir(XFS_I(dir), &teardown, XFS_I(inode));
else
- xfs_remove(XFS_I(dir), &teardown);
+ xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
iput(inode);
}
@@ -273,6 +281,7 @@ xfs_vn_mknod(
struct inode *inode;
struct xfs_inode *ip = NULL;
xfs_acl_t *default_acl = NULL;
+ struct xfs_name name;
attrexists_t test_default_acl = _ACL_DEFAULT_EXISTS;
int error;
@@ -293,6 +302,8 @@ xfs_vn_mknod(
}
}
+ xfs_dentry_to_name(&name, dentry);
+
if (IS_POSIXACL(dir) && !default_acl)
mode &= ~current->fs->umask;
@@ -303,10 +314,10 @@ xfs_vn_mknod(
case S_IFSOCK:
rdev = sysv_encode_dev(rdev);
case S_IFREG:
- error = xfs_create(XFS_I(dir), dentry, mode, rdev, &ip, NULL);
+ error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL);
break;
case S_IFDIR:
- error = xfs_mkdir(XFS_I(dir), dentry, mode, &ip, NULL);
+ error = xfs_mkdir(XFS_I(dir), &name, mode, &ip, NULL);
break;
default:
error = EINVAL;
@@ -371,12 +382,14 @@ xfs_vn_lookup(
struct nameidata *nd)
{
struct xfs_inode *cip;
+ struct xfs_name name;
int error;
if (dentry->d_name.len >= MAXNAMELEN)
return ERR_PTR(-ENAMETOOLONG);
- error = xfs_lookup(XFS_I(dir), dentry, &cip);
+ xfs_dentry_to_name(&name, dentry);
+ error = xfs_lookup(XFS_I(dir), &name, &cip);
if (unlikely(error)) {
if (unlikely(error != ENOENT))
return ERR_PTR(-error);
@@ -394,12 +407,14 @@ xfs_vn_link(
struct dentry *dentry)
{
struct inode *inode; /* inode of guy being linked to */
+ struct xfs_name name;
int error;
inode = old_dentry->d_inode;
+ xfs_dentry_to_name(&name, dentry);
igrab(inode);
- error = xfs_link(XFS_I(dir), XFS_I(inode), dentry);
+ error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
if (unlikely(error)) {
iput(inode);
return -error;
@@ -417,11 +432,13 @@ xfs_vn_unlink(
struct dentry *dentry)
{
struct inode *inode;
+ struct xfs_name name;
int error;
inode = dentry->d_inode;
+ xfs_dentry_to_name(&name, dentry);
- error = xfs_remove(XFS_I(dir), dentry);
+ error = xfs_remove(XFS_I(dir), &name, XFS_I(inode));
if (likely(!error)) {
xfs_validate_fields(dir); /* size needs update */
xfs_validate_fields(inode);
@@ -437,14 +454,15 @@ xfs_vn_symlink(
{
struct inode *inode;
struct xfs_inode *cip = NULL;
+ struct xfs_name name;
int error;
mode_t mode;
mode = S_IFLNK |
(irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO);
+ xfs_dentry_to_name(&name, dentry);
- error = xfs_symlink(XFS_I(dir), dentry, (char *)symname, mode,
- &cip, NULL);
+ error = xfs_symlink(XFS_I(dir), &name, symname, mode, &cip, NULL);
if (unlikely(error))
goto out;
@@ -471,9 +489,12 @@ xfs_vn_rmdir(
struct dentry *dentry)
{
struct inode *inode = dentry->d_inode;
+ struct xfs_name name;
int error;
- error = xfs_rmdir(XFS_I(dir), dentry);
+ xfs_dentry_to_name(&name, dentry);
+
+ error = xfs_rmdir(XFS_I(dir), &name, XFS_I(inode));
if (likely(!error)) {
xfs_validate_fields(inode);
xfs_validate_fields(dir);
@@ -489,9 +510,15 @@ xfs_vn_rename(
struct dentry *ndentry)
{
struct inode *new_inode = ndentry->d_inode;
+ struct xfs_name oname;
+ struct xfs_name nname;
int error;
- error = xfs_rename(XFS_I(odir), odentry, XFS_I(ndir), ndentry);
+ xfs_dentry_to_name(&oname, odentry);
+ xfs_dentry_to_name(&nname, ndentry);
+
+ error = xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode),
+ XFS_I(ndir), &nname);
if (likely(!error)) {
if (new_inode)
xfs_validate_fields(new_inode);
Index: kern_ci/fs/xfs/linux-2.6/xfs_vnode.h
===================================================================
--- kern_ci.orig/fs/xfs/linux-2.6/xfs_vnode.h
+++ kern_ci/fs/xfs/linux-2.6/xfs_vnode.h
@@ -23,8 +23,6 @@ struct bhv_vattr;
struct xfs_iomap;
struct attrlist_cursor_kern;
-typedef struct dentry bhv_vname_t;
-typedef __u64 bhv_vnumber_t;
typedef struct inode bhv_vnode_t;
#define VN_ISLNK(vp) S_ISLNK((vp)->i_mode)
@@ -211,13 +209,6 @@ static inline bhv_vnode_t *vn_grab(bhv_v
}
/*
- * Vname handling macros.
- */
-#define VNAME(dentry) ((char *) (dentry)->d_name.name)
-#define VNAMELEN(dentry) ((dentry)->d_name.len)
-#define VNAME_TO_INODE(dentry) (XFS_I((dentry)->d_inode))
-
-/*
* Dealing with bad inodes
*/
static inline int VN_BAD(bhv_vnode_t *vp)
Index: kern_ci/fs/xfs/xfs_dir2.c
===================================================================
--- kern_ci.orig/fs/xfs/xfs_dir2.c
+++ kern_ci/fs/xfs/xfs_dir2.c
@@ -44,6 +44,7 @@
#include "xfs_error.h"
#include "xfs_vnodeops.h"
+struct xfs_name xfs_name_dotdot = {"..", 2};
void
xfs_dir_mount(
@@ -146,8 +147,7 @@ int
xfs_dir_createname(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name,
- int namelen,
+ struct xfs_name *name,
xfs_ino_t inum, /* new entry inode number */
xfs_fsblock_t *first, /* bmap's firstblock */
xfs_bmap_free_t *flist, /* bmap's freeblock list */
@@ -162,9 +162,9 @@ xfs_dir_createname(
return rval;
XFS_STATS_INC(xs_dir_create);
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.inumber = inum;
args.dp = dp;
args.firstblock = first;
@@ -197,8 +197,7 @@ int
xfs_dir_lookup(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name,
- int namelen,
+ struct xfs_name *name,
xfs_ino_t *inum) /* out: inode number */
{
xfs_da_args_t args;
@@ -207,18 +206,14 @@ xfs_dir_lookup(
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
XFS_STATS_INC(xs_dir_lookup);
+ memset(&args, 0, sizeof(xfs_da_args_t));
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
- args.inumber = 0;
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.dp = dp;
- args.firstblock = NULL;
- args.flist = NULL;
- args.total = 0;
args.whichfork = XFS_DATA_FORK;
args.trans = tp;
- args.justcheck = args.addname = 0;
args.oknoent = 1;
if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
@@ -247,8 +242,7 @@ int
xfs_dir_removename(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name,
- int namelen,
+ struct xfs_name *name,
xfs_ino_t ino,
xfs_fsblock_t *first, /* bmap's firstblock */
xfs_bmap_free_t *flist, /* bmap's freeblock list */
@@ -261,9 +255,9 @@ xfs_dir_removename(
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
XFS_STATS_INC(xs_dir_remove);
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.inumber = ino;
args.dp = dp;
args.firstblock = first;
@@ -329,8 +323,7 @@ int
xfs_dir_replace(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name, /* name of entry to replace */
- int namelen,
+ struct xfs_name *name, /* name of entry to replace */
xfs_ino_t inum, /* new inode number */
xfs_fsblock_t *first, /* bmap's firstblock */
xfs_bmap_free_t *flist, /* bmap's freeblock list */
@@ -345,9 +338,9 @@ xfs_dir_replace(
if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum)))
return rval;
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.inumber = inum;
args.dp = dp;
args.firstblock = first;
@@ -374,28 +367,29 @@ xfs_dir_replace(
/*
* See if this entry can be added to the directory without allocating space.
+ * First checks that the caller couldn't reserve enough space (resblks = 0).
*/
int
xfs_dir_canenter(
xfs_trans_t *tp,
xfs_inode_t *dp,
- char *name, /* name of entry to add */
- int namelen)
+ struct xfs_name *name, /* name of entry to add */
+ uint resblks)
{
xfs_da_args_t args;
int rval;
int v; /* type-checking value */
+ if (resblks)
+ return 0;
+
ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
+ memset(&args, 0, sizeof(xfs_da_args_t));
- args.name = name;
- args.namelen = namelen;
- args.hashval = xfs_da_hashname(name, namelen);
- args.inumber = 0;
+ args.name = name->name;
+ args.namelen = name->len;
+ args.hashval = xfs_da_hashname(name->name, name->len);
args.dp = dp;
- args.firstblock = NULL;
- args.flist = NULL;
- args.total = 0;
args.whichfork = XFS_DATA_FORK;
args.trans = tp;
args.justcheck = args.addname = args.oknoent = 1;
Index: kern_ci/fs/xfs/xfs_dir2.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_dir2.h
+++ kern_ci/fs/xfs/xfs_dir2.h
@@ -59,6 +59,8 @@ typedef __uint32_t xfs_dir2_db_t;
*/
typedef xfs_off_t xfs_dir2_off_t;
+extern struct xfs_name xfs_name_dotdot;
+
/*
* Generic directory interface routines
*/
@@ -68,21 +70,21 @@ extern int xfs_dir_isempty(struct xfs_in
extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp,
struct xfs_inode *pdp);
extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen, xfs_ino_t inum,
+ struct xfs_name *name, xfs_ino_t inum,
xfs_fsblock_t *first,
struct xfs_bmap_free *flist, xfs_extlen_t tot);
extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen, xfs_ino_t *inum);
+ struct xfs_name *name, xfs_ino_t *inum);
extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen, xfs_ino_t ino,
+ struct xfs_name *name, xfs_ino_t ino,
xfs_fsblock_t *first,
struct xfs_bmap_free *flist, xfs_extlen_t tot);
extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen, xfs_ino_t inum,
+ struct xfs_name *name, xfs_ino_t inum,
xfs_fsblock_t *first,
struct xfs_bmap_free *flist, xfs_extlen_t tot);
extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
- char *name, int namelen);
+ struct xfs_name *name, uint resblks);
extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino);
/*
Index: kern_ci/fs/xfs/xfs_mount.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_mount.h
+++ kern_ci/fs/xfs/xfs_mount.h
@@ -73,7 +73,7 @@ typedef int (*xfs_send_destroy_t)(struct
typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *,
struct xfs_inode *, dm_right_t,
struct xfs_inode *, dm_right_t,
- char *, char *, mode_t, int, int);
+ const char *, const char *, mode_t, int, int);
typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t,
char *, char *);
typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct xfs_inode *,
@@ -401,7 +401,7 @@ typedef struct xfs_mount {
/*
* Allow large block sizes to be reported to userspace programs if the
- * "largeio" mount option is used.
+ * "largeio" mount option is used.
*
* If compatibility mode is specified, simply return the basic unit of caching
* so that we don't get inefficient read/modify/write I/O from user apps.
Index: kern_ci/fs/xfs/xfs_rename.c
===================================================================
--- kern_ci.orig/fs/xfs/xfs_rename.c
+++ kern_ci/fs/xfs/xfs_rename.c
@@ -83,25 +83,24 @@ int xfs_rename_skip, xfs_rename_nskip;
*/
STATIC int
xfs_lock_for_rename(
- xfs_inode_t *dp1, /* old (source) directory inode */
- xfs_inode_t *dp2, /* new (target) directory inode */
- bhv_vname_t *vname1,/* old entry name */
- bhv_vname_t *vname2,/* new entry name */
- xfs_inode_t **ipp1, /* inode of old entry */
- xfs_inode_t **ipp2, /* inode of new entry, if it
+ xfs_inode_t *dp1, /* in: old (source) directory inode */
+ xfs_inode_t *dp2, /* in: new (target) directory inode */
+ xfs_inode_t *ip1, /* in: inode of old entry */
+ struct xfs_name *name2, /* in: new entry name */
+ xfs_inode_t **ipp2, /* out: inode of new entry, if it
already exists, NULL otherwise. */
- xfs_inode_t **i_tab,/* array of inode returned, sorted */
- int *num_inodes) /* number of inodes in array */
+ xfs_inode_t **i_tab,/* out: array of inode returned, sorted */
+ int *num_inodes) /* out: number of inodes in array */
{
- xfs_inode_t *ip1 = VNAME_TO_INODE(vname1);
- xfs_inode_t *ip2, *temp;
+ xfs_inode_t *ip2 = NULL;
+ xfs_inode_t *temp;
xfs_ino_t inum1, inum2;
int error;
int i, j;
uint lock_mode;
int diff_dirs = (dp1 != dp2);
- ip2 = NULL;
+ ASSERT(ip1);
/*
* First, find out the current inums of the entries so that we
@@ -115,17 +114,15 @@ xfs_lock_for_rename(
inum1 = ip1->i_ino;
-
/*
* Unlock dp1 and lock dp2 if they are different.
*/
-
if (diff_dirs) {
xfs_iunlock_map_shared(dp1, lock_mode);
lock_mode = xfs_ilock_map_shared(dp2);
}
- error = xfs_dir_lookup_int(dp2, lock_mode, vname2, &inum2, &ip2);
+ error = xfs_dir_lookup_int(dp2, lock_mode, name2, &inum2, &ip2);
if (error == ENOENT) { /* target does not need to exist. */
inum2 = 0;
} else if (error) {
@@ -157,6 +154,7 @@ xfs_lock_for_rename(
*num_inodes = 4;
i_tab[3] = ip2;
}
+ *ipp2 = i_tab[3];
/*
* Sort the elements via bubble sort. (Remember, there are at
@@ -194,21 +192,6 @@ xfs_lock_for_rename(
xfs_lock_inodes(i_tab, *num_inodes, 0, XFS_ILOCK_SHARED);
}
- /*
- * Set the return value. Null out any unused entries in i_tab.
- */
- *ipp1 = *ipp2 = NULL;
- for (i=0; i < *num_inodes; i++) {
- if (i_tab[i]->i_ino == inum1) {
- *ipp1 = i_tab[i];
- }
- if (i_tab[i]->i_ino == inum2) {
- *ipp2 = i_tab[i];
- }
- }
- for (;i < 4; i++) {
- i_tab[i] = NULL;
- }
return 0;
}
@@ -218,12 +201,13 @@ xfs_lock_for_rename(
int
xfs_rename(
xfs_inode_t *src_dp,
- bhv_vname_t *src_vname,
+ struct xfs_name *src_name,
+ xfs_inode_t *src_ip,
xfs_inode_t *target_dp,
- bhv_vname_t *target_vname)
+ struct xfs_name *target_name)
{
xfs_trans_t *tp;
- xfs_inode_t *src_ip, *target_ip;
+ xfs_inode_t *target_ip;
xfs_mount_t *mp = src_dp->i_mount;
int new_parent; /* moving to a new dir */
int src_is_directory; /* src_name is a directory */
@@ -237,10 +221,6 @@ xfs_rename(
int spaceres;
int target_link_zero = 0;
int num_inodes;
- char *src_name = VNAME(src_vname);
- char *target_name = VNAME(target_vname);
- int src_namelen = VNAMELEN(src_vname);
- int target_namelen = VNAMELEN(target_vname);
xfs_itrace_entry(src_dp);
xfs_itrace_entry(target_dp);
@@ -250,7 +230,7 @@ xfs_rename(
error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME,
src_dp, DM_RIGHT_NULL,
target_dp, DM_RIGHT_NULL,
- src_name, target_name,
+ src_name->name, target_name->name,
0, 0, 0);
if (error) {
return error;
@@ -267,10 +247,8 @@ xfs_rename(
* does not exist in the source directory.
*/
tp = NULL;
- error = xfs_lock_for_rename(src_dp, target_dp, src_vname,
- target_vname, &src_ip, &target_ip, inodes,
- &num_inodes);
-
+ error = xfs_lock_for_rename(src_dp, target_dp, src_ip, target_name,
+ &target_ip, inodes, &num_inodes);
if (error) {
/*
* We have nothing locked, no inode references, and
@@ -316,7 +294,7 @@ xfs_rename(
XFS_BMAP_INIT(&free_list, &first_block);
tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME);
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
- spaceres = XFS_RENAME_SPACE_RES(mp, target_namelen);
+ spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
error = xfs_trans_reserve(tp, spaceres, XFS_RENAME_LOG_RES(mp), 0,
XFS_TRANS_PERM_LOG_RES, XFS_RENAME_LOG_COUNT);
if (error == ENOSPC) {
@@ -374,9 +352,8 @@ xfs_rename(
* If there's no space reservation, check the entry will
* fit before actually inserting it.
*/
- if (spaceres == 0 &&
- (error = xfs_dir_canenter(tp, target_dp, target_name,
- target_namelen)))
+ error = xfs_dir_canenter(tp, target_dp, target_name, spaceres);
+ if (error)
goto error_return;
/*
* If target does not exist and the rename crosses
@@ -384,8 +361,8 @@ xfs_rename(
* to account for the ".." reference from the new entry.
*/
error = xfs_dir_createname(tp, target_dp, target_name,
- target_namelen, src_ip->i_ino,
- &first_block, &free_list, spaceres);
+ src_ip->i_ino, &first_block,
+ &free_list, spaceres);
if (error == ENOSPC)
goto error_return;
if (error)
@@ -424,7 +401,7 @@ xfs_rename(
* name at the destination directory, remove it first.
*/
error = xfs_dir_replace(tp, target_dp, target_name,
- target_namelen, src_ip->i_ino,
+ src_ip->i_ino,
&first_block, &free_list, spaceres);
if (error)
goto abort_return;
@@ -461,7 +438,8 @@ xfs_rename(
* Rewrite the ".." entry to point to the new
* directory.
*/
- error = xfs_dir_replace(tp, src_ip, "..", 2, target_dp->i_ino,
+ error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
+ target_dp->i_ino,
&first_block, &free_list, spaceres);
ASSERT(error != EEXIST);
if (error)
@@ -497,8 +475,8 @@ xfs_rename(
goto abort_return;
}
- error = xfs_dir_removename(tp, src_dp, src_name, src_namelen,
- src_ip->i_ino, &first_block, &free_list, spaceres);
+ error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
+ &first_block, &free_list, spaceres);
if (error)
goto abort_return;
xfs_ichgtime(src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -583,7 +561,7 @@ std_return:
(void) XFS_SEND_NAMESP (mp, DM_EVENT_POSTRENAME,
src_dp, DM_RIGHT_NULL,
target_dp, DM_RIGHT_NULL,
- src_name, target_name,
+ src_name->name, target_name->name,
0, error, 0);
}
return error;
Index: kern_ci/fs/xfs/xfs_types.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_types.h
+++ kern_ci/fs/xfs/xfs_types.h
@@ -160,4 +160,9 @@ typedef enum {
XFS_BTNUM_MAX
} xfs_btnum_t;
+struct xfs_name {
+ const char *name;
+ int len;
+};
+
#endif /* __XFS_TYPES_H__ */
Index: kern_ci/fs/xfs/xfs_utils.c
===================================================================
--- kern_ci.orig/fs/xfs/xfs_utils.c
+++ kern_ci/fs/xfs/xfs_utils.c
@@ -45,7 +45,7 @@ int
xfs_dir_lookup_int(
xfs_inode_t *dp,
uint lock_mode,
- bhv_vname_t *dentry,
+ struct xfs_name *name,
xfs_ino_t *inum,
xfs_inode_t **ipp)
{
@@ -53,7 +53,7 @@ xfs_dir_lookup_int(
xfs_itrace_entry(dp);
- error = xfs_dir_lookup(NULL, dp, VNAME(dentry), VNAMELEN(dentry), inum);
+ error = xfs_dir_lookup(NULL, dp, name, inum);
if (!error) {
/*
* Unlock the directory. We do this because we can't
Index: kern_ci/fs/xfs/xfs_utils.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_utils.h
+++ kern_ci/fs/xfs/xfs_utils.h
@@ -21,8 +21,8 @@
#define IRELE(ip) VN_RELE(XFS_ITOV(ip))
#define IHOLD(ip) VN_HOLD(XFS_ITOV(ip))
-extern int xfs_dir_lookup_int(xfs_inode_t *, uint, bhv_vname_t *, xfs_ino_t *,
- xfs_inode_t **);
+extern int xfs_dir_lookup_int(xfs_inode_t *, uint, struct xfs_name *,
+ xfs_ino_t *, xfs_inode_t **);
extern int xfs_truncate_file(xfs_mount_t *, xfs_inode_t *);
extern int xfs_dir_ialloc(xfs_trans_t **, xfs_inode_t *, mode_t, xfs_nlink_t,
xfs_dev_t, cred_t *, prid_t, int,
Index: kern_ci/fs/xfs/xfs_vnodeops.c
===================================================================
--- kern_ci.orig/fs/xfs/xfs_vnodeops.c
+++ kern_ci/fs/xfs/xfs_vnodeops.c
@@ -1762,7 +1762,7 @@ xfs_inactive(
int
xfs_lookup(
xfs_inode_t *dp,
- bhv_vname_t *dentry,
+ struct xfs_name *name,
xfs_inode_t **ipp)
{
xfs_inode_t *ip;
@@ -1776,7 +1776,7 @@ xfs_lookup(
return XFS_ERROR(EIO);
lock_mode = xfs_ilock_map_shared(dp);
- error = xfs_dir_lookup_int(dp, lock_mode, dentry, &e_inum, &ip);
+ error = xfs_dir_lookup_int(dp, lock_mode, name, &e_inum, &ip);
if (!error) {
*ipp = ip;
xfs_itrace_ref(ip);
@@ -1788,17 +1788,16 @@ xfs_lookup(
int
xfs_create(
xfs_inode_t *dp,
- bhv_vname_t *dentry,
+ struct xfs_name *name,
mode_t mode,
xfs_dev_t rdev,
xfs_inode_t **ipp,
cred_t *credp)
{
- char *name = VNAME(dentry);
- xfs_mount_t *mp = dp->i_mount;
+ xfs_mount_t *mp = dp->i_mount;
xfs_inode_t *ip;
xfs_trans_t *tp;
- int error;
+ int error;
xfs_bmap_free_t free_list;
xfs_fsblock_t first_block;
boolean_t unlock_dp_on_error = B_FALSE;
@@ -1808,17 +1807,14 @@ xfs_create(
xfs_prid_t prid;
struct xfs_dquot *udqp, *gdqp;
uint resblks;
- int namelen;
ASSERT(!*ipp);
xfs_itrace_entry(dp);
- namelen = VNAMELEN(dentry);
-
if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) {
error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
dp, DM_RIGHT_NULL, NULL,
- DM_RIGHT_NULL, name, NULL,
+ DM_RIGHT_NULL, name->name, NULL,
mode, 0, 0);
if (error)
@@ -1850,7 +1846,7 @@ xfs_create(
tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE);
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
- resblks = XFS_CREATE_SPACE_RES(mp, namelen);
+ resblks = XFS_CREATE_SPACE_RES(mp, name->len);
/*
* Initially assume that the file does not exist and
* reserve the resources for that case. If that is not
@@ -1883,7 +1879,8 @@ xfs_create(
if (error)
goto error_return;
- if (resblks == 0 && (error = xfs_dir_canenter(tp, dp, name, namelen)))
+ error = xfs_dir_canenter(tp, dp, name, resblks);
+ if (error)
goto error_return;
error = xfs_dir_ialloc(&tp, dp, mode, 1,
rdev, credp, prid, resblks > 0,
@@ -1913,7 +1910,7 @@ xfs_create(
xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
unlock_dp_on_error = B_FALSE;
- error = xfs_dir_createname(tp, dp, name, namelen, ip->i_ino,
+ error = xfs_dir_createname(tp, dp, name, ip->i_ino,
&first_block, &free_list, resblks ?
resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
if (error) {
@@ -1974,7 +1971,7 @@ std_return:
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE,
dp, DM_RIGHT_NULL,
*ipp ? ip : NULL,
- DM_RIGHT_NULL, name, NULL,
+ DM_RIGHT_NULL, name->name, NULL,
mode, error, 0);
}
return error;
@@ -2266,12 +2263,10 @@ int remove_which_error_return = 0;
int
xfs_remove(
xfs_inode_t *dp,
- bhv_vname_t *dentry)
+ struct xfs_name *name,
+ xfs_inode_t *ip)
{
- char *name = VNAME(dentry);
xfs_mount_t *mp = dp->i_mount;
- xfs_inode_t *ip = VNAME_TO_INODE(dentry);
- int namelen = VNAMELEN(dentry);
xfs_trans_t *tp = NULL;
int error = 0;
xfs_bmap_free_t free_list;
@@ -2287,9 +2282,9 @@ xfs_remove(
return XFS_ERROR(EIO);
if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) {
- error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp,
- DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
- name, NULL, ip->i_d.di_mode, 0, 0);
+ error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp, DM_RIGHT_NULL,
+ NULL, DM_RIGHT_NULL, name->name, NULL,
+ ip->i_d.di_mode, 0, 0);
if (error)
return error;
}
@@ -2374,7 +2369,7 @@ xfs_remove(
* Entry must exist since we did a lookup in xfs_lock_dir_and_entry.
*/
XFS_BMAP_INIT(&free_list, &first_block);
- error = xfs_dir_removename(tp, dp, name, namelen, ip->i_ino,
+ error = xfs_dir_removename(tp, dp, name, ip->i_ino,
&first_block, &free_list, 0);
if (error) {
ASSERT(error != ENOENT);
@@ -2442,7 +2437,7 @@ xfs_remove(
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
dp, DM_RIGHT_NULL,
NULL, DM_RIGHT_NULL,
- name, NULL, ip->i_d.di_mode, error, 0);
+ name->name, NULL, ip->i_d.di_mode, error, 0);
}
return error;
@@ -2472,7 +2467,7 @@ int
xfs_link(
xfs_inode_t *tdp,
xfs_inode_t *sip,
- bhv_vname_t *dentry)
+ struct xfs_name *target_name)
{
xfs_mount_t *mp = tdp->i_mount;
xfs_trans_t *tp;
@@ -2483,13 +2478,10 @@ xfs_link(
int cancel_flags;
int committed;
int resblks;
- char *target_name = VNAME(dentry);
- int target_namelen;
xfs_itrace_entry(tdp);
xfs_itrace_entry(sip);
- target_namelen = VNAMELEN(dentry);
ASSERT(!S_ISDIR(sip->i_d.di_mode));
if (XFS_FORCED_SHUTDOWN(mp))
@@ -2499,7 +2491,7 @@ xfs_link(
error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK,
tdp, DM_RIGHT_NULL,
sip, DM_RIGHT_NULL,
- target_name, NULL, 0, 0, 0);
+ target_name->name, NULL, 0, 0, 0);
if (error)
return error;
}
@@ -2514,7 +2506,7 @@ xfs_link(
tp = xfs_trans_alloc(mp, XFS_TRANS_LINK);
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
- resblks = XFS_LINK_SPACE_RES(mp, target_namelen);
+ resblks = XFS_LINK_SPACE_RES(mp, target_name->len);
error = xfs_trans_reserve(tp, resblks, XFS_LINK_LOG_RES(mp), 0,
XFS_TRANS_PERM_LOG_RES, XFS_LINK_LOG_COUNT);
if (error == ENOSPC) {
@@ -2566,15 +2558,14 @@ xfs_link(
goto error_return;
}
- if (resblks == 0 &&
- (error = xfs_dir_canenter(tp, tdp, target_name, target_namelen)))
+ error = xfs_dir_canenter(tp, tdp, target_name, resblks);
+ if (error)
goto error_return;
XFS_BMAP_INIT(&free_list, &first_block);
- error = xfs_dir_createname(tp, tdp, target_name, target_namelen,
- sip->i_ino, &first_block, &free_list,
- resblks);
+ error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino,
+ &first_block, &free_list, resblks);
if (error)
goto abort_return;
xfs_ichgtime(tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -2610,7 +2601,7 @@ std_return:
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK,
tdp, DM_RIGHT_NULL,
sip, DM_RIGHT_NULL,
- target_name, NULL, 0, error, 0);
+ target_name->name, NULL, 0, error, 0);
}
return error;
@@ -2627,13 +2618,11 @@ std_return:
int
xfs_mkdir(
xfs_inode_t *dp,
- bhv_vname_t *dentry,
+ struct xfs_name *dir_name,
mode_t mode,
xfs_inode_t **ipp,
cred_t *credp)
{
- char *dir_name = VNAME(dentry);
- int dir_namelen = VNAMELEN(dentry);
xfs_mount_t *mp = dp->i_mount;
xfs_inode_t *cdp; /* inode of created dir */
xfs_trans_t *tp;
@@ -2657,7 +2646,7 @@ xfs_mkdir(
if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) {
error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
dp, DM_RIGHT_NULL, NULL,
- DM_RIGHT_NULL, dir_name, NULL,
+ DM_RIGHT_NULL, dir_name->name, NULL,
mode, 0, 0);
if (error)
return error;
@@ -2686,7 +2675,7 @@ xfs_mkdir(
tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR);
cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
- resblks = XFS_MKDIR_SPACE_RES(mp, dir_namelen);
+ resblks = XFS_MKDIR_SPACE_RES(mp, dir_name->len);
error = xfs_trans_reserve(tp, resblks, XFS_MKDIR_LOG_RES(mp), 0,
XFS_TRANS_PERM_LOG_RES, XFS_MKDIR_LOG_COUNT);
if (error == ENOSPC) {
@@ -2718,8 +2707,8 @@ xfs_mkdir(
if (error)
goto error_return;
- if (resblks == 0 &&
- (error = xfs_dir_canenter(tp, dp, dir_name, dir_namelen)))
+ error = xfs_dir_canenter(tp, dp, dir_name, resblks);
+ if (error)
goto error_return;
/*
* create the directory inode.
@@ -2748,9 +2737,9 @@ xfs_mkdir(
XFS_BMAP_INIT(&free_list, &first_block);
- error = xfs_dir_createname(tp, dp, dir_name, dir_namelen, cdp->i_ino,
- &first_block, &free_list, resblks ?
- resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
+ error = xfs_dir_createname(tp, dp, dir_name, cdp->i_ino,
+ &first_block, &free_list, resblks ?
+ resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
if (error) {
ASSERT(error != ENOSPC);
goto error1;
@@ -2815,7 +2804,7 @@ std_return:
dp, DM_RIGHT_NULL,
created ? cdp : NULL,
DM_RIGHT_NULL,
- dir_name, NULL,
+ dir_name->name, NULL,
mode, error, 0);
}
return error;
@@ -2839,13 +2828,11 @@ std_return:
int
xfs_rmdir(
xfs_inode_t *dp,
- bhv_vname_t *dentry)
+ struct xfs_name *name,
+ xfs_inode_t *cdp)
{
bhv_vnode_t *dir_vp = XFS_ITOV(dp);
- char *name = VNAME(dentry);
- int namelen = VNAMELEN(dentry);
xfs_mount_t *mp = dp->i_mount;
- xfs_inode_t *cdp = VNAME_TO_INODE(dentry);
xfs_trans_t *tp;
int error;
xfs_bmap_free_t free_list;
@@ -2863,8 +2850,8 @@ xfs_rmdir(
if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) {
error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE,
dp, DM_RIGHT_NULL,
- NULL, DM_RIGHT_NULL,
- name, NULL, cdp->i_d.di_mode, 0, 0);
+ NULL, DM_RIGHT_NULL, name->name,
+ NULL, cdp->i_d.di_mode, 0, 0);
if (error)
return XFS_ERROR(error);
}
@@ -2958,7 +2945,7 @@ xfs_rmdir(
goto error_return;
}
- error = xfs_dir_removename(tp, dp, name, namelen, cdp->i_ino,
+ error = xfs_dir_removename(tp, dp, name, cdp->i_ino,
&first_block, &free_list, resblks);
if (error)
goto error1;
@@ -3038,7 +3025,7 @@ xfs_rmdir(
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
dp, DM_RIGHT_NULL,
NULL, DM_RIGHT_NULL,
- name, NULL, cdp->i_d.di_mode,
+ name->name, NULL, cdp->i_d.di_mode,
error, 0);
}
return error;
@@ -3056,8 +3043,8 @@ xfs_rmdir(
int
xfs_symlink(
xfs_inode_t *dp,
- bhv_vname_t *dentry,
- char *target_path,
+ struct xfs_name *link_name,
+ const char *target_path,
mode_t mode,
xfs_inode_t **ipp,
cred_t *credp)
@@ -3077,15 +3064,13 @@ xfs_symlink(
int nmaps;
xfs_bmbt_irec_t mval[SYMLINK_MAPS];
xfs_daddr_t d;
- char *cur_chunk;
+ const char *cur_chunk;
int byte_cnt;
int n;
xfs_buf_t *bp;
xfs_prid_t prid;
struct xfs_dquot *udqp, *gdqp;
uint resblks;
- char *link_name = VNAME(dentry);
- int link_namelen;
*ipp = NULL;
error = 0;
@@ -3097,8 +3082,6 @@ xfs_symlink(
if (XFS_FORCED_SHUTDOWN(mp))
return XFS_ERROR(EIO);
- link_namelen = VNAMELEN(dentry);
-
/*
* Check component lengths of the target path name.
*/
@@ -3109,7 +3092,7 @@ xfs_symlink(
if (DM_EVENT_ENABLED(dp, DM_EVENT_SYMLINK)) {
error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp,
DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
- link_name, target_path, 0, 0, 0);
+ link_name->name, target_path, 0, 0, 0);
if (error)
return error;
}
@@ -3141,7 +3124,7 @@ xfs_symlink(
fs_blocks = 0;
else
fs_blocks = XFS_B_TO_FSB(mp, pathlen);
- resblks = XFS_SYMLINK_SPACE_RES(mp, link_namelen, fs_blocks);
+ resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks);
error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0,
XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT);
if (error == ENOSPC && fs_blocks == 0) {
@@ -3175,8 +3158,8 @@ xfs_symlink(
/*
* Check for ability to enter directory entry, if no space reserved.
*/
- if (resblks == 0 &&
- (error = xfs_dir_canenter(tp, dp, link_name, link_namelen)))
+ error = xfs_dir_canenter(tp, dp, link_name, resblks);
+ if (error)
goto error_return;
/*
* Initialize the bmap freelist prior to calling either
@@ -3268,8 +3251,8 @@ xfs_symlink(
/*
* Create the directory entry for the symlink.
*/
- error = xfs_dir_createname(tp, dp, link_name, link_namelen, ip->i_ino,
- &first_block, &free_list, resblks);
+ error = xfs_dir_createname(tp, dp, link_name, ip->i_ino,
+ &first_block, &free_list, resblks);
if (error)
goto error1;
xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
@@ -3313,8 +3296,8 @@ std_return:
(void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK,
dp, DM_RIGHT_NULL,
error ? NULL : ip,
- DM_RIGHT_NULL, link_name, target_path,
- 0, error, 0);
+ DM_RIGHT_NULL, link_name->name,
+ target_path, 0, error, 0);
}
if (!error)
Index: kern_ci/fs/xfs/xfs_vnodeops.h
===================================================================
--- kern_ci.orig/fs/xfs/xfs_vnodeops.h
+++ kern_ci/fs/xfs/xfs_vnodeops.h
@@ -23,20 +23,22 @@ int xfs_fsync(struct xfs_inode *ip, int
xfs_off_t stop);
int xfs_release(struct xfs_inode *ip);
int xfs_inactive(struct xfs_inode *ip);
-int xfs_lookup(struct xfs_inode *dp, bhv_vname_t *dentry,
+int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name,
struct xfs_inode **ipp);
-int xfs_create(struct xfs_inode *dp, bhv_vname_t *dentry, mode_t mode,
+int xfs_create(struct xfs_inode *dp, struct xfs_name *name, mode_t mode,
xfs_dev_t rdev, struct xfs_inode **ipp, struct cred *credp);
-int xfs_remove(struct xfs_inode *dp, bhv_vname_t *dentry);
+int xfs_remove(struct xfs_inode *dp, struct xfs_name *name,
+ struct xfs_inode *ip);
int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
- bhv_vname_t *dentry);
-int xfs_mkdir(struct xfs_inode *dp, bhv_vname_t *dentry,
+ struct xfs_name *target_name);
+int xfs_mkdir(struct xfs_inode *dp, struct xfs_name *dir_name,
mode_t mode, struct xfs_inode **ipp, struct cred *credp);
-int xfs_rmdir(struct xfs_inode *dp, bhv_vname_t *dentry);
+int xfs_rmdir(struct xfs_inode *dp, struct xfs_name *name,
+ struct xfs_inode *cdp);
int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize,
xfs_off_t *offset, filldir_t filldir);
-int xfs_symlink(struct xfs_inode *dp, bhv_vname_t *dentry,
- char *target_path, mode_t mode, struct xfs_inode **ipp,
+int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name,
+ const char *target_path, mode_t mode, struct xfs_inode **ipp,
struct cred *credp);
int xfs_inode_flush(struct xfs_inode *ip, int flags);
int xfs_set_dmattrs(struct xfs_inode *ip, u_int evmask, u_int16_t state);
@@ -44,8 +46,9 @@ int xfs_reclaim(struct xfs_inode *ip);
int xfs_change_file_space(struct xfs_inode *ip, int cmd,
xfs_flock64_t *bf, xfs_off_t offset,
struct cred *credp, int attr_flags);
-int xfs_rename(struct xfs_inode *src_dp, bhv_vname_t *src_vname,
- struct xfs_inode *target_dp, bhv_vname_t *target_vname);
+int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name,
+ struct xfs_inode *src_ip, struct xfs_inode *target_dp,
+ struct xfs_name *target_name);
int xfs_attr_get(struct xfs_inode *ip, const char *name, char *value,
int *valuelenp, int flags, cred_t *cred);
int xfs_attr_set(struct xfs_inode *dp, const char *name, char *value,
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [REVIEW #3] cleanup - remove bhv_vname_t
2008-04-09 7:24 [REVIEW #3] cleanup - remove bhv_vname_t Barry Naujok
@ 2008-04-09 7:28 ` Barry Naujok
2008-04-09 7:49 ` Christoph Hellwig
1 sibling, 0 replies; 3+ messages in thread
From: Barry Naujok @ 2008-04-09 7:28 UTC (permalink / raw)
To: xfs@oss.sgi.com, xfs-dev
On Wed, 09 Apr 2008 17:24:04 +1000, Barry Naujok <bnaujok@sgi.com> wrote:
> I gave some "loving" to xfs_rename. Stack usage for xfs_rename down from
> 184 bytes to 152 bytes.
>
> xfs_name declaration is now in xfs_types.h.
>
> There are a couple more whitespace cleanups in this patch (very minor).
>
> This patch applies to the latest code after Dave's check-ins.
Ok... his checkins are taking longer than expected :) An update will
follow if the patch does not apply.
> ---
> fs/dmapi/dmapi_event.c | 4 -
> fs/dmapi/dmapi_kern.h | 4 -
> fs/xfs/dmapi/xfs_dm.c | 6 +-
> fs/xfs/linux-2.6/xfs_export.c | 5 -
> fs/xfs/linux-2.6/xfs_iops.c | 55 ++++++++++++++-----
> fs/xfs/linux-2.6/xfs_vnode.h | 9 ---
> fs/xfs/xfs_dir2.c | 62 +++++++++------------
> fs/xfs/xfs_dir2.h | 12 ++--
> fs/xfs/xfs_mount.h | 4 -
> fs/xfs/xfs_rename.c | 82 ++++++++++------------------
> fs/xfs/xfs_types.h | 5 +
> fs/xfs/xfs_utils.c | 4 -
> fs/xfs/xfs_utils.h | 4 -
> fs/xfs/xfs_vnodeops.c | 121
> ++++++++++++++++++------------------------
> fs/xfs/xfs_vnodeops.h | 23 ++++---
> 15 files changed, 191 insertions(+), 209 deletions(-)
>
> Index: kern_ci/fs/dmapi/dmapi_event.c
> ===================================================================
> --- kern_ci.orig/fs/dmapi/dmapi_event.c
> +++ kern_ci/fs/dmapi/dmapi_event.c
> @@ -622,8 +622,8 @@ dm_send_namesp_event(
> dm_right_t vp1_right,
> struct inode *ip2,
> dm_right_t vp2_right,
> - char *name1,
> - char *name2,
> + const char *name1,
> + const char *name2,
> mode_t mode,
> int retcode,
> int flags)
> Index: kern_ci/fs/dmapi/dmapi_kern.h
> ===================================================================
> --- kern_ci.orig/fs/dmapi/dmapi_kern.h
> +++ kern_ci/fs/dmapi/dmapi_kern.h
> @@ -119,8 +119,8 @@ int dm_send_namesp_event(
> dm_right_t vp1_right,
> struct inode *ip2,
> dm_right_t vp2_right,
> - char *name1,
> - char *name2,
> + const char *name1,
> + const char *name2,
> mode_t mode,
> int retcode,
> int flags);
> Index: kern_ci/fs/xfs/dmapi/xfs_dm.c
> ===================================================================
> --- kern_ci.orig/fs/xfs/dmapi/xfs_dm.c
> +++ kern_ci/fs/xfs/dmapi/xfs_dm.c
> @@ -245,7 +245,7 @@ xfs_copyin_attrname(
> size_t len;
>
> strcpy(to->dan_chars, dmattr_prefix);
> -
> +
> len = strnlen_user((char __user *)from, DM_ATTR_NAME_SIZE);
> if (len == 0)
> error = EFAULT;
> @@ -3172,8 +3172,8 @@ xfs_dm_send_namesp_event(
> dm_right_t vp1_right,
> xfs_inode_t *ip2,
> dm_right_t vp2_right,
> - char *name1,
> - char *name2,
> + const char *name1,
> + const char *name2,
> mode_t mode,
> int retcode,
> int flags)
> Index: kern_ci/fs/xfs/linux-2.6/xfs_export.c
> ===================================================================
> --- kern_ci.orig/fs/xfs/linux-2.6/xfs_export.c
> +++ kern_ci/fs/xfs/linux-2.6/xfs_export.c
> @@ -22,6 +22,7 @@
> #include "xfs_trans.h"
> #include "xfs_sb.h"
> #include "xfs_ag.h"
> +#include "xfs_dir2.h"
> #include "xfs_dmapi.h"
> #include "xfs_mount.h"
> #include "xfs_export.h"
> @@ -30,8 +31,6 @@
> #include "xfs_inode.h"
> #include "xfs_vfsops.h"
>
> -static struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, };
> -
> /*
> * Note that we only accept fileids which are long enough rather than
> allow
> * the parent generation number to default to zero. XFS considers
> zero a
> @@ -216,7 +215,7 @@ xfs_fs_get_parent(
> struct xfs_inode *cip;
> struct dentry *parent;
>
> - error = xfs_lookup(XFS_I(child->d_inode), &dotdot, &cip);
> + error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip);
> if (unlikely(error))
> return ERR_PTR(-error);
>
> Index: kern_ci/fs/xfs/linux-2.6/xfs_iops.c
> ===================================================================
> --- kern_ci.orig/fs/xfs/linux-2.6/xfs_iops.c
> +++ kern_ci/fs/xfs/linux-2.6/xfs_iops.c
> @@ -239,6 +239,15 @@ xfs_init_security(
> return error;
> }
>
> +static void
> +xfs_dentry_to_name(
> + struct xfs_name *namep,
> + struct dentry *dentry)
> +{
> + namep->name = dentry->d_name.name;
> + namep->len = dentry->d_name.len;
> +}
> +
> STATIC void
> xfs_cleanup_inode(
> struct inode *dir,
> @@ -246,20 +255,19 @@ xfs_cleanup_inode(
> struct dentry *dentry,
> int mode)
> {
> - struct dentry teardown = {};
> + struct xfs_name teardown;
>
> /* Oh, the horror.
> * If we can't add the ACL or we fail in
> * xfs_init_security we must back out.
> * ENOSPC can hit here, among other things.
> */
> - teardown.d_inode = inode;
> - teardown.d_name = dentry->d_name;
> + xfs_dentry_to_name(&teardown, dentry);
>
> if (S_ISDIR(mode))
> - xfs_rmdir(XFS_I(dir), &teardown);
> + xfs_rmdir(XFS_I(dir), &teardown, XFS_I(inode));
> else
> - xfs_remove(XFS_I(dir), &teardown);
> + xfs_remove(XFS_I(dir), &teardown, XFS_I(inode));
> iput(inode);
> }
>
> @@ -273,6 +281,7 @@ xfs_vn_mknod(
> struct inode *inode;
> struct xfs_inode *ip = NULL;
> xfs_acl_t *default_acl = NULL;
> + struct xfs_name name;
> attrexists_t test_default_acl = _ACL_DEFAULT_EXISTS;
> int error;
>
> @@ -293,6 +302,8 @@ xfs_vn_mknod(
> }
> }
>
> + xfs_dentry_to_name(&name, dentry);
> +
> if (IS_POSIXACL(dir) && !default_acl)
> mode &= ~current->fs->umask;
>
> @@ -303,10 +314,10 @@ xfs_vn_mknod(
> case S_IFSOCK:
> rdev = sysv_encode_dev(rdev);
> case S_IFREG:
> - error = xfs_create(XFS_I(dir), dentry, mode, rdev, &ip, NULL);
> + error = xfs_create(XFS_I(dir), &name, mode, rdev, &ip, NULL);
> break;
> case S_IFDIR:
> - error = xfs_mkdir(XFS_I(dir), dentry, mode, &ip, NULL);
> + error = xfs_mkdir(XFS_I(dir), &name, mode, &ip, NULL);
> break;
> default:
> error = EINVAL;
> @@ -371,12 +382,14 @@ xfs_vn_lookup(
> struct nameidata *nd)
> {
> struct xfs_inode *cip;
> + struct xfs_name name;
> int error;
>
> if (dentry->d_name.len >= MAXNAMELEN)
> return ERR_PTR(-ENAMETOOLONG);
>
> - error = xfs_lookup(XFS_I(dir), dentry, &cip);
> + xfs_dentry_to_name(&name, dentry);
> + error = xfs_lookup(XFS_I(dir), &name, &cip);
> if (unlikely(error)) {
> if (unlikely(error != ENOENT))
> return ERR_PTR(-error);
> @@ -394,12 +407,14 @@ xfs_vn_link(
> struct dentry *dentry)
> {
> struct inode *inode; /* inode of guy being linked to */
> + struct xfs_name name;
> int error;
>
> inode = old_dentry->d_inode;
> + xfs_dentry_to_name(&name, dentry);
>
> igrab(inode);
> - error = xfs_link(XFS_I(dir), XFS_I(inode), dentry);
> + error = xfs_link(XFS_I(dir), XFS_I(inode), &name);
> if (unlikely(error)) {
> iput(inode);
> return -error;
> @@ -417,11 +432,13 @@ xfs_vn_unlink(
> struct dentry *dentry)
> {
> struct inode *inode;
> + struct xfs_name name;
> int error;
>
> inode = dentry->d_inode;
> + xfs_dentry_to_name(&name, dentry);
>
> - error = xfs_remove(XFS_I(dir), dentry);
> + error = xfs_remove(XFS_I(dir), &name, XFS_I(inode));
> if (likely(!error)) {
> xfs_validate_fields(dir); /* size needs update */
> xfs_validate_fields(inode);
> @@ -437,14 +454,15 @@ xfs_vn_symlink(
> {
> struct inode *inode;
> struct xfs_inode *cip = NULL;
> + struct xfs_name name;
> int error;
> mode_t mode;
>
> mode = S_IFLNK |
> (irix_symlink_mode ? 0777 & ~current->fs->umask : S_IRWXUGO);
> + xfs_dentry_to_name(&name, dentry);
>
> - error = xfs_symlink(XFS_I(dir), dentry, (char *)symname, mode,
> - &cip, NULL);
> + error = xfs_symlink(XFS_I(dir), &name, symname, mode, &cip, NULL);
> if (unlikely(error))
> goto out;
>
> @@ -471,9 +489,12 @@ xfs_vn_rmdir(
> struct dentry *dentry)
> {
> struct inode *inode = dentry->d_inode;
> + struct xfs_name name;
> int error;
>
> - error = xfs_rmdir(XFS_I(dir), dentry);
> + xfs_dentry_to_name(&name, dentry);
> +
> + error = xfs_rmdir(XFS_I(dir), &name, XFS_I(inode));
> if (likely(!error)) {
> xfs_validate_fields(inode);
> xfs_validate_fields(dir);
> @@ -489,9 +510,15 @@ xfs_vn_rename(
> struct dentry *ndentry)
> {
> struct inode *new_inode = ndentry->d_inode;
> + struct xfs_name oname;
> + struct xfs_name nname;
> int error;
>
> - error = xfs_rename(XFS_I(odir), odentry, XFS_I(ndir), ndentry);
> + xfs_dentry_to_name(&oname, odentry);
> + xfs_dentry_to_name(&nname, ndentry);
> +
> + error = xfs_rename(XFS_I(odir), &oname, XFS_I(odentry->d_inode),
> + XFS_I(ndir), &nname);
> if (likely(!error)) {
> if (new_inode)
> xfs_validate_fields(new_inode);
> Index: kern_ci/fs/xfs/linux-2.6/xfs_vnode.h
> ===================================================================
> --- kern_ci.orig/fs/xfs/linux-2.6/xfs_vnode.h
> +++ kern_ci/fs/xfs/linux-2.6/xfs_vnode.h
> @@ -23,8 +23,6 @@ struct bhv_vattr;
> struct xfs_iomap;
> struct attrlist_cursor_kern;
>
> -typedef struct dentry bhv_vname_t;
> -typedef __u64 bhv_vnumber_t;
> typedef struct inode bhv_vnode_t;
>
> #define VN_ISLNK(vp) S_ISLNK((vp)->i_mode)
> @@ -211,13 +209,6 @@ static inline bhv_vnode_t *vn_grab(bhv_v
> }
>
> /*
> - * Vname handling macros.
> - */
> -#define VNAME(dentry) ((char *) (dentry)->d_name.name)
> -#define VNAMELEN(dentry) ((dentry)->d_name.len)
> -#define VNAME_TO_INODE(dentry) (XFS_I((dentry)->d_inode))
> -
> -/*
> * Dealing with bad inodes
> */
> static inline int VN_BAD(bhv_vnode_t *vp)
> Index: kern_ci/fs/xfs/xfs_dir2.c
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_dir2.c
> +++ kern_ci/fs/xfs/xfs_dir2.c
> @@ -44,6 +44,7 @@
> #include "xfs_error.h"
> #include "xfs_vnodeops.h"
>
> +struct xfs_name xfs_name_dotdot = {"..", 2};
>
> void
> xfs_dir_mount(
> @@ -146,8 +147,7 @@ int
> xfs_dir_createname(
> xfs_trans_t *tp,
> xfs_inode_t *dp,
> - char *name,
> - int namelen,
> + struct xfs_name *name,
> xfs_ino_t inum, /* new entry inode number */
> xfs_fsblock_t *first, /* bmap's firstblock */
> xfs_bmap_free_t *flist, /* bmap's freeblock list */
> @@ -162,9 +162,9 @@ xfs_dir_createname(
> return rval;
> XFS_STATS_INC(xs_dir_create);
>
> - args.name = name;
> - args.namelen = namelen;
> - args.hashval = xfs_da_hashname(name, namelen);
> + args.name = name->name;
> + args.namelen = name->len;
> + args.hashval = xfs_da_hashname(name->name, name->len);
> args.inumber = inum;
> args.dp = dp;
> args.firstblock = first;
> @@ -197,8 +197,7 @@ int
> xfs_dir_lookup(
> xfs_trans_t *tp,
> xfs_inode_t *dp,
> - char *name,
> - int namelen,
> + struct xfs_name *name,
> xfs_ino_t *inum) /* out: inode number */
> {
> xfs_da_args_t args;
> @@ -207,18 +206,14 @@ xfs_dir_lookup(
>
> ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
> XFS_STATS_INC(xs_dir_lookup);
> + memset(&args, 0, sizeof(xfs_da_args_t));
>
> - args.name = name;
> - args.namelen = namelen;
> - args.hashval = xfs_da_hashname(name, namelen);
> - args.inumber = 0;
> + args.name = name->name;
> + args.namelen = name->len;
> + args.hashval = xfs_da_hashname(name->name, name->len);
> args.dp = dp;
> - args.firstblock = NULL;
> - args.flist = NULL;
> - args.total = 0;
> args.whichfork = XFS_DATA_FORK;
> args.trans = tp;
> - args.justcheck = args.addname = 0;
> args.oknoent = 1;
>
> if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL)
> @@ -247,8 +242,7 @@ int
> xfs_dir_removename(
> xfs_trans_t *tp,
> xfs_inode_t *dp,
> - char *name,
> - int namelen,
> + struct xfs_name *name,
> xfs_ino_t ino,
> xfs_fsblock_t *first, /* bmap's firstblock */
> xfs_bmap_free_t *flist, /* bmap's freeblock list */
> @@ -261,9 +255,9 @@ xfs_dir_removename(
> ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
> XFS_STATS_INC(xs_dir_remove);
>
> - args.name = name;
> - args.namelen = namelen;
> - args.hashval = xfs_da_hashname(name, namelen);
> + args.name = name->name;
> + args.namelen = name->len;
> + args.hashval = xfs_da_hashname(name->name, name->len);
> args.inumber = ino;
> args.dp = dp;
> args.firstblock = first;
> @@ -329,8 +323,7 @@ int
> xfs_dir_replace(
> xfs_trans_t *tp,
> xfs_inode_t *dp,
> - char *name, /* name of entry to replace */
> - int namelen,
> + struct xfs_name *name, /* name of entry to replace */
> xfs_ino_t inum, /* new inode number */
> xfs_fsblock_t *first, /* bmap's firstblock */
> xfs_bmap_free_t *flist, /* bmap's freeblock list */
> @@ -345,9 +338,9 @@ xfs_dir_replace(
> if ((rval = xfs_dir_ino_validate(tp->t_mountp, inum)))
> return rval;
>
> - args.name = name;
> - args.namelen = namelen;
> - args.hashval = xfs_da_hashname(name, namelen);
> + args.name = name->name;
> + args.namelen = name->len;
> + args.hashval = xfs_da_hashname(name->name, name->len);
> args.inumber = inum;
> args.dp = dp;
> args.firstblock = first;
> @@ -374,28 +367,29 @@ xfs_dir_replace(
>
> /*
> * See if this entry can be added to the directory without allocating
> space.
> + * First checks that the caller couldn't reserve enough space (resblks =
> 0).
> */
> int
> xfs_dir_canenter(
> xfs_trans_t *tp,
> xfs_inode_t *dp,
> - char *name, /* name of entry to add */
> - int namelen)
> + struct xfs_name *name, /* name of entry to add */
> + uint resblks)
> {
> xfs_da_args_t args;
> int rval;
> int v; /* type-checking value */
>
> + if (resblks)
> + return 0;
> +
> ASSERT((dp->i_d.di_mode & S_IFMT) == S_IFDIR);
> + memset(&args, 0, sizeof(xfs_da_args_t));
>
> - args.name = name;
> - args.namelen = namelen;
> - args.hashval = xfs_da_hashname(name, namelen);
> - args.inumber = 0;
> + args.name = name->name;
> + args.namelen = name->len;
> + args.hashval = xfs_da_hashname(name->name, name->len);
> args.dp = dp;
> - args.firstblock = NULL;
> - args.flist = NULL;
> - args.total = 0;
> args.whichfork = XFS_DATA_FORK;
> args.trans = tp;
> args.justcheck = args.addname = args.oknoent = 1;
> Index: kern_ci/fs/xfs/xfs_dir2.h
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_dir2.h
> +++ kern_ci/fs/xfs/xfs_dir2.h
> @@ -59,6 +59,8 @@ typedef __uint32_t xfs_dir2_db_t;
> */
> typedef xfs_off_t xfs_dir2_off_t;
>
> +extern struct xfs_name xfs_name_dotdot;
> +
> /*
> * Generic directory interface routines
> */
> @@ -68,21 +70,21 @@ extern int xfs_dir_isempty(struct xfs_in
> extern int xfs_dir_init(struct xfs_trans *tp, struct xfs_inode *dp,
> struct xfs_inode *pdp);
> extern int xfs_dir_createname(struct xfs_trans *tp, struct xfs_inode
> *dp,
> - char *name, int namelen, xfs_ino_t inum,
> + struct xfs_name *name, xfs_ino_t inum,
> xfs_fsblock_t *first,
> struct xfs_bmap_free *flist, xfs_extlen_t tot);
> extern int xfs_dir_lookup(struct xfs_trans *tp, struct xfs_inode *dp,
> - char *name, int namelen, xfs_ino_t *inum);
> + struct xfs_name *name, xfs_ino_t *inum);
> extern int xfs_dir_removename(struct xfs_trans *tp, struct xfs_inode
> *dp,
> - char *name, int namelen, xfs_ino_t ino,
> + struct xfs_name *name, xfs_ino_t ino,
> xfs_fsblock_t *first,
> struct xfs_bmap_free *flist, xfs_extlen_t tot);
> extern int xfs_dir_replace(struct xfs_trans *tp, struct xfs_inode *dp,
> - char *name, int namelen, xfs_ino_t inum,
> + struct xfs_name *name, xfs_ino_t inum,
> xfs_fsblock_t *first,
> struct xfs_bmap_free *flist, xfs_extlen_t tot);
> extern int xfs_dir_canenter(struct xfs_trans *tp, struct xfs_inode *dp,
> - char *name, int namelen);
> + struct xfs_name *name, uint resblks);
> extern int xfs_dir_ino_validate(struct xfs_mount *mp, xfs_ino_t ino);
>
> /*
> Index: kern_ci/fs/xfs/xfs_mount.h
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_mount.h
> +++ kern_ci/fs/xfs/xfs_mount.h
> @@ -73,7 +73,7 @@ typedef int (*xfs_send_destroy_t)(struct
> typedef int (*xfs_send_namesp_t)(dm_eventtype_t, struct xfs_mount *,
> struct xfs_inode *, dm_right_t,
> struct xfs_inode *, dm_right_t,
> - char *, char *, mode_t, int, int);
> + const char *, const char *, mode_t, int, int);
> typedef int (*xfs_send_mount_t)(struct xfs_mount *, dm_right_t,
> char *, char *);
> typedef void (*xfs_send_unmount_t)(struct xfs_mount *, struct
> xfs_inode *,
> @@ -401,7 +401,7 @@ typedef struct xfs_mount {
>
> /*
> * Allow large block sizes to be reported to userspace programs if the
> - * "largeio" mount option is used.
> + * "largeio" mount option is used.
> *
> * If compatibility mode is specified, simply return the basic unit of
> caching
> * so that we don't get inefficient read/modify/write I/O from user
> apps.
> Index: kern_ci/fs/xfs/xfs_rename.c
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_rename.c
> +++ kern_ci/fs/xfs/xfs_rename.c
> @@ -83,25 +83,24 @@ int xfs_rename_skip, xfs_rename_nskip;
> */
> STATIC int
> xfs_lock_for_rename(
> - xfs_inode_t *dp1, /* old (source) directory inode */
> - xfs_inode_t *dp2, /* new (target) directory inode */
> - bhv_vname_t *vname1,/* old entry name */
> - bhv_vname_t *vname2,/* new entry name */
> - xfs_inode_t **ipp1, /* inode of old entry */
> - xfs_inode_t **ipp2, /* inode of new entry, if it
> + xfs_inode_t *dp1, /* in: old (source) directory inode */
> + xfs_inode_t *dp2, /* in: new (target) directory inode */
> + xfs_inode_t *ip1, /* in: inode of old entry */
> + struct xfs_name *name2, /* in: new entry name */
> + xfs_inode_t **ipp2, /* out: inode of new entry, if it
> already exists, NULL otherwise. */
> - xfs_inode_t **i_tab,/* array of inode returned, sorted */
> - int *num_inodes) /* number of inodes in array */
> + xfs_inode_t **i_tab,/* out: array of inode returned, sorted */
> + int *num_inodes) /* out: number of inodes in array */
> {
> - xfs_inode_t *ip1 = VNAME_TO_INODE(vname1);
> - xfs_inode_t *ip2, *temp;
> + xfs_inode_t *ip2 = NULL;
> + xfs_inode_t *temp;
> xfs_ino_t inum1, inum2;
> int error;
> int i, j;
> uint lock_mode;
> int diff_dirs = (dp1 != dp2);
>
> - ip2 = NULL;
> + ASSERT(ip1);
>
> /*
> * First, find out the current inums of the entries so that we
> @@ -115,17 +114,15 @@ xfs_lock_for_rename(
>
> inum1 = ip1->i_ino;
>
> -
> /*
> * Unlock dp1 and lock dp2 if they are different.
> */
> -
> if (diff_dirs) {
> xfs_iunlock_map_shared(dp1, lock_mode);
> lock_mode = xfs_ilock_map_shared(dp2);
> }
>
> - error = xfs_dir_lookup_int(dp2, lock_mode, vname2, &inum2, &ip2);
> + error = xfs_dir_lookup_int(dp2, lock_mode, name2, &inum2, &ip2);
> if (error == ENOENT) { /* target does not need to exist. */
> inum2 = 0;
> } else if (error) {
> @@ -157,6 +154,7 @@ xfs_lock_for_rename(
> *num_inodes = 4;
> i_tab[3] = ip2;
> }
> + *ipp2 = i_tab[3];
>
> /*
> * Sort the elements via bubble sort. (Remember, there are at
> @@ -194,21 +192,6 @@ xfs_lock_for_rename(
> xfs_lock_inodes(i_tab, *num_inodes, 0, XFS_ILOCK_SHARED);
> }
>
> - /*
> - * Set the return value. Null out any unused entries in i_tab.
> - */
> - *ipp1 = *ipp2 = NULL;
> - for (i=0; i < *num_inodes; i++) {
> - if (i_tab[i]->i_ino == inum1) {
> - *ipp1 = i_tab[i];
> - }
> - if (i_tab[i]->i_ino == inum2) {
> - *ipp2 = i_tab[i];
> - }
> - }
> - for (;i < 4; i++) {
> - i_tab[i] = NULL;
> - }
> return 0;
> }
>
> @@ -218,12 +201,13 @@ xfs_lock_for_rename(
> int
> xfs_rename(
> xfs_inode_t *src_dp,
> - bhv_vname_t *src_vname,
> + struct xfs_name *src_name,
> + xfs_inode_t *src_ip,
> xfs_inode_t *target_dp,
> - bhv_vname_t *target_vname)
> + struct xfs_name *target_name)
> {
> xfs_trans_t *tp;
> - xfs_inode_t *src_ip, *target_ip;
> + xfs_inode_t *target_ip;
> xfs_mount_t *mp = src_dp->i_mount;
> int new_parent; /* moving to a new dir */
> int src_is_directory; /* src_name is a directory */
> @@ -237,10 +221,6 @@ xfs_rename(
> int spaceres;
> int target_link_zero = 0;
> int num_inodes;
> - char *src_name = VNAME(src_vname);
> - char *target_name = VNAME(target_vname);
> - int src_namelen = VNAMELEN(src_vname);
> - int target_namelen = VNAMELEN(target_vname);
>
> xfs_itrace_entry(src_dp);
> xfs_itrace_entry(target_dp);
> @@ -250,7 +230,7 @@ xfs_rename(
> error = XFS_SEND_NAMESP(mp, DM_EVENT_RENAME,
> src_dp, DM_RIGHT_NULL,
> target_dp, DM_RIGHT_NULL,
> - src_name, target_name,
> + src_name->name, target_name->name,
> 0, 0, 0);
> if (error) {
> return error;
> @@ -267,10 +247,8 @@ xfs_rename(
> * does not exist in the source directory.
> */
> tp = NULL;
> - error = xfs_lock_for_rename(src_dp, target_dp, src_vname,
> - target_vname, &src_ip, &target_ip, inodes,
> - &num_inodes);
> -
> + error = xfs_lock_for_rename(src_dp, target_dp, src_ip, target_name,
> + &target_ip, inodes, &num_inodes);
> if (error) {
> /*
> * We have nothing locked, no inode references, and
> @@ -316,7 +294,7 @@ xfs_rename(
> XFS_BMAP_INIT(&free_list, &first_block);
> tp = xfs_trans_alloc(mp, XFS_TRANS_RENAME);
> cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
> - spaceres = XFS_RENAME_SPACE_RES(mp, target_namelen);
> + spaceres = XFS_RENAME_SPACE_RES(mp, target_name->len);
> error = xfs_trans_reserve(tp, spaceres, XFS_RENAME_LOG_RES(mp), 0,
> XFS_TRANS_PERM_LOG_RES, XFS_RENAME_LOG_COUNT);
> if (error == ENOSPC) {
> @@ -374,9 +352,8 @@ xfs_rename(
> * If there's no space reservation, check the entry will
> * fit before actually inserting it.
> */
> - if (spaceres == 0 &&
> - (error = xfs_dir_canenter(tp, target_dp, target_name,
> - target_namelen)))
> + error = xfs_dir_canenter(tp, target_dp, target_name, spaceres);
> + if (error)
> goto error_return;
> /*
> * If target does not exist and the rename crosses
> @@ -384,8 +361,8 @@ xfs_rename(
> * to account for the ".." reference from the new entry.
> */
> error = xfs_dir_createname(tp, target_dp, target_name,
> - target_namelen, src_ip->i_ino,
> - &first_block, &free_list, spaceres);
> + src_ip->i_ino, &first_block,
> + &free_list, spaceres);
> if (error == ENOSPC)
> goto error_return;
> if (error)
> @@ -424,7 +401,7 @@ xfs_rename(
> * name at the destination directory, remove it first.
> */
> error = xfs_dir_replace(tp, target_dp, target_name,
> - target_namelen, src_ip->i_ino,
> + src_ip->i_ino,
> &first_block, &free_list, spaceres);
> if (error)
> goto abort_return;
> @@ -461,7 +438,8 @@ xfs_rename(
> * Rewrite the ".." entry to point to the new
> * directory.
> */
> - error = xfs_dir_replace(tp, src_ip, "..", 2, target_dp->i_ino,
> + error = xfs_dir_replace(tp, src_ip, &xfs_name_dotdot,
> + target_dp->i_ino,
> &first_block, &free_list, spaceres);
> ASSERT(error != EEXIST);
> if (error)
> @@ -497,8 +475,8 @@ xfs_rename(
> goto abort_return;
> }
>
> - error = xfs_dir_removename(tp, src_dp, src_name, src_namelen,
> - src_ip->i_ino, &first_block, &free_list, spaceres);
> + error = xfs_dir_removename(tp, src_dp, src_name, src_ip->i_ino,
> + &first_block, &free_list, spaceres);
> if (error)
> goto abort_return;
> xfs_ichgtime(src_dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
> @@ -583,7 +561,7 @@ std_return:
> (void) XFS_SEND_NAMESP (mp, DM_EVENT_POSTRENAME,
> src_dp, DM_RIGHT_NULL,
> target_dp, DM_RIGHT_NULL,
> - src_name, target_name,
> + src_name->name, target_name->name,
> 0, error, 0);
> }
> return error;
> Index: kern_ci/fs/xfs/xfs_types.h
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_types.h
> +++ kern_ci/fs/xfs/xfs_types.h
> @@ -160,4 +160,9 @@ typedef enum {
> XFS_BTNUM_MAX
> } xfs_btnum_t;
>
> +struct xfs_name {
> + const char *name;
> + int len;
> +};
> +
> #endif /* __XFS_TYPES_H__ */
> Index: kern_ci/fs/xfs/xfs_utils.c
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_utils.c
> +++ kern_ci/fs/xfs/xfs_utils.c
> @@ -45,7 +45,7 @@ int
> xfs_dir_lookup_int(
> xfs_inode_t *dp,
> uint lock_mode,
> - bhv_vname_t *dentry,
> + struct xfs_name *name,
> xfs_ino_t *inum,
> xfs_inode_t **ipp)
> {
> @@ -53,7 +53,7 @@ xfs_dir_lookup_int(
>
> xfs_itrace_entry(dp);
>
> - error = xfs_dir_lookup(NULL, dp, VNAME(dentry), VNAMELEN(dentry),
> inum);
> + error = xfs_dir_lookup(NULL, dp, name, inum);
> if (!error) {
> /*
> * Unlock the directory. We do this because we can't
> Index: kern_ci/fs/xfs/xfs_utils.h
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_utils.h
> +++ kern_ci/fs/xfs/xfs_utils.h
> @@ -21,8 +21,8 @@
> #define IRELE(ip) VN_RELE(XFS_ITOV(ip))
> #define IHOLD(ip) VN_HOLD(XFS_ITOV(ip))
>
> -extern int xfs_dir_lookup_int(xfs_inode_t *, uint, bhv_vname_t *,
> xfs_ino_t *,
> - xfs_inode_t **);
> +extern int xfs_dir_lookup_int(xfs_inode_t *, uint, struct xfs_name *,
> + xfs_ino_t *, xfs_inode_t **);
> extern int xfs_truncate_file(xfs_mount_t *, xfs_inode_t *);
> extern int xfs_dir_ialloc(xfs_trans_t **, xfs_inode_t *, mode_t,
> xfs_nlink_t,
> xfs_dev_t, cred_t *, prid_t, int,
> Index: kern_ci/fs/xfs/xfs_vnodeops.c
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_vnodeops.c
> +++ kern_ci/fs/xfs/xfs_vnodeops.c
> @@ -1762,7 +1762,7 @@ xfs_inactive(
> int
> xfs_lookup(
> xfs_inode_t *dp,
> - bhv_vname_t *dentry,
> + struct xfs_name *name,
> xfs_inode_t **ipp)
> {
> xfs_inode_t *ip;
> @@ -1776,7 +1776,7 @@ xfs_lookup(
> return XFS_ERROR(EIO);
>
> lock_mode = xfs_ilock_map_shared(dp);
> - error = xfs_dir_lookup_int(dp, lock_mode, dentry, &e_inum, &ip);
> + error = xfs_dir_lookup_int(dp, lock_mode, name, &e_inum, &ip);
> if (!error) {
> *ipp = ip;
> xfs_itrace_ref(ip);
> @@ -1788,17 +1788,16 @@ xfs_lookup(
> int
> xfs_create(
> xfs_inode_t *dp,
> - bhv_vname_t *dentry,
> + struct xfs_name *name,
> mode_t mode,
> xfs_dev_t rdev,
> xfs_inode_t **ipp,
> cred_t *credp)
> {
> - char *name = VNAME(dentry);
> - xfs_mount_t *mp = dp->i_mount;
> + xfs_mount_t *mp = dp->i_mount;
> xfs_inode_t *ip;
> xfs_trans_t *tp;
> - int error;
> + int error;
> xfs_bmap_free_t free_list;
> xfs_fsblock_t first_block;
> boolean_t unlock_dp_on_error = B_FALSE;
> @@ -1808,17 +1807,14 @@ xfs_create(
> xfs_prid_t prid;
> struct xfs_dquot *udqp, *gdqp;
> uint resblks;
> - int namelen;
>
> ASSERT(!*ipp);
> xfs_itrace_entry(dp);
>
> - namelen = VNAMELEN(dentry);
> -
> if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) {
> error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
> dp, DM_RIGHT_NULL, NULL,
> - DM_RIGHT_NULL, name, NULL,
> + DM_RIGHT_NULL, name->name, NULL,
> mode, 0, 0);
>
> if (error)
> @@ -1850,7 +1846,7 @@ xfs_create(
>
> tp = xfs_trans_alloc(mp, XFS_TRANS_CREATE);
> cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
> - resblks = XFS_CREATE_SPACE_RES(mp, namelen);
> + resblks = XFS_CREATE_SPACE_RES(mp, name->len);
> /*
> * Initially assume that the file does not exist and
> * reserve the resources for that case. If that is not
> @@ -1883,7 +1879,8 @@ xfs_create(
> if (error)
> goto error_return;
>
> - if (resblks == 0 && (error = xfs_dir_canenter(tp, dp, name, namelen)))
> + error = xfs_dir_canenter(tp, dp, name, resblks);
> + if (error)
> goto error_return;
> error = xfs_dir_ialloc(&tp, dp, mode, 1,
> rdev, credp, prid, resblks > 0,
> @@ -1913,7 +1910,7 @@ xfs_create(
> xfs_trans_ijoin(tp, dp, XFS_ILOCK_EXCL);
> unlock_dp_on_error = B_FALSE;
>
> - error = xfs_dir_createname(tp, dp, name, namelen, ip->i_ino,
> + error = xfs_dir_createname(tp, dp, name, ip->i_ino,
> &first_block, &free_list, resblks ?
> resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
> if (error) {
> @@ -1974,7 +1971,7 @@ std_return:
> (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTCREATE,
> dp, DM_RIGHT_NULL,
> *ipp ? ip : NULL,
> - DM_RIGHT_NULL, name, NULL,
> + DM_RIGHT_NULL, name->name, NULL,
> mode, error, 0);
> }
> return error;
> @@ -2266,12 +2263,10 @@ int remove_which_error_return = 0;
> int
> xfs_remove(
> xfs_inode_t *dp,
> - bhv_vname_t *dentry)
> + struct xfs_name *name,
> + xfs_inode_t *ip)
> {
> - char *name = VNAME(dentry);
> xfs_mount_t *mp = dp->i_mount;
> - xfs_inode_t *ip = VNAME_TO_INODE(dentry);
> - int namelen = VNAMELEN(dentry);
> xfs_trans_t *tp = NULL;
> int error = 0;
> xfs_bmap_free_t free_list;
> @@ -2287,9 +2282,9 @@ xfs_remove(
> return XFS_ERROR(EIO);
>
> if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) {
> - error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp,
> - DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
> - name, NULL, ip->i_d.di_mode, 0, 0);
> + error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE, dp, DM_RIGHT_NULL,
> + NULL, DM_RIGHT_NULL, name->name, NULL,
> + ip->i_d.di_mode, 0, 0);
> if (error)
> return error;
> }
> @@ -2374,7 +2369,7 @@ xfs_remove(
> * Entry must exist since we did a lookup in xfs_lock_dir_and_entry.
> */
> XFS_BMAP_INIT(&free_list, &first_block);
> - error = xfs_dir_removename(tp, dp, name, namelen, ip->i_ino,
> + error = xfs_dir_removename(tp, dp, name, ip->i_ino,
> &first_block, &free_list, 0);
> if (error) {
> ASSERT(error != ENOENT);
> @@ -2442,7 +2437,7 @@ xfs_remove(
> (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
> dp, DM_RIGHT_NULL,
> NULL, DM_RIGHT_NULL,
> - name, NULL, ip->i_d.di_mode, error, 0);
> + name->name, NULL, ip->i_d.di_mode, error, 0);
> }
> return error;
>
> @@ -2472,7 +2467,7 @@ int
> xfs_link(
> xfs_inode_t *tdp,
> xfs_inode_t *sip,
> - bhv_vname_t *dentry)
> + struct xfs_name *target_name)
> {
> xfs_mount_t *mp = tdp->i_mount;
> xfs_trans_t *tp;
> @@ -2483,13 +2478,10 @@ xfs_link(
> int cancel_flags;
> int committed;
> int resblks;
> - char *target_name = VNAME(dentry);
> - int target_namelen;
>
> xfs_itrace_entry(tdp);
> xfs_itrace_entry(sip);
>
> - target_namelen = VNAMELEN(dentry);
> ASSERT(!S_ISDIR(sip->i_d.di_mode));
>
> if (XFS_FORCED_SHUTDOWN(mp))
> @@ -2499,7 +2491,7 @@ xfs_link(
> error = XFS_SEND_NAMESP(mp, DM_EVENT_LINK,
> tdp, DM_RIGHT_NULL,
> sip, DM_RIGHT_NULL,
> - target_name, NULL, 0, 0, 0);
> + target_name->name, NULL, 0, 0, 0);
> if (error)
> return error;
> }
> @@ -2514,7 +2506,7 @@ xfs_link(
>
> tp = xfs_trans_alloc(mp, XFS_TRANS_LINK);
> cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
> - resblks = XFS_LINK_SPACE_RES(mp, target_namelen);
> + resblks = XFS_LINK_SPACE_RES(mp, target_name->len);
> error = xfs_trans_reserve(tp, resblks, XFS_LINK_LOG_RES(mp), 0,
> XFS_TRANS_PERM_LOG_RES, XFS_LINK_LOG_COUNT);
> if (error == ENOSPC) {
> @@ -2566,15 +2558,14 @@ xfs_link(
> goto error_return;
> }
>
> - if (resblks == 0 &&
> - (error = xfs_dir_canenter(tp, tdp, target_name, target_namelen)))
> + error = xfs_dir_canenter(tp, tdp, target_name, resblks);
> + if (error)
> goto error_return;
>
> XFS_BMAP_INIT(&free_list, &first_block);
>
> - error = xfs_dir_createname(tp, tdp, target_name, target_namelen,
> - sip->i_ino, &first_block, &free_list,
> - resblks);
> + error = xfs_dir_createname(tp, tdp, target_name, sip->i_ino,
> + &first_block, &free_list, resblks);
> if (error)
> goto abort_return;
> xfs_ichgtime(tdp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
> @@ -2610,7 +2601,7 @@ std_return:
> (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTLINK,
> tdp, DM_RIGHT_NULL,
> sip, DM_RIGHT_NULL,
> - target_name, NULL, 0, error, 0);
> + target_name->name, NULL, 0, error, 0);
> }
> return error;
>
> @@ -2627,13 +2618,11 @@ std_return:
> int
> xfs_mkdir(
> xfs_inode_t *dp,
> - bhv_vname_t *dentry,
> + struct xfs_name *dir_name,
> mode_t mode,
> xfs_inode_t **ipp,
> cred_t *credp)
> {
> - char *dir_name = VNAME(dentry);
> - int dir_namelen = VNAMELEN(dentry);
> xfs_mount_t *mp = dp->i_mount;
> xfs_inode_t *cdp; /* inode of created dir */
> xfs_trans_t *tp;
> @@ -2657,7 +2646,7 @@ xfs_mkdir(
> if (DM_EVENT_ENABLED(dp, DM_EVENT_CREATE)) {
> error = XFS_SEND_NAMESP(mp, DM_EVENT_CREATE,
> dp, DM_RIGHT_NULL, NULL,
> - DM_RIGHT_NULL, dir_name, NULL,
> + DM_RIGHT_NULL, dir_name->name, NULL,
> mode, 0, 0);
> if (error)
> return error;
> @@ -2686,7 +2675,7 @@ xfs_mkdir(
>
> tp = xfs_trans_alloc(mp, XFS_TRANS_MKDIR);
> cancel_flags = XFS_TRANS_RELEASE_LOG_RES;
> - resblks = XFS_MKDIR_SPACE_RES(mp, dir_namelen);
> + resblks = XFS_MKDIR_SPACE_RES(mp, dir_name->len);
> error = xfs_trans_reserve(tp, resblks, XFS_MKDIR_LOG_RES(mp), 0,
> XFS_TRANS_PERM_LOG_RES, XFS_MKDIR_LOG_COUNT);
> if (error == ENOSPC) {
> @@ -2718,8 +2707,8 @@ xfs_mkdir(
> if (error)
> goto error_return;
>
> - if (resblks == 0 &&
> - (error = xfs_dir_canenter(tp, dp, dir_name, dir_namelen)))
> + error = xfs_dir_canenter(tp, dp, dir_name, resblks);
> + if (error)
> goto error_return;
> /*
> * create the directory inode.
> @@ -2748,9 +2737,9 @@ xfs_mkdir(
>
> XFS_BMAP_INIT(&free_list, &first_block);
>
> - error = xfs_dir_createname(tp, dp, dir_name, dir_namelen, cdp->i_ino,
> - &first_block, &free_list, resblks ?
> - resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
> + error = xfs_dir_createname(tp, dp, dir_name, cdp->i_ino,
> + &first_block, &free_list, resblks ?
> + resblks - XFS_IALLOC_SPACE_RES(mp) : 0);
> if (error) {
> ASSERT(error != ENOSPC);
> goto error1;
> @@ -2815,7 +2804,7 @@ std_return:
> dp, DM_RIGHT_NULL,
> created ? cdp : NULL,
> DM_RIGHT_NULL,
> - dir_name, NULL,
> + dir_name->name, NULL,
> mode, error, 0);
> }
> return error;
> @@ -2839,13 +2828,11 @@ std_return:
> int
> xfs_rmdir(
> xfs_inode_t *dp,
> - bhv_vname_t *dentry)
> + struct xfs_name *name,
> + xfs_inode_t *cdp)
> {
> bhv_vnode_t *dir_vp = XFS_ITOV(dp);
> - char *name = VNAME(dentry);
> - int namelen = VNAMELEN(dentry);
> xfs_mount_t *mp = dp->i_mount;
> - xfs_inode_t *cdp = VNAME_TO_INODE(dentry);
> xfs_trans_t *tp;
> int error;
> xfs_bmap_free_t free_list;
> @@ -2863,8 +2850,8 @@ xfs_rmdir(
> if (DM_EVENT_ENABLED(dp, DM_EVENT_REMOVE)) {
> error = XFS_SEND_NAMESP(mp, DM_EVENT_REMOVE,
> dp, DM_RIGHT_NULL,
> - NULL, DM_RIGHT_NULL,
> - name, NULL, cdp->i_d.di_mode, 0, 0);
> + NULL, DM_RIGHT_NULL, name->name,
> + NULL, cdp->i_d.di_mode, 0, 0);
> if (error)
> return XFS_ERROR(error);
> }
> @@ -2958,7 +2945,7 @@ xfs_rmdir(
> goto error_return;
> }
>
> - error = xfs_dir_removename(tp, dp, name, namelen, cdp->i_ino,
> + error = xfs_dir_removename(tp, dp, name, cdp->i_ino,
> &first_block, &free_list, resblks);
> if (error)
> goto error1;
> @@ -3038,7 +3025,7 @@ xfs_rmdir(
> (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTREMOVE,
> dp, DM_RIGHT_NULL,
> NULL, DM_RIGHT_NULL,
> - name, NULL, cdp->i_d.di_mode,
> + name->name, NULL, cdp->i_d.di_mode,
> error, 0);
> }
> return error;
> @@ -3056,8 +3043,8 @@ xfs_rmdir(
> int
> xfs_symlink(
> xfs_inode_t *dp,
> - bhv_vname_t *dentry,
> - char *target_path,
> + struct xfs_name *link_name,
> + const char *target_path,
> mode_t mode,
> xfs_inode_t **ipp,
> cred_t *credp)
> @@ -3077,15 +3064,13 @@ xfs_symlink(
> int nmaps;
> xfs_bmbt_irec_t mval[SYMLINK_MAPS];
> xfs_daddr_t d;
> - char *cur_chunk;
> + const char *cur_chunk;
> int byte_cnt;
> int n;
> xfs_buf_t *bp;
> xfs_prid_t prid;
> struct xfs_dquot *udqp, *gdqp;
> uint resblks;
> - char *link_name = VNAME(dentry);
> - int link_namelen;
>
> *ipp = NULL;
> error = 0;
> @@ -3097,8 +3082,6 @@ xfs_symlink(
> if (XFS_FORCED_SHUTDOWN(mp))
> return XFS_ERROR(EIO);
>
> - link_namelen = VNAMELEN(dentry);
> -
> /*
> * Check component lengths of the target path name.
> */
> @@ -3109,7 +3092,7 @@ xfs_symlink(
> if (DM_EVENT_ENABLED(dp, DM_EVENT_SYMLINK)) {
> error = XFS_SEND_NAMESP(mp, DM_EVENT_SYMLINK, dp,
> DM_RIGHT_NULL, NULL, DM_RIGHT_NULL,
> - link_name, target_path, 0, 0, 0);
> + link_name->name, target_path, 0, 0, 0);
> if (error)
> return error;
> }
> @@ -3141,7 +3124,7 @@ xfs_symlink(
> fs_blocks = 0;
> else
> fs_blocks = XFS_B_TO_FSB(mp, pathlen);
> - resblks = XFS_SYMLINK_SPACE_RES(mp, link_namelen, fs_blocks);
> + resblks = XFS_SYMLINK_SPACE_RES(mp, link_name->len, fs_blocks);
> error = xfs_trans_reserve(tp, resblks, XFS_SYMLINK_LOG_RES(mp), 0,
> XFS_TRANS_PERM_LOG_RES, XFS_SYMLINK_LOG_COUNT);
> if (error == ENOSPC && fs_blocks == 0) {
> @@ -3175,8 +3158,8 @@ xfs_symlink(
> /*
> * Check for ability to enter directory entry, if no space reserved.
> */
> - if (resblks == 0 &&
> - (error = xfs_dir_canenter(tp, dp, link_name, link_namelen)))
> + error = xfs_dir_canenter(tp, dp, link_name, resblks);
> + if (error)
> goto error_return;
> /*
> * Initialize the bmap freelist prior to calling either
> @@ -3268,8 +3251,8 @@ xfs_symlink(
> /*
> * Create the directory entry for the symlink.
> */
> - error = xfs_dir_createname(tp, dp, link_name, link_namelen, ip->i_ino,
> - &first_block, &free_list, resblks);
> + error = xfs_dir_createname(tp, dp, link_name, ip->i_ino,
> + &first_block, &free_list, resblks);
> if (error)
> goto error1;
> xfs_ichgtime(dp, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
> @@ -3313,8 +3296,8 @@ std_return:
> (void) XFS_SEND_NAMESP(mp, DM_EVENT_POSTSYMLINK,
> dp, DM_RIGHT_NULL,
> error ? NULL : ip,
> - DM_RIGHT_NULL, link_name, target_path,
> - 0, error, 0);
> + DM_RIGHT_NULL, link_name->name,
> + target_path, 0, error, 0);
> }
>
> if (!error)
> Index: kern_ci/fs/xfs/xfs_vnodeops.h
> ===================================================================
> --- kern_ci.orig/fs/xfs/xfs_vnodeops.h
> +++ kern_ci/fs/xfs/xfs_vnodeops.h
> @@ -23,20 +23,22 @@ int xfs_fsync(struct xfs_inode *ip, int
> xfs_off_t stop);
> int xfs_release(struct xfs_inode *ip);
> int xfs_inactive(struct xfs_inode *ip);
> -int xfs_lookup(struct xfs_inode *dp, bhv_vname_t *dentry,
> +int xfs_lookup(struct xfs_inode *dp, struct xfs_name *name,
> struct xfs_inode **ipp);
> -int xfs_create(struct xfs_inode *dp, bhv_vname_t *dentry, mode_t mode,
> +int xfs_create(struct xfs_inode *dp, struct xfs_name *name, mode_t mode,
> xfs_dev_t rdev, struct xfs_inode **ipp, struct cred *credp);
> -int xfs_remove(struct xfs_inode *dp, bhv_vname_t *dentry);
> +int xfs_remove(struct xfs_inode *dp, struct xfs_name *name,
> + struct xfs_inode *ip);
> int xfs_link(struct xfs_inode *tdp, struct xfs_inode *sip,
> - bhv_vname_t *dentry);
> -int xfs_mkdir(struct xfs_inode *dp, bhv_vname_t *dentry,
> + struct xfs_name *target_name);
> +int xfs_mkdir(struct xfs_inode *dp, struct xfs_name *dir_name,
> mode_t mode, struct xfs_inode **ipp, struct cred *credp);
> -int xfs_rmdir(struct xfs_inode *dp, bhv_vname_t *dentry);
> +int xfs_rmdir(struct xfs_inode *dp, struct xfs_name *name,
> + struct xfs_inode *cdp);
> int xfs_readdir(struct xfs_inode *dp, void *dirent, size_t bufsize,
> xfs_off_t *offset, filldir_t filldir);
> -int xfs_symlink(struct xfs_inode *dp, bhv_vname_t *dentry,
> - char *target_path, mode_t mode, struct xfs_inode **ipp,
> +int xfs_symlink(struct xfs_inode *dp, struct xfs_name *link_name,
> + const char *target_path, mode_t mode, struct xfs_inode **ipp,
> struct cred *credp);
> int xfs_inode_flush(struct xfs_inode *ip, int flags);
> int xfs_set_dmattrs(struct xfs_inode *ip, u_int evmask, u_int16_t
> state);
> @@ -44,8 +46,9 @@ int xfs_reclaim(struct xfs_inode *ip);
> int xfs_change_file_space(struct xfs_inode *ip, int cmd,
> xfs_flock64_t *bf, xfs_off_t offset,
> struct cred *credp, int attr_flags);
> -int xfs_rename(struct xfs_inode *src_dp, bhv_vname_t *src_vname,
> - struct xfs_inode *target_dp, bhv_vname_t *target_vname);
> +int xfs_rename(struct xfs_inode *src_dp, struct xfs_name *src_name,
> + struct xfs_inode *src_ip, struct xfs_inode *target_dp,
> + struct xfs_name *target_name);
> int xfs_attr_get(struct xfs_inode *ip, const char *name, char *value,
> int *valuelenp, int flags, cred_t *cred);
> int xfs_attr_set(struct xfs_inode *dp, const char *name, char *value,
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [REVIEW #3] cleanup - remove bhv_vname_t
2008-04-09 7:24 [REVIEW #3] cleanup - remove bhv_vname_t Barry Naujok
2008-04-09 7:28 ` Barry Naujok
@ 2008-04-09 7:49 ` Christoph Hellwig
1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2008-04-09 7:49 UTC (permalink / raw)
To: Barry Naujok; +Cc: xfs@oss.sgi.com, xfs-dev
On Wed, Apr 09, 2008 at 05:24:04PM +1000, Barry Naujok wrote:
> + ASSERT(ip1);
No need for an assert here, there's only one caller and we know it's
there.
Except for that nitpick the patch looks fine to me.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-04-09 7:49 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-09 7:24 [REVIEW #3] cleanup - remove bhv_vname_t Barry Naujok
2008-04-09 7:28 ` Barry Naujok
2008-04-09 7:49 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox