10 #include <linux/module.h>
14 #include <linux/wait.h>
16 #include <linux/fcntl.h>
19 #include <linux/sched.h>
22 #include <linux/magic.h>
25 #include <linux/slab.h>
41 #define AUTOFS_DEV_IOCTL_SIZE sizeof(struct autofs_dev_ioctl)
46 static int check_name(
const char *
name)
57 static int invalid_str(
char *
str,
size_t size)
76 (AUTOFS_DEV_IOCTL_VERSION_MINOR < param->
ver_minor)) {
77 AUTOFS_WARN(
"ioctl control interface version mismatch: "
78 "kernel(%u.%u), user(%u.%u), cmd(%d)",
103 if (
tmp.size <
sizeof(
tmp))
123 err = check_dev_ioctl_version(cmd, param);
125 AUTOFS_WARN(
"invalid device control module version "
126 "supplied for cmd(0x%08x)", cmd);
130 if (param->
size >
sizeof(*param)) {
131 err = invalid_str(param->
path, param->
size -
sizeof(*param));
134 "path string terminator missing for cmd(0x%08x)",
139 err = check_name(param->
path);
141 AUTOFS_WARN(
"invalid path supplied for cmd(0x%08x)",
162 inode = f->
f_path.dentry->d_inode;
163 sbi = autofs4_sbi(inode->
i_sb);
169 static int autofs_dev_ioctl_protover(
struct file *
fp,
178 static int autofs_dev_ioctl_protosubver(
struct file *
fp,
186 static int find_autofs_mount(
const char *
pathname,
196 while (path.
dentry == path.
mnt->mnt_root) {
198 if (
test(&path, data)) {
213 static int test_by_dev(
struct path *path,
void *
p)
218 static int test_by_type(
struct path *path,
void *
p)
221 return ino && ino->
sbi->type & *(
unsigned *)p;
228 static int autofs_dev_ioctl_open_mountpoint(
const char *
name,
dev_t devid)
237 err = find_autofs_mount(name, &path, test_by_dev, &devid);
264 static int autofs_dev_ioctl_openmount(
struct file *
fp,
279 devid = new_decode_dev(param->
openmount.devid);
282 fd = autofs_dev_ioctl_open_mountpoint(path, devid);
294 static int autofs_dev_ioctl_closemount(
struct file *fp,
305 static int autofs_dev_ioctl_ready(
struct file *fp,
319 static int autofs_dev_ioctl_fail(
struct file *fp,
343 static int autofs_dev_ioctl_setpipefd(
struct file *fp,
365 if (autofs_prepare_pipe(pipe) < 0) {
384 static int autofs_dev_ioctl_catatonic(
struct file *fp,
393 static int autofs_dev_ioctl_timeout(
struct file *fp,
399 timeout = param->
timeout.timeout;
413 static int autofs_dev_ioctl_requester(
struct file *fp,
422 if (param->
size <=
sizeof(*param)) {
427 devid = sbi->
sb->s_dev;
431 err = find_autofs_mount(param->
path, &path, test_by_dev, &devid);
435 ino = autofs4_dentry_ino(path.dentry);
453 static int autofs_dev_ioctl_expire(
struct file *fp,
467 static int autofs_dev_ioctl_askumount(
struct file *fp,
499 static int autofs_dev_ioctl_ismountpoint(
struct file *fp,
509 if (param->
size <=
sizeof(*param)) {
520 if (!fp || param->
ioctlfd == -1) {
521 if (autofs_type_any(type))
524 err = find_autofs_mount(name, &path, test_by_type, &type);
527 devid = new_encode_dev(path.dentry->d_sb->s_dev);
529 if (path.mnt->mnt_root == path.dentry) {
531 magic = path.dentry->d_sb->s_magic;
536 err = find_autofs_mount(name, &path, test_by_dev, &dev);
540 devid = new_encode_dev(dev);
545 magic = path.dentry->d_sb->s_magic;
560 #define cmd_idx(cmd) (cmd - _IOC_NR(AUTOFS_DEV_IOCTL_IOC_FIRST))
562 static ioctl_fn lookup_dev_ioctl(
unsigned int cmd)
570 autofs_dev_ioctl_protover},
572 autofs_dev_ioctl_protosubver},
574 autofs_dev_ioctl_openmount},
576 autofs_dev_ioctl_closemount},
578 autofs_dev_ioctl_ready},
580 autofs_dev_ioctl_fail},
582 autofs_dev_ioctl_setpipefd},
584 autofs_dev_ioctl_catatonic},
586 autofs_dev_ioctl_timeout},
588 autofs_dev_ioctl_requester},
590 autofs_dev_ioctl_expire},
592 autofs_dev_ioctl_askumount},
594 autofs_dev_ioctl_ismountpoint}
607 unsigned int cmd_first,
cmd;
624 param = copy_dev_ioctl(user);
626 return PTR_ERR(param);
628 err = validate_dev_ioctl(command, param);
636 fn = lookup_dev_ioctl(cmd);
666 sbi = autofs_dev_ioctl_sbi(fp);
677 if (!autofs4_oz_mode(sbi) &&
685 err =
fn(fp, sbi, param);
693 free_dev_ioctl(param);
710 #define autofs_dev_ioctl_compat NULL
720 static struct miscdevice _autofs_dev_ioctl_misc = {
723 .fops = &_dev_ioctl_fops
736 AUTOFS_ERROR(
"misc_register failed for control device");