vserver 1.9.3
[linux-2.6.git] / fs / autofs / root.c
index 74ad37a..a1ab1c0 100644 (file)
@@ -238,9 +238,15 @@ static struct dentry *autofs_root_lookup(struct inode *dir, struct dentry *dentr
         * a signal. If so we can force a restart..
         */
        if (dentry->d_flags & DCACHE_AUTOFS_PENDING) {
+               /* See if we were interrupted */
                if (signal_pending(current)) {
-                       unlock_kernel();
-                       return ERR_PTR(-ERESTARTNOINTR);
+                       sigset_t *sigset = &current->pending.signal;
+                       if (sigismember (sigset, SIGKILL) ||
+                           sigismember (sigset, SIGQUIT) ||
+                           sigismember (sigset, SIGINT)) {
+                               unlock_kernel();
+                               return ERR_PTR(-ERESTARTNOINTR);
+                       }
                }
        }
        unlock_kernel();
@@ -468,7 +474,7 @@ static int autofs_root_mkdir(struct inode *dir, struct dentry *dentry, int mode)
 
 /* Get/set timeout ioctl() operation */
 static inline int autofs_get_set_timeout(struct autofs_sb_info *sbi,
-                                        unsigned long *p)
+                                        unsigned long __user *p)
 {
        unsigned long ntimeout;
 
@@ -485,7 +491,7 @@ static inline int autofs_get_set_timeout(struct autofs_sb_info *sbi,
 }
 
 /* Return protocol version */
-static inline int autofs_get_protover(int *p)
+static inline int autofs_get_protover(int __user *p)
 {
        return put_user(AUTOFS_PROTO_VERSION, p);
 }
@@ -494,7 +500,7 @@ static inline int autofs_get_protover(int *p)
 static inline int autofs_expire_run(struct super_block *sb,
                                    struct autofs_sb_info *sbi,
                                    struct vfsmount *mnt,
-                                   struct autofs_packet_expire *pkt_p)
+                                   struct autofs_packet_expire __user *pkt_p)
 {
        struct autofs_dir_ent *ent;
        struct autofs_packet_expire pkt;
@@ -526,6 +532,7 @@ static int autofs_root_ioctl(struct inode *inode, struct file *filp,
                             unsigned int cmd, unsigned long arg)
 {
        struct autofs_sb_info *sbi = autofs_sbi(inode->i_sb);
+       void __user *argp = (void __user *)arg;
 
        DPRINTK(("autofs_ioctl: cmd = 0x%08x, arg = 0x%08lx, sbi = %p, pgrp = %u\n",cmd,arg,sbi,process_group(current)));
 
@@ -545,12 +552,12 @@ static int autofs_root_ioctl(struct inode *inode, struct file *filp,
                autofs_catatonic_mode(sbi);
                return 0;
        case AUTOFS_IOC_PROTOVER: /* Get protocol version */
-               return autofs_get_protover((int *)arg);
+               return autofs_get_protover(argp);
        case AUTOFS_IOC_SETTIMEOUT:
-               return autofs_get_set_timeout(sbi,(unsigned long *)arg);
+               return autofs_get_set_timeout(sbi, argp);
        case AUTOFS_IOC_EXPIRE:
                return autofs_expire_run(inode->i_sb, sbi, filp->f_vfsmnt,
-                                        (struct autofs_packet_expire *)arg);
+                                        argp);
        default:
                return -ENOSYS;
        }