소스 검색

tty_ioctl: soft carrier handling

First cut at moving the soft carrier handling knowledge entirely into the core
code.  One or two drivers still needed to snoop these functions to track
CLOCAL internally.  Instead make TIOCSSOFTCAR generate the same driver calls
as other termios ioctls changing the clocal flag.  This allows us to remove
any driver knowledge and special casing.  Also while we are at it we can fix
the error handling.

Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Alan Cox 17 년 전
부모
커밋
1c2630ccf9
1개의 변경된 파일27개의 추가작업 그리고 6개의 파일을 삭제
  1. 27 6
      drivers/char/tty_ioctl.c

+ 27 - 6
drivers/char/tty_ioctl.c

@@ -755,6 +755,32 @@ static int send_prio_char(struct tty_struct *tty, char ch)
 	return 0;
 	return 0;
 }
 }
 
 
+/**
+ *	tty_change_softcar	-	carrier change ioctl helper
+ *	@tty: tty to update
+ *	@arg: enable/disable CLOCAL
+ *
+ *	Perform a change to the CLOCAL state and call into the driver
+ *	layer to make it visible. All done with the termios mutex
+ */
+
+static int tty_change_softcar(struct tty_struct *tty, int arg)
+{
+	int ret = 0;
+	int bit = arg ? CLOCAL : 0;
+	struct ktermios old = *tty->termios;
+
+	mutex_lock(&tty->termios_mutex);
+	tty->termios->c_cflag &= ~CLOCAL;
+	tty->termios->c_cflag |= bit;
+	if (tty->driver->set_termios)
+		tty->driver->set_termios(tty, &old);
+	if ((tty->termios->c_cflag & CLOCAL) != bit)
+		ret = -EINVAL;
+	mutex_unlock(&tty->termios_mutex);
+	return ret;
+}
+
 /**
 /**
  *	tty_mode_ioctl		-	mode related ioctls
  *	tty_mode_ioctl		-	mode related ioctls
  *	@tty: tty for the ioctl
  *	@tty: tty for the ioctl
@@ -865,12 +891,7 @@ int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
 	case TIOCSSOFTCAR:
 	case TIOCSSOFTCAR:
 		if (get_user(arg, (unsigned int __user *) arg))
 		if (get_user(arg, (unsigned int __user *) arg))
 			return -EFAULT;
 			return -EFAULT;
-		mutex_lock(&tty->termios_mutex);
-		tty->termios->c_cflag =
-			((tty->termios->c_cflag & ~CLOCAL) |
-			 (arg ? CLOCAL : 0));
-		mutex_unlock(&tty->termios_mutex);
-		return 0;
+		return tty_change_softcar(tty, arg);
 	default:
 	default:
 		return -ENOIOCTLCMD;
 		return -ENOIOCTLCMD;
 	}
 	}