Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ceph: adding new return type vm_fault_t

Use new return type vm_fault_t for page_mkwrite
and fault handler.

Signed-off-by: Souptick Joarder <jrdr.linux@gmail.com>
Reviewed-by: Matthew Wilcox <mawilcox@microsoft.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>

authored by

Souptick Joarder and committed by
Ilya Dryomov
24499847 f7e52d8e

+32 -30
+32 -30
fs/ceph/addr.c
··· 1429 1429 /* 1430 1430 * vm ops 1431 1431 */ 1432 - static int ceph_filemap_fault(struct vm_fault *vmf) 1432 + static vm_fault_t ceph_filemap_fault(struct vm_fault *vmf) 1433 1433 { 1434 1434 struct vm_area_struct *vma = vmf->vma; 1435 1435 struct inode *inode = file_inode(vma->vm_file); ··· 1437 1437 struct ceph_file_info *fi = vma->vm_file->private_data; 1438 1438 struct page *pinned_page = NULL; 1439 1439 loff_t off = vmf->pgoff << PAGE_SHIFT; 1440 - int want, got, ret; 1440 + int want, got, err; 1441 1441 sigset_t oldset; 1442 + vm_fault_t ret = VM_FAULT_SIGBUS; 1442 1443 1443 1444 ceph_block_sigs(&oldset); 1444 1445 ··· 1451 1450 want = CEPH_CAP_FILE_CACHE; 1452 1451 1453 1452 got = 0; 1454 - ret = ceph_get_caps(ci, CEPH_CAP_FILE_RD, want, -1, &got, &pinned_page); 1455 - if (ret < 0) 1453 + err = ceph_get_caps(ci, CEPH_CAP_FILE_RD, want, -1, &got, &pinned_page); 1454 + if (err < 0) 1456 1455 goto out_restore; 1457 1456 1458 1457 dout("filemap_fault %p %llu~%zd got cap refs on %s\n", ··· 1464 1463 ceph_add_rw_context(fi, &rw_ctx); 1465 1464 ret = filemap_fault(vmf); 1466 1465 ceph_del_rw_context(fi, &rw_ctx); 1466 + dout("filemap_fault %p %llu~%zd drop cap refs %s ret %x\n", 1467 + inode, off, (size_t)PAGE_SIZE, 1468 + ceph_cap_string(got), ret); 1467 1469 } else 1468 - ret = -EAGAIN; 1470 + err = -EAGAIN; 1469 1471 1470 - dout("filemap_fault %p %llu~%zd dropping cap refs on %s ret %d\n", 1471 - inode, off, (size_t)PAGE_SIZE, ceph_cap_string(got), ret); 1472 1472 if (pinned_page) 1473 1473 put_page(pinned_page); 1474 1474 ceph_put_cap_refs(ci, got); 1475 1475 1476 - if (ret != -EAGAIN) 1476 + if (err != -EAGAIN) 1477 1477 goto out_restore; 1478 1478 1479 1479 /* read inline data */ ··· 1482 1480 /* does not support inline data > PAGE_SIZE */ 1483 1481 ret = VM_FAULT_SIGBUS; 1484 1482 } else { 1485 - int ret1; 1486 1483 struct address_space *mapping = inode->i_mapping; 1487 1484 struct page *page = find_or_create_page(mapping, 0, 1488 1485 mapping_gfp_constraint(mapping, ··· 1490 1489 ret = VM_FAULT_OOM; 1491 1490 goto out_inline; 1492 1491 } 1493 - ret1 = __ceph_do_getattr(inode, page, 1492 + err = __ceph_do_getattr(inode, page, 1494 1493 CEPH_STAT_CAP_INLINE_DATA, true); 1495 - if (ret1 < 0 || off >= i_size_read(inode)) { 1494 + if (err < 0 || off >= i_size_read(inode)) { 1496 1495 unlock_page(page); 1497 1496 put_page(page); 1498 - if (ret1 < 0) 1499 - ret = ret1; 1497 + if (err == -ENOMEM) 1498 + ret = VM_FAULT_OOM; 1500 1499 else 1501 1500 ret = VM_FAULT_SIGBUS; 1502 1501 goto out_inline; 1503 1502 } 1504 - if (ret1 < PAGE_SIZE) 1505 - zero_user_segment(page, ret1, PAGE_SIZE); 1503 + if (err < PAGE_SIZE) 1504 + zero_user_segment(page, err, PAGE_SIZE); 1506 1505 else 1507 1506 flush_dcache_page(page); 1508 1507 SetPageUptodate(page); 1509 1508 vmf->page = page; 1510 1509 ret = VM_FAULT_MAJOR | VM_FAULT_LOCKED; 1511 1510 out_inline: 1512 - dout("filemap_fault %p %llu~%zd read inline data ret %d\n", 1511 + dout("filemap_fault %p %llu~%zd read inline data ret %x\n", 1513 1512 inode, off, (size_t)PAGE_SIZE, ret); 1514 1513 } 1515 1514 out_restore: 1516 1515 ceph_restore_sigs(&oldset); 1517 - if (ret < 0) 1518 - ret = (ret == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS; 1516 + if (err < 0) 1517 + ret = vmf_error(err); 1519 1518 1520 1519 return ret; 1521 1520 } ··· 1523 1522 /* 1524 1523 * Reuse write_begin here for simplicity. 1525 1524 */ 1526 - static int ceph_page_mkwrite(struct vm_fault *vmf) 1525 + static vm_fault_t ceph_page_mkwrite(struct vm_fault *vmf) 1527 1526 { 1528 1527 struct vm_area_struct *vma = vmf->vma; 1529 1528 struct inode *inode = file_inode(vma->vm_file); ··· 1534 1533 loff_t off = page_offset(page); 1535 1534 loff_t size = i_size_read(inode); 1536 1535 size_t len; 1537 - int want, got, ret; 1536 + int want, got, err; 1538 1537 sigset_t oldset; 1538 + vm_fault_t ret = VM_FAULT_SIGBUS; 1539 1539 1540 1540 prealloc_cf = ceph_alloc_cap_flush(); 1541 1541 if (!prealloc_cf) ··· 1550 1548 lock_page(page); 1551 1549 locked_page = page; 1552 1550 } 1553 - ret = ceph_uninline_data(vma->vm_file, locked_page); 1551 + err = ceph_uninline_data(vma->vm_file, locked_page); 1554 1552 if (locked_page) 1555 1553 unlock_page(locked_page); 1556 - if (ret < 0) 1554 + if (err < 0) 1557 1555 goto out_free; 1558 1556 } 1559 1557 ··· 1570 1568 want = CEPH_CAP_FILE_BUFFER; 1571 1569 1572 1570 got = 0; 1573 - ret = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, off + len, 1571 + err = ceph_get_caps(ci, CEPH_CAP_FILE_WR, want, off + len, 1574 1572 &got, NULL); 1575 - if (ret < 0) 1573 + if (err < 0) 1576 1574 goto out_free; 1577 1575 1578 1576 dout("page_mkwrite %p %llu~%zd got cap refs on %s\n", ··· 1590 1588 break; 1591 1589 } 1592 1590 1593 - ret = ceph_update_writeable_page(vma->vm_file, off, len, page); 1594 - if (ret >= 0) { 1591 + err = ceph_update_writeable_page(vma->vm_file, off, len, page); 1592 + if (err >= 0) { 1595 1593 /* success. we'll keep the page locked. */ 1596 1594 set_page_dirty(page); 1597 1595 ret = VM_FAULT_LOCKED; 1598 1596 } 1599 - } while (ret == -EAGAIN); 1597 + } while (err == -EAGAIN); 1600 1598 1601 1599 if (ret == VM_FAULT_LOCKED || 1602 1600 ci->i_inline_version != CEPH_INLINE_NONE) { ··· 1610 1608 __mark_inode_dirty(inode, dirty); 1611 1609 } 1612 1610 1613 - dout("page_mkwrite %p %llu~%zd dropping cap refs on %s ret %d\n", 1611 + dout("page_mkwrite %p %llu~%zd dropping cap refs on %s ret %x\n", 1614 1612 inode, off, len, ceph_cap_string(got), ret); 1615 1613 ceph_put_cap_refs(ci, got); 1616 1614 out_free: 1617 1615 ceph_restore_sigs(&oldset); 1618 1616 ceph_free_cap_flush(prealloc_cf); 1619 - if (ret < 0) 1620 - ret = (ret == -ENOMEM) ? VM_FAULT_OOM : VM_FAULT_SIGBUS; 1617 + if (err < 0) 1618 + ret = vmf_error(err); 1621 1619 return ret; 1622 1620 } 1623 1621