Commit 70be998c2b44f942f11383496622500136816acb
Committed by
David S. Miller
1 parent
c26aed40f4
Exists in
master
and in
4 other branches
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
net/x25/af_x25.c
... | ... | @@ -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 | } |