Commit 70be998c2b44f942f11383496622500136816acb

Authored by andrew hendry
Committed by David S. Miller
1 parent c26aed40f4

X25: pushdown bkl in ioctls

Push down the bkl in the ioctls so they can be removed one at a time.

Signed-off-by: Andrew Hendry <andrew.hendry@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 38 additions and 3 deletions Side-by-side Diff

... ... @@ -1357,14 +1357,16 @@
1357 1357 void __user *argp = (void __user *)arg;
1358 1358 int rc;
1359 1359  
1360   - lock_kernel();
1361 1360 switch (cmd) {
1362 1361 case TIOCOUTQ: {
1363   - int amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
  1362 + int amount;
1364 1363  
  1364 + lock_kernel();
  1365 + amount = sk->sk_sndbuf - sk_wmem_alloc_get(sk);
1365 1366 if (amount < 0)
1366 1367 amount = 0;
1367 1368 rc = put_user(amount, (unsigned int __user *)argp);
  1369 + unlock_kernel();
1368 1370 break;
1369 1371 }
1370 1372  
1371 1373  
1372 1374  
1373 1375  
1374 1376  
1375 1377  
... ... @@ -1375,23 +1377,29 @@
1375 1377 * These two are safe on a single CPU system as
1376 1378 * only user tasks fiddle here
1377 1379 */
  1380 + lock_kernel();
1378 1381 if ((skb = skb_peek(&sk->sk_receive_queue)) != NULL)
1379 1382 amount = skb->len;
1380 1383 rc = put_user(amount, (unsigned int __user *)argp);
  1384 + unlock_kernel();
1381 1385 break;
1382 1386 }
1383 1387  
1384 1388 case SIOCGSTAMP:
1385 1389 rc = -EINVAL;
  1390 + lock_kernel();
1386 1391 if (sk)
1387 1392 rc = sock_get_timestamp(sk,
1388 1393 (struct timeval __user *)argp);
  1394 + unlock_kernel();
1389 1395 break;
1390 1396 case SIOCGSTAMPNS:
1391 1397 rc = -EINVAL;
  1398 + lock_kernel();
1392 1399 if (sk)
1393 1400 rc = sock_get_timestampns(sk,
1394 1401 (struct timespec __user *)argp);
  1402 + unlock_kernel();
1395 1403 break;
1396 1404 case SIOCGIFADDR:
1397 1405 case SIOCSIFADDR:
1398 1406  
1399 1407  
1400 1408  
1401 1409  
1402 1410  
1403 1411  
1404 1412  
1405 1413  
... ... @@ -1410,27 +1418,36 @@
1410 1418 rc = -EPERM;
1411 1419 if (!capable(CAP_NET_ADMIN))
1412 1420 break;
  1421 + lock_kernel();
1413 1422 rc = x25_route_ioctl(cmd, argp);
  1423 + unlock_kernel();
1414 1424 break;
1415 1425 case SIOCX25GSUBSCRIP:
  1426 + lock_kernel();
1416 1427 rc = x25_subscr_ioctl(cmd, argp);
  1428 + unlock_kernel();
1417 1429 break;
1418 1430 case SIOCX25SSUBSCRIP:
1419 1431 rc = -EPERM;
1420 1432 if (!capable(CAP_NET_ADMIN))
1421 1433 break;
  1434 + lock_kernel();
1422 1435 rc = x25_subscr_ioctl(cmd, argp);
  1436 + unlock_kernel();
1423 1437 break;
1424 1438 case SIOCX25GFACILITIES: {
1425 1439 struct x25_facilities fac = x25->facilities;
  1440 + lock_kernel();
1426 1441 rc = copy_to_user(argp, &fac,
1427 1442 sizeof(fac)) ? -EFAULT : 0;
  1443 + unlock_kernel();
1428 1444 break;
1429 1445 }
1430 1446  
1431 1447 case SIOCX25SFACILITIES: {
1432 1448 struct x25_facilities facilities;
1433 1449 rc = -EFAULT;
  1450 + lock_kernel();
1434 1451 if (copy_from_user(&facilities, argp,
1435 1452 sizeof(facilities)))
1436 1453 break;
1437 1454  
1438 1455  
... ... @@ -1466,12 +1483,15 @@
1466 1483 break;
1467 1484 x25->facilities = facilities;
1468 1485 rc = 0;
  1486 + unlock_kernel();
1469 1487 break;
1470 1488 }
1471 1489  
1472 1490 case SIOCX25GDTEFACILITIES: {
  1491 + lock_kernel();
1473 1492 rc = copy_to_user(argp, &x25->dte_facilities,
1474 1493 sizeof(x25->dte_facilities));
  1494 + unlock_kernel();
1475 1495 if (rc)
1476 1496 rc = -EFAULT;
1477 1497 break;
... ... @@ -1480,6 +1500,7 @@
1480 1500 case SIOCX25SDTEFACILITIES: {
1481 1501 struct x25_dte_facilities dtefacs;
1482 1502 rc = -EFAULT;
  1503 + lock_kernel();
1483 1504 if (copy_from_user(&dtefacs, argp, sizeof(dtefacs)))
1484 1505 break;
1485 1506 rc = -EINVAL;
1486 1507  
1487 1508  
... ... @@ -1496,13 +1517,16 @@
1496 1517 break;
1497 1518 x25->dte_facilities = dtefacs;
1498 1519 rc = 0;
  1520 + unlock_kernel();
1499 1521 break;
1500 1522 }
1501 1523  
1502 1524 case SIOCX25GCALLUSERDATA: {
1503 1525 struct x25_calluserdata cud = x25->calluserdata;
  1526 + lock_kernel();
1504 1527 rc = copy_to_user(argp, &cud,
1505 1528 sizeof(cud)) ? -EFAULT : 0;
  1529 + unlock_kernel();
1506 1530 break;
1507 1531 }
1508 1532  
... ... @@ -1510,6 +1534,7 @@
1510 1534 struct x25_calluserdata calluserdata;
1511 1535  
1512 1536 rc = -EFAULT;
  1537 + lock_kernel();
1513 1538 if (copy_from_user(&calluserdata, argp,
1514 1539 sizeof(calluserdata)))
1515 1540 break;
1516 1541  
1517 1542  
1518 1543  
1519 1544  
... ... @@ -1517,24 +1542,29 @@
1517 1542 if (calluserdata.cudlength > X25_MAX_CUD_LEN)
1518 1543 break;
1519 1544 x25->calluserdata = calluserdata;
  1545 + unlock_kernel();
1520 1546 rc = 0;
1521 1547 break;
1522 1548 }
1523 1549  
1524 1550 case SIOCX25GCAUSEDIAG: {
1525 1551 struct x25_causediag causediag;
  1552 + lock_kernel();
1526 1553 causediag = x25->causediag;
1527 1554 rc = copy_to_user(argp, &causediag,
1528 1555 sizeof(causediag)) ? -EFAULT : 0;
  1556 + unlock_kernel();
1529 1557 break;
1530 1558 }
1531 1559  
1532 1560 case SIOCX25SCAUSEDIAG: {
1533 1561 struct x25_causediag causediag;
1534 1562 rc = -EFAULT;
  1563 + lock_kernel();
1535 1564 if (copy_from_user(&causediag, argp, sizeof(causediag)))
1536 1565 break;
1537 1566 x25->causediag = causediag;
  1567 + unlock_kernel();
1538 1568 rc = 0;
1539 1569 break;
1540 1570  
... ... @@ -1543,6 +1573,7 @@
1543 1573 case SIOCX25SCUDMATCHLEN: {
1544 1574 struct x25_subaddr sub_addr;
1545 1575 rc = -EINVAL;
  1576 + lock_kernel();
1546 1577 if(sk->sk_state != TCP_CLOSE)
1547 1578 break;
1548 1579 rc = -EFAULT;
1549 1580  
1550 1581  
1551 1582  
... ... @@ -1553,21 +1584,25 @@
1553 1584 if(sub_addr.cudmatchlength > X25_MAX_CUD_LEN)
1554 1585 break;
1555 1586 x25->cudmatchlength = sub_addr.cudmatchlength;
  1587 + unlock_kernel();
1556 1588 rc = 0;
1557 1589 break;
1558 1590 }
1559 1591  
1560 1592 case SIOCX25CALLACCPTAPPRV: {
1561 1593 rc = -EINVAL;
  1594 + lock_kernel();
1562 1595 if (sk->sk_state != TCP_CLOSE)
1563 1596 break;
1564 1597 clear_bit(X25_ACCPT_APPRV_FLAG, &x25->flags);
  1598 + unlock_kernel();
1565 1599 rc = 0;
1566 1600 break;
1567 1601 }
1568 1602  
1569 1603 case SIOCX25SENDCALLACCPT: {
1570 1604 rc = -EINVAL;
  1605 + lock_kernel();
1571 1606 if (sk->sk_state != TCP_ESTABLISHED)
1572 1607 break;
1573 1608 /* must call accptapprv above */
... ... @@ -1575,6 +1610,7 @@
1575 1610 break;
1576 1611 x25_write_internal(sk, X25_CALL_ACCEPTED);
1577 1612 x25->state = X25_STATE_3;
  1613 + unlock_kernel();
1578 1614 rc = 0;
1579 1615 break;
1580 1616 }
... ... @@ -1583,7 +1619,6 @@
1583 1619 rc = -ENOIOCTLCMD;
1584 1620 break;
1585 1621 }
1586   - unlock_kernel();
1587 1622  
1588 1623 return rc;
1589 1624 }