]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/autofs4/dev-ioctl.c
Merge branch 'topic/snd_card_new-err' into topic/atmel
[linux-2.6-omap-h63xx.git] / fs / autofs4 / dev-ioctl.c
index 63b7c7afe8df96172b1fe9a11bbf95e1c86c0e36..025e105bffea984495c1861aa00e731d979b6c4a 100644 (file)
@@ -124,7 +124,7 @@ static inline void free_dev_ioctl(struct autofs_dev_ioctl *param)
 
 /*
  * Check sanity of parameter control fields and if a path is present
- * check that it has a "/" and is terminated.
+ * check that it is terminated and contains at least one "/".
  */
 static int validate_dev_ioctl(int cmd, struct autofs_dev_ioctl *param)
 {
@@ -138,15 +138,16 @@ static int validate_dev_ioctl(int cmd, struct autofs_dev_ioctl *param)
        }
 
        if (param->size > sizeof(*param)) {
-               err = check_name(param->path);
+               err = invalid_str(param->path,
+                                (void *) ((size_t) param + param->size));
                if (err) {
-                       AUTOFS_WARN("invalid path supplied for cmd(0x%08x)",
-                                   cmd);
+                       AUTOFS_WARN(
+                         "path string terminator missing for cmd(0x%08x)",
+                         cmd);
                        goto out;
                }
 
-               err = invalid_str(param->path,
-                                (void *) ((size_t) param + param->size));
+               err = check_name(param->path);
                if (err) {
                        AUTOFS_WARN("invalid path supplied for cmd(0x%08x)",
                                    cmd);
@@ -180,7 +181,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;
 }
 
@@ -189,7 +190,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;
 }
 
@@ -335,13 +336,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);
@@ -373,7 +374,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);
 }
 
@@ -388,8 +389,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);
 }
 
@@ -412,10 +413,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) {
@@ -457,8 +458,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;
 }
@@ -489,7 +490,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);
@@ -505,8 +506,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);
        }
 
@@ -529,10 +530,10 @@ 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)
+       if (autofs_type_trigger(sbi->type))
                dentry = autofs4_expire_direct(sbi->sb, mnt, sbi, how);
        else
                dentry = autofs4_expire_indirect(sbi->sb, mnt, sbi, how);
@@ -565,9 +566,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;
 }
 
@@ -600,6 +601,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)) {
@@ -608,13 +610,13 @@ 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) {
+               if (autofs_type_any(type)) {
                        struct super_block *sb;
 
                        err = path_lookup(path, LOOKUP_FOLLOW, &nd);
@@ -622,7 +624,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;
 
@@ -635,38 +637,41 @@ 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);
+               dev_t dev = autofs4_get_dev(sbi);
 
                err = path_lookup(path, LOOKUP_PARENT, &nd);
                if (err)
                        goto out;
 
-               err = autofs_dev_ioctl_find_super(&nd, devid);
+               err = autofs_dev_ioctl_find_super(&nd, dev);
                if (err)
                        goto out_release;
 
-               param->arg1 = autofs4_get_dev(sbi);
+               devid = dev;
 
                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: