1/* 2 * Copyright 2008 Red Hat, Inc. All rights reserved. 3 * Copyright 2008 Ian Kent <raven@themaw.net> 4 * 5 * This file is part of the Linux kernel and is made available under 6 * the terms of the GNU General Public License, version 2, or at your 7 * option, any later version, incorporated herein by reference. 8 */ 9 10#include <linux/module.h> 11#include <linux/vmalloc.h> 12#include <linux/miscdevice.h> 13#include <linux/init.h> 14#include <linux/wait.h> 15#include <linux/namei.h> 16#include <linux/fcntl.h> 17#include <linux/file.h> 18#include <linux/fdtable.h> 19#include <linux/sched.h> 20#include <linux/compat.h> 21#include <linux/syscalls.h> 22#include <linux/magic.h> 23#include <linux/dcache.h> 24#include <linux/uaccess.h> 25#include <linux/slab.h> 26 27#include "autofs_i.h" 28 29/* 30 * This module implements an interface for routing autofs ioctl control 31 * commands via a miscellaneous device file. 32 * 33 * The alternate interface is needed because we need to be able open 34 * an ioctl file descriptor on an autofs mount that may be covered by 35 * another mount. This situation arises when starting automount(8) 36 * or other user space daemon which uses direct mounts or offset 37 * mounts (used for autofs lazy mount/umount of nested mount trees), 38 * which have been left busy at at service shutdown. 39 */ 40 41#define AUTOFS_DEV_IOCTL_SIZE sizeof(struct autofs_dev_ioctl) 42 43typedef int (*ioctl_fn)(struct file *, struct autofs_sb_info *, 44 struct autofs_dev_ioctl *); 45 46static int check_name(const char *name) 47{ 48 if (!strchr(name, '/')) 49 return -EINVAL; 50 return 0; 51} 52 53/* 54 * Check a string doesn't overrun the chunk of 55 * memory we copied from user land. 56 */ 57static int invalid_str(char *str, size_t size) 58{ 59 if (memchr(str, 0, size)) 60 return 0; 61 return -EINVAL; 62} 63 64/* 65 * Check that the user compiled against correct version of autofs 66 * misc device code. 67 * 68 * As well as checking the version compatibility this always copies 69 * the kernel interface version out. 70 */ 71static int check_dev_ioctl_version(int cmd, struct autofs_dev_ioctl *param) 72{ 73 int err = 0; 74 75 if ((AUTOFS_DEV_IOCTL_VERSION_MAJOR != param->ver_major) || 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)", 79 AUTOFS_DEV_IOCTL_VERSION_MAJOR, 80 AUTOFS_DEV_IOCTL_VERSION_MINOR, 81 param->ver_major, param->ver_minor, cmd); 82 err = -EINVAL; 83 } 84 85 /* Fill in the kernel version. */ 86 param->ver_major = AUTOFS_DEV_IOCTL_VERSION_MAJOR; 87 param->ver_minor = AUTOFS_DEV_IOCTL_VERSION_MINOR; 88 89 return err; 90} 91 92/* 93 * Copy parameter control struct, including a possible path allocated 94 * at the end of the struct. 95 */ 96static struct autofs_dev_ioctl *copy_dev_ioctl(struct autofs_dev_ioctl __user *in) 97{ 98 struct autofs_dev_ioctl tmp, *res; 99 100 if (copy_from_user(&tmp, in, sizeof(tmp))) 101 return ERR_PTR(-EFAULT); 102 103 if (tmp.size < sizeof(tmp)) 104 return ERR_PTR(-EINVAL); 105 106 if (tmp.size > (PATH_MAX + sizeof(tmp))) 107 return ERR_PTR(-ENAMETOOLONG); 108 109 res = memdup_user(in, tmp.size); 110 if (!IS_ERR(res)) 111 res->size = tmp.size; 112 113 return res; 114} 115 116static inline void free_dev_ioctl(struct autofs_dev_ioctl *param) 117{ 118 kfree(param); 119 return; 120} 121 122/* 123 * Check sanity of parameter control fields and if a path is present 124 * check that it is terminated and contains at least one "/". 125 */ 126static int validate_dev_ioctl(int cmd, struct autofs_dev_ioctl *param) 127{ 128 int err; 129 130 err = check_dev_ioctl_version(cmd, param); 131 if (err) { 132 AUTOFS_WARN("invalid device control module version " 133 "supplied for cmd(0x%08x)", cmd); 134 goto out; 135 } 136 137 if (param->size > sizeof(*param)) { 138 err = invalid_str(param->path, param->size - sizeof(*param)); 139 if (err) { 140 AUTOFS_WARN( 141 "path string terminator missing for cmd(0x%08x)", 142 cmd); 143 goto out; 144 } 145 146 err = check_name(param->path); 147 if (err) { 148 AUTOFS_WARN("invalid path supplied for cmd(0x%08x)", 149 cmd); 150 goto out; 151 } 152 } 153 154 err = 0; 155out: 156 return err; 157} 158 159/* 160 * Get the autofs super block info struct from the file opened on 161 * the autofs mount point. 162 */ 163static struct autofs_sb_info *autofs_dev_ioctl_sbi(struct file *f) 164{ 165 struct autofs_sb_info *sbi = NULL; 166 struct inode *inode; 167 168 if (f) { 169 inode = file_inode(f); 170 sbi = autofs4_sbi(inode->i_sb); 171 } 172 return sbi; 173} 174 175/* Return autofs module protocol version */ 176static int autofs_dev_ioctl_protover(struct file *fp, 177 struct autofs_sb_info *sbi, 178 struct autofs_dev_ioctl *param) 179{ 180 param->protover.version = sbi->version; 181 return 0; 182} 183 184/* Return autofs module protocol sub version */ 185static int autofs_dev_ioctl_protosubver(struct file *fp, 186 struct autofs_sb_info *sbi, 187 struct autofs_dev_ioctl *param) 188{ 189 param->protosubver.sub_version = sbi->sub_version; 190 return 0; 191} 192 193/* Find the topmost mount satisfying test() */ 194static int find_autofs_mount(const char *pathname, 195 struct path *res, 196 int test(struct path *path, void *data), 197 void *data) 198{ 199 struct path path; 200 int err = kern_path_mountpoint(AT_FDCWD, pathname, &path, 0); 201 if (err) 202 return err; 203 err = -ENOENT; 204 while (path.dentry == path.mnt->mnt_root) { 205 if (path.dentry->d_sb->s_magic == AUTOFS_SUPER_MAGIC) { 206 if (test(&path, data)) { 207 path_get(&path); 208 *res = path; 209 err = 0; 210 break; 211 } 212 } 213 if (!follow_up(&path)) 214 break; 215 } 216 path_put(&path); 217 return err; 218} 219 220static int test_by_dev(struct path *path, void *p) 221{ 222 return path->dentry->d_sb->s_dev == *(dev_t *)p; 223} 224 225static int test_by_type(struct path *path, void *p) 226{ 227 struct autofs_info *ino = autofs4_dentry_ino(path->dentry); 228 return ino && ino->sbi->type & *(unsigned *)p; 229} 230 231/* 232 * Open a file descriptor on the autofs mount point corresponding 233 * to the given path and device number (aka. new_encode_dev(sb->s_dev)). 234 */ 235static int autofs_dev_ioctl_open_mountpoint(const char *name, dev_t devid) 236{ 237 int err, fd; 238 239 fd = get_unused_fd_flags(O_CLOEXEC); 240 if (likely(fd >= 0)) { 241 struct file *filp; 242 struct path path; 243 244 err = find_autofs_mount(name, &path, test_by_dev, &devid); 245 if (err) 246 goto out; 247 248 /* 249 * Find autofs super block that has the device number 250 * corresponding to the autofs fs we want to open. 251 */ 252 253 filp = dentry_open(&path, O_RDONLY, current_cred()); 254 path_put(&path); 255 if (IS_ERR(filp)) { 256 err = PTR_ERR(filp); 257 goto out; 258 } 259 260 fd_install(fd, filp); 261 } 262 263 return fd; 264 265out: 266 put_unused_fd(fd); 267 return err; 268} 269 270/* Open a file descriptor on an autofs mount point */ 271static int autofs_dev_ioctl_openmount(struct file *fp, 272 struct autofs_sb_info *sbi, 273 struct autofs_dev_ioctl *param) 274{ 275 const char *path; 276 dev_t devid; 277 int err, fd; 278 279 /* param->path has already been checked */ 280 if (!param->openmount.devid) 281 return -EINVAL; 282 283 param->ioctlfd = -1; 284 285 path = param->path; 286 devid = new_decode_dev(param->openmount.devid); 287 288 err = 0; 289 fd = autofs_dev_ioctl_open_mountpoint(path, devid); 290 if (unlikely(fd < 0)) { 291 err = fd; 292 goto out; 293 } 294 295 param->ioctlfd = fd; 296out: 297 return err; 298} 299 300/* Close file descriptor allocated above (user can also use close(2)). */ 301static int autofs_dev_ioctl_closemount(struct file *fp, 302 struct autofs_sb_info *sbi, 303 struct autofs_dev_ioctl *param) 304{ 305 return sys_close(param->ioctlfd); 306} 307 308/* 309 * Send "ready" status for an existing wait (either a mount or an expire 310 * request). 311 */ 312static int autofs_dev_ioctl_ready(struct file *fp, 313 struct autofs_sb_info *sbi, 314 struct autofs_dev_ioctl *param) 315{ 316 autofs_wqt_t token; 317 318 token = (autofs_wqt_t) param->ready.token; 319 return autofs4_wait_release(sbi, token, 0); 320} 321 322/* 323 * Send "fail" status for an existing wait (either a mount or an expire 324 * request). 325 */ 326static int autofs_dev_ioctl_fail(struct file *fp, 327 struct autofs_sb_info *sbi, 328 struct autofs_dev_ioctl *param) 329{ 330 autofs_wqt_t token; 331 int status; 332 333 token = (autofs_wqt_t) param->fail.token; 334 status = param->fail.status ? param->fail.status : -ENOENT; 335 return autofs4_wait_release(sbi, token, status); 336} 337 338/* 339 * Set the pipe fd for kernel communication to the daemon. 340 * 341 * Normally this is set at mount using an option but if we 342 * are reconnecting to a busy mount then we need to use this 343 * to tell the autofs mount about the new kernel pipe fd. In 344 * order to protect mounts against incorrectly setting the 345 * pipefd we also require that the autofs mount be catatonic. 346 * 347 * This also sets the process group id used to identify the 348 * controlling process (eg. the owning automount(8) daemon). 349 */ 350static int autofs_dev_ioctl_setpipefd(struct file *fp, 351 struct autofs_sb_info *sbi, 352 struct autofs_dev_ioctl *param) 353{ 354 int pipefd; 355 int err = 0; 356 struct pid *new_pid = NULL; 357 358 if (param->setpipefd.pipefd == -1) 359 return -EINVAL; 360 361 pipefd = param->setpipefd.pipefd; 362 363 mutex_lock(&sbi->wq_mutex); 364 if (!sbi->catatonic) { 365 mutex_unlock(&sbi->wq_mutex); 366 return -EBUSY; 367 } else { 368 struct file *pipe; 369 370 new_pid = get_task_pid(current, PIDTYPE_PGID); 371 372 if (ns_of_pid(new_pid) != ns_of_pid(sbi->oz_pgrp)) { 373 AUTOFS_WARN("Not allowed to change PID namespace"); 374 err = -EINVAL; 375 goto out; 376 } 377 378 pipe = fget(pipefd); 379 if (!pipe) { 380 err = -EBADF; 381 goto out; 382 } 383 if (autofs_prepare_pipe(pipe) < 0) { 384 err = -EPIPE; 385 fput(pipe); 386 goto out; 387 } 388 swap(sbi->oz_pgrp, new_pid); 389 sbi->pipefd = pipefd; 390 sbi->pipe = pipe; 391 sbi->catatonic = 0; 392 } 393out: 394 put_pid(new_pid); 395 mutex_unlock(&sbi->wq_mutex); 396 return err; 397} 398 399/* 400 * Make the autofs mount point catatonic, no longer responsive to 401 * mount requests. Also closes the kernel pipe file descriptor. 402 */ 403static int autofs_dev_ioctl_catatonic(struct file *fp, 404 struct autofs_sb_info *sbi, 405 struct autofs_dev_ioctl *param) 406{ 407 autofs4_catatonic_mode(sbi); 408 return 0; 409} 410 411/* Set the autofs mount timeout */ 412static int autofs_dev_ioctl_timeout(struct file *fp, 413 struct autofs_sb_info *sbi, 414 struct autofs_dev_ioctl *param) 415{ 416 unsigned long timeout; 417 418 timeout = param->timeout.timeout; 419 param->timeout.timeout = sbi->exp_timeout / HZ; 420 sbi->exp_timeout = timeout * HZ; 421 return 0; 422} 423 424/* 425 * Return the uid and gid of the last request for the mount 426 * 427 * When reconstructing an autofs mount tree with active mounts 428 * we need to re-connect to mounts that may have used the original 429 * process uid and gid (or string variations of them) for mount 430 * lookups within the map entry. 431 */ 432static int autofs_dev_ioctl_requester(struct file *fp, 433 struct autofs_sb_info *sbi, 434 struct autofs_dev_ioctl *param) 435{ 436 struct autofs_info *ino; 437 struct path path; 438 dev_t devid; 439 int err = -ENOENT; 440 441 if (param->size <= sizeof(*param)) { 442 err = -EINVAL; 443 goto out; 444 } 445 446 devid = sbi->sb->s_dev; 447 448 param->requester.uid = param->requester.gid = -1; 449 450 err = find_autofs_mount(param->path, &path, test_by_dev, &devid); 451 if (err) 452 goto out; 453 454 ino = autofs4_dentry_ino(path.dentry); 455 if (ino) { 456 err = 0; 457 autofs4_expire_wait(path.dentry, 0); 458 spin_lock(&sbi->fs_lock); 459 param->requester.uid = from_kuid_munged(current_user_ns(), ino->uid); 460 param->requester.gid = from_kgid_munged(current_user_ns(), ino->gid); 461 spin_unlock(&sbi->fs_lock); 462 } 463 path_put(&path); 464out: 465 return err; 466} 467 468/* 469 * Call repeatedly until it returns -EAGAIN, meaning there's nothing 470 * more that can be done. 471 */ 472static int autofs_dev_ioctl_expire(struct file *fp, 473 struct autofs_sb_info *sbi, 474 struct autofs_dev_ioctl *param) 475{ 476 struct vfsmount *mnt; 477 int how; 478 479 how = param->expire.how; 480 mnt = fp->f_path.mnt; 481 482 return autofs4_do_expire_multi(sbi->sb, mnt, sbi, how); 483} 484 485/* Check if autofs mount point is in use */ 486static int autofs_dev_ioctl_askumount(struct file *fp, 487 struct autofs_sb_info *sbi, 488 struct autofs_dev_ioctl *param) 489{ 490 param->askumount.may_umount = 0; 491 if (may_umount(fp->f_path.mnt)) 492 param->askumount.may_umount = 1; 493 return 0; 494} 495 496/* 497 * Check if the given path is a mountpoint. 498 * 499 * If we are supplied with the file descriptor of an autofs 500 * mount we're looking for a specific mount. In this case 501 * the path is considered a mountpoint if it is itself a 502 * mountpoint or contains a mount, such as a multi-mount 503 * without a root mount. In this case we return 1 if the 504 * path is a mount point and the super magic of the covering 505 * mount if there is one or 0 if it isn't a mountpoint. 506 * 507 * If we aren't supplied with a file descriptor then we 508 * lookup the path and check if it is the root of a mount. 509 * If a type is given we are looking for a particular autofs 510 * mount and if we don't find a match we return fail. If the 511 * located path is the root of a mount we return 1 along with 512 * the super magic of the mount or 0 otherwise. 513 * 514 * In both cases the the device number (as returned by 515 * new_encode_dev()) is also returned. 516 */ 517static int autofs_dev_ioctl_ismountpoint(struct file *fp, 518 struct autofs_sb_info *sbi, 519 struct autofs_dev_ioctl *param) 520{ 521 struct path path; 522 const char *name; 523 unsigned int type; 524 unsigned int devid, magic; 525 int err = -ENOENT; 526 527 if (param->size <= sizeof(*param)) { 528 err = -EINVAL; 529 goto out; 530 } 531 532 name = param->path; 533 type = param->ismountpoint.in.type; 534 535 param->ismountpoint.out.devid = devid = 0; 536 param->ismountpoint.out.magic = magic = 0; 537 538 if (!fp || param->ioctlfd == -1) { 539 if (autofs_type_any(type)) 540 err = kern_path_mountpoint(AT_FDCWD, 541 name, &path, LOOKUP_FOLLOW); 542 else 543 err = find_autofs_mount(name, &path, 544 test_by_type, &type); 545 if (err) 546 goto out; 547 devid = new_encode_dev(path.dentry->d_sb->s_dev); 548 err = 0; 549 if (path.mnt->mnt_root == path.dentry) { 550 err = 1; 551 magic = path.dentry->d_sb->s_magic; 552 } 553 } else { 554 dev_t dev = sbi->sb->s_dev; 555 556 err = find_autofs_mount(name, &path, test_by_dev, &dev); 557 if (err) 558 goto out; 559 560 devid = new_encode_dev(dev); 561 562 err = have_submounts(path.dentry); 563 564 if (follow_down_one(&path)) 565 magic = path.dentry->d_sb->s_magic; 566 } 567 568 param->ismountpoint.out.devid = devid; 569 param->ismountpoint.out.magic = magic; 570 path_put(&path); 571out: 572 return err; 573} 574 575/* 576 * Our range of ioctl numbers isn't 0 based so we need to shift 577 * the array index by _IOC_NR(AUTOFS_CTL_IOC_FIRST) for the table 578 * lookup. 579 */ 580#define cmd_idx(cmd) (cmd - _IOC_NR(AUTOFS_DEV_IOCTL_IOC_FIRST)) 581 582static ioctl_fn lookup_dev_ioctl(unsigned int cmd) 583{ 584 static struct { 585 int cmd; 586 ioctl_fn fn; 587 } _ioctls[] = { 588 {cmd_idx(AUTOFS_DEV_IOCTL_VERSION_CMD), NULL}, 589 {cmd_idx(AUTOFS_DEV_IOCTL_PROTOVER_CMD), 590 autofs_dev_ioctl_protover}, 591 {cmd_idx(AUTOFS_DEV_IOCTL_PROTOSUBVER_CMD), 592 autofs_dev_ioctl_protosubver}, 593 {cmd_idx(AUTOFS_DEV_IOCTL_OPENMOUNT_CMD), 594 autofs_dev_ioctl_openmount}, 595 {cmd_idx(AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD), 596 autofs_dev_ioctl_closemount}, 597 {cmd_idx(AUTOFS_DEV_IOCTL_READY_CMD), 598 autofs_dev_ioctl_ready}, 599 {cmd_idx(AUTOFS_DEV_IOCTL_FAIL_CMD), 600 autofs_dev_ioctl_fail}, 601 {cmd_idx(AUTOFS_DEV_IOCTL_SETPIPEFD_CMD), 602 autofs_dev_ioctl_setpipefd}, 603 {cmd_idx(AUTOFS_DEV_IOCTL_CATATONIC_CMD), 604 autofs_dev_ioctl_catatonic}, 605 {cmd_idx(AUTOFS_DEV_IOCTL_TIMEOUT_CMD), 606 autofs_dev_ioctl_timeout}, 607 {cmd_idx(AUTOFS_DEV_IOCTL_REQUESTER_CMD), 608 autofs_dev_ioctl_requester}, 609 {cmd_idx(AUTOFS_DEV_IOCTL_EXPIRE_CMD), 610 autofs_dev_ioctl_expire}, 611 {cmd_idx(AUTOFS_DEV_IOCTL_ASKUMOUNT_CMD), 612 autofs_dev_ioctl_askumount}, 613 {cmd_idx(AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD), 614 autofs_dev_ioctl_ismountpoint} 615 }; 616 unsigned int idx = cmd_idx(cmd); 617 618 return (idx >= ARRAY_SIZE(_ioctls)) ? NULL : _ioctls[idx].fn; 619} 620 621/* ioctl dispatcher */ 622static int _autofs_dev_ioctl(unsigned int command, struct autofs_dev_ioctl __user *user) 623{ 624 struct autofs_dev_ioctl *param; 625 struct file *fp; 626 struct autofs_sb_info *sbi; 627 unsigned int cmd_first, cmd; 628 ioctl_fn fn = NULL; 629 int err = 0; 630 631 /* only root can play with this */ 632 if (!capable(CAP_SYS_ADMIN)) 633 return -EPERM; 634 635 cmd_first = _IOC_NR(AUTOFS_DEV_IOCTL_IOC_FIRST); 636 cmd = _IOC_NR(command); 637 638 if (_IOC_TYPE(command) != _IOC_TYPE(AUTOFS_DEV_IOCTL_IOC_FIRST) || 639 cmd - cmd_first >= AUTOFS_DEV_IOCTL_IOC_COUNT) { 640 return -ENOTTY; 641 } 642 643 /* Copy the parameters into kernel space. */ 644 param = copy_dev_ioctl(user); 645 if (IS_ERR(param)) 646 return PTR_ERR(param); 647 648 err = validate_dev_ioctl(command, param); 649 if (err) 650 goto out; 651 652 /* The validate routine above always sets the version */ 653 if (cmd == AUTOFS_DEV_IOCTL_VERSION_CMD) 654 goto done; 655 656 fn = lookup_dev_ioctl(cmd); 657 if (!fn) { 658 AUTOFS_WARN("unknown command 0x%08x", command); 659 return -ENOTTY; 660 } 661 662 fp = NULL; 663 sbi = NULL; 664 665 /* 666 * For obvious reasons the openmount can't have a file 667 * descriptor yet. We don't take a reference to the 668 * file during close to allow for immediate release. 669 */ 670 if (cmd != AUTOFS_DEV_IOCTL_OPENMOUNT_CMD && 671 cmd != AUTOFS_DEV_IOCTL_CLOSEMOUNT_CMD) { 672 fp = fget(param->ioctlfd); 673 if (!fp) { 674 if (cmd == AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD) 675 goto cont; 676 err = -EBADF; 677 goto out; 678 } 679 680 sbi = autofs_dev_ioctl_sbi(fp); 681 if (!sbi || sbi->magic != AUTOFS_SBI_MAGIC) { 682 err = -EINVAL; 683 fput(fp); 684 goto out; 685 } 686 687 /* 688 * Admin needs to be able to set the mount catatonic in 689 * order to be able to perform the re-open. 690 */ 691 if (!autofs4_oz_mode(sbi) && 692 cmd != AUTOFS_DEV_IOCTL_CATATONIC_CMD) { 693 err = -EACCES; 694 fput(fp); 695 goto out; 696 } 697 } 698cont: 699 err = fn(fp, sbi, param); 700 701 if (fp) 702 fput(fp); 703done: 704 if (err >= 0 && copy_to_user(user, param, AUTOFS_DEV_IOCTL_SIZE)) 705 err = -EFAULT; 706out: 707 free_dev_ioctl(param); 708 return err; 709} 710 711static long autofs_dev_ioctl(struct file *file, uint command, ulong u) 712{ 713 int err; 714 err = _autofs_dev_ioctl(command, (struct autofs_dev_ioctl __user *) u); 715 return (long) err; 716} 717 718#ifdef CONFIG_COMPAT 719static long autofs_dev_ioctl_compat(struct file *file, uint command, ulong u) 720{ 721 return (long) autofs_dev_ioctl(file, command, (ulong) compat_ptr(u)); 722} 723#else 724#define autofs_dev_ioctl_compat NULL 725#endif 726 727static const struct file_operations _dev_ioctl_fops = { 728 .unlocked_ioctl = autofs_dev_ioctl, 729 .compat_ioctl = autofs_dev_ioctl_compat, 730 .owner = THIS_MODULE, 731 .llseek = noop_llseek, 732}; 733 734static struct miscdevice _autofs_dev_ioctl_misc = { 735 .minor = AUTOFS_MINOR, 736 .name = AUTOFS_DEVICE_NAME, 737 .fops = &_dev_ioctl_fops 738}; 739 740MODULE_ALIAS_MISCDEV(AUTOFS_MINOR); 741MODULE_ALIAS("devname:autofs"); 742 743/* Register/deregister misc character device */ 744int __init autofs_dev_ioctl_init(void) 745{ 746 int r; 747 748 r = misc_register(&_autofs_dev_ioctl_misc); 749 if (r) { 750 AUTOFS_ERROR("misc_register failed for control device"); 751 return r; 752 } 753 754 return 0; 755} 756 757void autofs_dev_ioctl_exit(void) 758{ 759 misc_deregister(&_autofs_dev_ioctl_misc); 760 return; 761} 762 763