summaryrefslogtreecommitdiffstats
path: root/fs/coda/pioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/coda/pioctl.c')
-rw-r--r--fs/coda/pioctl.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/fs/coda/pioctl.c b/fs/coda/pioctl.c
index 533e83a54..d29c18ccd 100644
--- a/fs/coda/pioctl.c
+++ b/fs/coda/pioctl.c
@@ -73,7 +73,7 @@ int coda_ioctl_release(struct inode *i, struct file *f)
static int coda_pioctl(struct inode * inode, struct file * filp,
unsigned int cmd, unsigned long user_data)
{
- struct dentry *target_de;
+ struct nameidata nd;
int error;
struct PioctlData data;
struct inode *target_inode = NULL;
@@ -92,16 +92,16 @@ static int coda_pioctl(struct inode * inode, struct file * filp,
CDEBUG(D_PIOCTL, "namei, data.follow = %d\n",
data.follow);
if ( data.follow ) {
- target_de = namei(data.path);
+ error = user_path_walk(data.path, &nd);
} else {
- target_de = lnamei(data.path);
+ error = user_path_walk_link(data.path, &nd);
}
- if ( IS_ERR(target_de) ) {
+ if ( error ) {
CDEBUG(D_PIOCTL, "error: lookup fails.\n");
- return PTR_ERR(target_de);
+ return error;
} else {
- target_inode = target_de->d_inode;
+ target_inode = nd.dentry->d_inode;
}
CDEBUG(D_PIOCTL, "target ino: 0x%ld, dev: 0x%d\n",
@@ -109,8 +109,7 @@ static int coda_pioctl(struct inode * inode, struct file * filp,
/* return if it is not a Coda inode */
if ( target_inode->i_sb != inode->i_sb ) {
- if ( target_de )
- dput(target_de);
+ path_release(&nd);
return -EINVAL;
}
@@ -121,9 +120,8 @@ static int coda_pioctl(struct inode * inode, struct file * filp,
CDEBUG(D_PIOCTL, "ioctl on inode %ld\n", target_inode->i_ino);
CDEBUG(D_DOWNCALL, "dput on ino: %ld, icount %d, dcount %d\n", target_inode->i_ino,
- target_inode->i_count, target_de->d_count);
- if ( target_de )
- dput(target_de);
+ target_inode->i_count, nd.dentry->d_count);
+ path_release(&nd);
return error;
}