Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 126358
b: refs/heads/master
c: 730c9ee
h: refs/heads/master
v: v3
  • Loading branch information
Ian Kent authored and Linus Torvalds committed Jan 6, 2009
1 parent 98c13b6 commit 988a364
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 30 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f70f582f0072f37790d2984647198deb3e7782a3
refs/heads/master: 730c9eeca9808fc2cfb506cc68c90aa330da17b0
54 changes: 29 additions & 25 deletions trunk/fs/autofs4/dev-ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ static int autofs_dev_ioctl_protover(struct file *fp,
struct autofs_sb_info *sbi,
struct autofs_dev_ioctl *param)
{
param->arg1 = sbi->version;
param->protover.version = sbi->version;
return 0;
}

Expand All @@ -189,7 +189,7 @@ static int autofs_dev_ioctl_protosubver(struct file *fp,
struct autofs_sb_info *sbi,
struct autofs_dev_ioctl *param)
{
param->arg1 = sbi->sub_version;
param->protosubver.sub_version = sbi->sub_version;
return 0;
}

Expand Down Expand Up @@ -335,13 +335,13 @@ static int autofs_dev_ioctl_openmount(struct file *fp,
int err, fd;

/* param->path has already been checked */
if (!param->arg1)
if (!param->openmount.devid)
return -EINVAL;

param->ioctlfd = -1;

path = param->path;
devid = param->arg1;
devid = param->openmount.devid;

err = 0;
fd = autofs_dev_ioctl_open_mountpoint(path, devid);
Expand Down Expand Up @@ -373,7 +373,7 @@ static int autofs_dev_ioctl_ready(struct file *fp,
{
autofs_wqt_t token;

token = (autofs_wqt_t) param->arg1;
token = (autofs_wqt_t) param->ready.token;
return autofs4_wait_release(sbi, token, 0);
}

Expand All @@ -388,8 +388,8 @@ static int autofs_dev_ioctl_fail(struct file *fp,
autofs_wqt_t token;
int status;

token = (autofs_wqt_t) param->arg1;
status = param->arg2 ? param->arg2 : -ENOENT;
token = (autofs_wqt_t) param->fail.token;
status = param->fail.status ? param->fail.status : -ENOENT;
return autofs4_wait_release(sbi, token, status);
}

Expand All @@ -412,10 +412,10 @@ static int autofs_dev_ioctl_setpipefd(struct file *fp,
int pipefd;
int err = 0;

if (param->arg1 == -1)
if (param->setpipefd.pipefd == -1)
return -EINVAL;

pipefd = param->arg1;
pipefd = param->setpipefd.pipefd;

mutex_lock(&sbi->wq_mutex);
if (!sbi->catatonic) {
Expand Down Expand Up @@ -457,8 +457,8 @@ static int autofs_dev_ioctl_timeout(struct file *fp,
{
unsigned long timeout;

timeout = param->arg1;
param->arg1 = sbi->exp_timeout / HZ;
timeout = param->timeout.timeout;
param->timeout.timeout = sbi->exp_timeout / HZ;
sbi->exp_timeout = timeout * HZ;
return 0;
}
Expand Down Expand Up @@ -489,7 +489,7 @@ static int autofs_dev_ioctl_requester(struct file *fp,
path = param->path;
devid = sbi->sb->s_dev;

param->arg1 = param->arg2 = -1;
param->requester.uid = param->requester.gid = -1;

/* Get nameidata of the parent directory */
err = path_lookup(path, LOOKUP_PARENT, &nd);
Expand All @@ -505,8 +505,8 @@ static int autofs_dev_ioctl_requester(struct file *fp,
err = 0;
autofs4_expire_wait(nd.path.dentry);
spin_lock(&sbi->fs_lock);
param->arg1 = ino->uid;
param->arg2 = ino->gid;
param->requester.uid = ino->uid;
param->requester.gid = ino->gid;
spin_unlock(&sbi->fs_lock);
}

Expand All @@ -529,7 +529,7 @@ static int autofs_dev_ioctl_expire(struct file *fp,
int err = -EAGAIN;
int how;

how = param->arg1;
how = param->expire.how;
mnt = fp->f_path.mnt;

if (sbi->type & AUTOFS_TYPE_TRIGGER)
Expand Down Expand Up @@ -565,9 +565,9 @@ static int autofs_dev_ioctl_askumount(struct file *fp,
struct autofs_sb_info *sbi,
struct autofs_dev_ioctl *param)
{
param->arg1 = 0;
param->askumount.may_umount = 0;
if (may_umount(fp->f_path.mnt))
param->arg1 = 1;
param->askumount.may_umount = 1;
return 0;
}

Expand Down Expand Up @@ -600,6 +600,7 @@ static int autofs_dev_ioctl_ismountpoint(struct file *fp,
struct nameidata nd;
const char *path;
unsigned int type;
unsigned int devid, magic;
int err = -ENOENT;

if (param->size <= sizeof(*param)) {
Expand All @@ -608,10 +609,10 @@ static int autofs_dev_ioctl_ismountpoint(struct file *fp,
}

path = param->path;
type = param->arg1;
type = param->ismountpoint.in.type;

param->arg1 = 0;
param->arg2 = 0;
param->ismountpoint.out.devid = devid = 0;
param->ismountpoint.out.magic = magic = 0;

if (!fp || param->ioctlfd == -1) {
if (type == AUTOFS_TYPE_ANY) {
Expand All @@ -622,7 +623,7 @@ static int autofs_dev_ioctl_ismountpoint(struct file *fp,
goto out;

sb = nd.path.dentry->d_sb;
param->arg1 = new_encode_dev(sb->s_dev);
devid = new_encode_dev(sb->s_dev);
} else {
struct autofs_info *ino;

Expand All @@ -635,14 +636,14 @@ static int autofs_dev_ioctl_ismountpoint(struct file *fp,
goto out_release;

ino = autofs4_dentry_ino(nd.path.dentry);
param->arg1 = autofs4_get_dev(ino->sbi);
devid = autofs4_get_dev(ino->sbi);
}

err = 0;
if (nd.path.dentry->d_inode &&
nd.path.mnt->mnt_root == nd.path.dentry) {
err = 1;
param->arg2 = nd.path.dentry->d_inode->i_sb->s_magic;
magic = nd.path.dentry->d_inode->i_sb->s_magic;
}
} else {
dev_t devid = new_encode_dev(sbi->sb->s_dev);
Expand All @@ -655,18 +656,21 @@ static int autofs_dev_ioctl_ismountpoint(struct file *fp,
if (err)
goto out_release;

param->arg1 = autofs4_get_dev(sbi);
devid = autofs4_get_dev(sbi);

err = have_submounts(nd.path.dentry);

if (nd.path.mnt->mnt_mountpoint != nd.path.mnt->mnt_root) {
if (follow_down(&nd.path.mnt, &nd.path.dentry)) {
struct inode *inode = nd.path.dentry->d_inode;
param->arg2 = inode->i_sb->s_magic;
magic = inode->i_sb->s_magic;
}
}
}

param->ismountpoint.out.devid = devid;
param->ismountpoint.out.magic = magic;

out_release:
path_put(&nd.path);
out:
Expand Down
75 changes: 71 additions & 4 deletions trunk/include/linux/auto_dev-ioctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#ifndef _LINUX_AUTO_DEV_IOCTL_H
#define _LINUX_AUTO_DEV_IOCTL_H

#include <linux/string.h>
#include <linux/types.h>

#define AUTOFS_DEVICE_NAME "autofs"
Expand All @@ -25,6 +26,60 @@
* An ioctl interface for autofs mount point control.
*/

struct args_protover {
__u32 version;
};

struct args_protosubver {
__u32 sub_version;
};

struct args_openmount {
__u32 devid;
};

struct args_ready {
__u32 token;
};

struct args_fail {
__u32 token;
__s32 status;
};

struct args_setpipefd {
__s32 pipefd;
};

struct args_timeout {
__u64 timeout;
};

struct args_requester {
__u32 uid;
__u32 gid;
};

struct args_expire {
__u32 how;
};

struct args_askumount {
__u32 may_umount;
};

struct args_ismountpoint {
union {
struct args_in {
__u32 type;
} in;
struct args_out {
__u32 devid;
__u32 magic;
} out;
};
};

/*
* All the ioctls use this structure.
* When sending a path size must account for the total length
Expand All @@ -39,20 +94,32 @@ struct autofs_dev_ioctl {
* including this struct */
__s32 ioctlfd; /* automount command fd */

__u32 arg1; /* Command parameters */
__u32 arg2;
/* Command parameters */

union {
struct args_protover protover;
struct args_protosubver protosubver;
struct args_openmount openmount;
struct args_ready ready;
struct args_fail fail;
struct args_setpipefd setpipefd;
struct args_timeout timeout;
struct args_requester requester;
struct args_expire expire;
struct args_askumount askumount;
struct args_ismountpoint ismountpoint;
};

char path[0];
};

static inline void init_autofs_dev_ioctl(struct autofs_dev_ioctl *in)
{
memset(in, 0, sizeof(struct autofs_dev_ioctl));
in->ver_major = AUTOFS_DEV_IOCTL_VERSION_MAJOR;
in->ver_minor = AUTOFS_DEV_IOCTL_VERSION_MINOR;
in->size = sizeof(struct autofs_dev_ioctl);
in->ioctlfd = -1;
in->arg1 = 0;
in->arg2 = 0;
return;
}

Expand Down

0 comments on commit 988a364

Please sign in to comment.