diff options
-rw-r--r-- | fs/nfs/nfs4trace.h | 56 | ||||
-rw-r--r-- | fs/nfs/pnfs.c | 38 | ||||
-rw-r--r-- | include/linux/nfs4.h | 14 |
3 files changed, 102 insertions, 6 deletions
diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 8704372ac38f..238925c1aafd 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h | |||
@@ -1442,6 +1442,62 @@ DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutcommit); | |||
1442 | DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutreturn); | 1442 | DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutreturn); |
1443 | DEFINE_NFS4_INODE_EVENT(nfs4_layoutreturn_on_close); | 1443 | DEFINE_NFS4_INODE_EVENT(nfs4_layoutreturn_on_close); |
1444 | 1444 | ||
1445 | #define show_pnfs_update_layout_reason(reason) \ | ||
1446 | __print_symbolic(reason, \ | ||
1447 | { PNFS_UPDATE_LAYOUT_UNKNOWN, "unknown" }, \ | ||
1448 | { PNFS_UPDATE_LAYOUT_NO_PNFS, "no pnfs" }, \ | ||
1449 | { PNFS_UPDATE_LAYOUT_RD_ZEROLEN, "read+zerolen" }, \ | ||
1450 | { PNFS_UPDATE_LAYOUT_MDSTHRESH, "mdsthresh" }, \ | ||
1451 | { PNFS_UPDATE_LAYOUT_NOMEM, "nomem" }, \ | ||
1452 | { PNFS_UPDATE_LAYOUT_BULK_RECALL, "bulk recall" }, \ | ||
1453 | { PNFS_UPDATE_LAYOUT_IO_TEST_FAIL, "io test fail" }, \ | ||
1454 | { PNFS_UPDATE_LAYOUT_FOUND_CACHED, "found cached" }, \ | ||
1455 | { PNFS_UPDATE_LAYOUT_RETURN, "layoutreturn" }, \ | ||
1456 | { PNFS_UPDATE_LAYOUT_BLOCKED, "layouts blocked" }, \ | ||
1457 | { PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET, "sent layoutget" }) | ||
1458 | |||
1459 | TRACE_EVENT(pnfs_update_layout, | ||
1460 | TP_PROTO(struct inode *inode, | ||
1461 | loff_t pos, | ||
1462 | u64 count, | ||
1463 | enum pnfs_iomode iomode, | ||
1464 | struct pnfs_layout_segment *lseg, | ||
1465 | enum pnfs_update_layout_reason reason | ||
1466 | ), | ||
1467 | TP_ARGS(inode, pos, count, iomode, lseg, reason), | ||
1468 | TP_STRUCT__entry( | ||
1469 | __field(dev_t, dev) | ||
1470 | __field(u64, fileid) | ||
1471 | __field(u32, fhandle) | ||
1472 | __field(loff_t, pos) | ||
1473 | __field(u64, count) | ||
1474 | __field(enum pnfs_iomode, iomode) | ||
1475 | __field(struct pnfs_layout_segment *, lseg) | ||
1476 | __field(enum pnfs_update_layout_reason, reason) | ||
1477 | ), | ||
1478 | TP_fast_assign( | ||
1479 | __entry->dev = inode->i_sb->s_dev; | ||
1480 | __entry->fileid = NFS_FILEID(inode); | ||
1481 | __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); | ||
1482 | __entry->pos = pos; | ||
1483 | __entry->count = count; | ||
1484 | __entry->iomode = iomode; | ||
1485 | __entry->lseg = lseg; | ||
1486 | __entry->reason = reason; | ||
1487 | ), | ||
1488 | TP_printk( | ||
1489 | "fileid=%02x:%02x:%llu fhandle=0x%08x " | ||
1490 | "iomode=%s pos=%llu count=%llu lseg=%p (%s)", | ||
1491 | MAJOR(__entry->dev), MINOR(__entry->dev), | ||
1492 | (unsigned long long)__entry->fileid, | ||
1493 | __entry->fhandle, | ||
1494 | show_pnfs_iomode(__entry->iomode), | ||
1495 | (unsigned long long)__entry->pos, | ||
1496 | (unsigned long long)__entry->count, __entry->lseg, | ||
1497 | show_pnfs_update_layout_reason(__entry->reason) | ||
1498 | ) | ||
1499 | ); | ||
1500 | |||
1445 | #endif /* CONFIG_NFS_V4_1 */ | 1501 | #endif /* CONFIG_NFS_V4_1 */ |
1446 | 1502 | ||
1447 | #endif /* _TRACE_NFS4_H */ | 1503 | #endif /* _TRACE_NFS4_H */ |
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index bec0384499f7..1489065bb051 100644 --- a/fs/nfs/pnfs.c +++ b/fs/nfs/pnfs.c | |||
@@ -1520,14 +1520,23 @@ pnfs_update_layout(struct inode *ino, | |||
1520 | struct pnfs_layout_segment *lseg = NULL; | 1520 | struct pnfs_layout_segment *lseg = NULL; |
1521 | bool first; | 1521 | bool first; |
1522 | 1522 | ||
1523 | if (!pnfs_enabled_sb(NFS_SERVER(ino))) | 1523 | if (!pnfs_enabled_sb(NFS_SERVER(ino))) { |
1524 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1525 | PNFS_UPDATE_LAYOUT_NO_PNFS); | ||
1524 | goto out; | 1526 | goto out; |
1527 | } | ||
1525 | 1528 | ||
1526 | if (iomode == IOMODE_READ && i_size_read(ino) == 0) | 1529 | if (iomode == IOMODE_READ && i_size_read(ino) == 0) { |
1530 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1531 | PNFS_UPDATE_LAYOUT_RD_ZEROLEN); | ||
1527 | goto out; | 1532 | goto out; |
1533 | } | ||
1528 | 1534 | ||
1529 | if (pnfs_within_mdsthreshold(ctx, ino, iomode)) | 1535 | if (pnfs_within_mdsthreshold(ctx, ino, iomode)) { |
1536 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1537 | PNFS_UPDATE_LAYOUT_MDSTHRESH); | ||
1530 | goto out; | 1538 | goto out; |
1539 | } | ||
1531 | 1540 | ||
1532 | lookup_again: | 1541 | lookup_again: |
1533 | first = false; | 1542 | first = false; |
@@ -1535,19 +1544,26 @@ lookup_again: | |||
1535 | lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); | 1544 | lo = pnfs_find_alloc_layout(ino, ctx, gfp_flags); |
1536 | if (lo == NULL) { | 1545 | if (lo == NULL) { |
1537 | spin_unlock(&ino->i_lock); | 1546 | spin_unlock(&ino->i_lock); |
1547 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1548 | PNFS_UPDATE_LAYOUT_NOMEM); | ||
1538 | goto out; | 1549 | goto out; |
1539 | } | 1550 | } |
1540 | 1551 | ||
1541 | /* Do we even need to bother with this? */ | 1552 | /* Do we even need to bother with this? */ |
1542 | if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { | 1553 | if (test_bit(NFS_LAYOUT_BULK_RECALL, &lo->plh_flags)) { |
1554 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1555 | PNFS_UPDATE_LAYOUT_BULK_RECALL); | ||
1543 | dprintk("%s matches recall, use MDS\n", __func__); | 1556 | dprintk("%s matches recall, use MDS\n", __func__); |
1544 | goto out_unlock; | 1557 | goto out_unlock; |
1545 | } | 1558 | } |
1546 | 1559 | ||
1547 | /* if LAYOUTGET already failed once we don't try again */ | 1560 | /* if LAYOUTGET already failed once we don't try again */ |
1548 | if (pnfs_layout_io_test_failed(lo, iomode) && | 1561 | if (pnfs_layout_io_test_failed(lo, iomode) && |
1549 | !pnfs_should_retry_layoutget(lo)) | 1562 | !pnfs_should_retry_layoutget(lo)) { |
1563 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1564 | PNFS_UPDATE_LAYOUT_IO_TEST_FAIL); | ||
1550 | goto out_unlock; | 1565 | goto out_unlock; |
1566 | } | ||
1551 | 1567 | ||
1552 | first = list_empty(&lo->plh_segs); | 1568 | first = list_empty(&lo->plh_segs); |
1553 | if (first) { | 1569 | if (first) { |
@@ -1567,8 +1583,11 @@ lookup_again: | |||
1567 | * already exists | 1583 | * already exists |
1568 | */ | 1584 | */ |
1569 | lseg = pnfs_find_lseg(lo, &arg); | 1585 | lseg = pnfs_find_lseg(lo, &arg); |
1570 | if (lseg) | 1586 | if (lseg) { |
1587 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1588 | PNFS_UPDATE_LAYOUT_FOUND_CACHED); | ||
1571 | goto out_unlock; | 1589 | goto out_unlock; |
1590 | } | ||
1572 | } | 1591 | } |
1573 | 1592 | ||
1574 | /* | 1593 | /* |
@@ -1585,11 +1604,16 @@ lookup_again: | |||
1585 | dprintk("%s retrying\n", __func__); | 1604 | dprintk("%s retrying\n", __func__); |
1586 | goto lookup_again; | 1605 | goto lookup_again; |
1587 | } | 1606 | } |
1607 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1608 | PNFS_UPDATE_LAYOUT_RETURN); | ||
1588 | goto out_put_layout_hdr; | 1609 | goto out_put_layout_hdr; |
1589 | } | 1610 | } |
1590 | 1611 | ||
1591 | if (pnfs_layoutgets_blocked(lo)) | 1612 | if (pnfs_layoutgets_blocked(lo)) { |
1613 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1614 | PNFS_UPDATE_LAYOUT_BLOCKED); | ||
1592 | goto out_unlock; | 1615 | goto out_unlock; |
1616 | } | ||
1593 | atomic_inc(&lo->plh_outstanding); | 1617 | atomic_inc(&lo->plh_outstanding); |
1594 | spin_unlock(&ino->i_lock); | 1618 | spin_unlock(&ino->i_lock); |
1595 | 1619 | ||
@@ -1614,6 +1638,8 @@ lookup_again: | |||
1614 | lseg = send_layoutget(lo, ctx, &arg, gfp_flags); | 1638 | lseg = send_layoutget(lo, ctx, &arg, gfp_flags); |
1615 | pnfs_clear_retry_layoutget(lo); | 1639 | pnfs_clear_retry_layoutget(lo); |
1616 | atomic_dec(&lo->plh_outstanding); | 1640 | atomic_dec(&lo->plh_outstanding); |
1641 | trace_pnfs_update_layout(ino, pos, count, iomode, lseg, | ||
1642 | PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET); | ||
1617 | out_put_layout_hdr: | 1643 | out_put_layout_hdr: |
1618 | if (first) | 1644 | if (first) |
1619 | pnfs_clear_first_layoutget(lo); | 1645 | pnfs_clear_first_layoutget(lo); |
diff --git a/include/linux/nfs4.h b/include/linux/nfs4.h index e7e78537aea2..0e30f2c5ff49 100644 --- a/include/linux/nfs4.h +++ b/include/linux/nfs4.h | |||
@@ -592,4 +592,18 @@ enum data_content4 { | |||
592 | NFS4_CONTENT_HOLE = 1, | 592 | NFS4_CONTENT_HOLE = 1, |
593 | }; | 593 | }; |
594 | 594 | ||
595 | enum pnfs_update_layout_reason { | ||
596 | PNFS_UPDATE_LAYOUT_UNKNOWN = 0, | ||
597 | PNFS_UPDATE_LAYOUT_NO_PNFS, | ||
598 | PNFS_UPDATE_LAYOUT_RD_ZEROLEN, | ||
599 | PNFS_UPDATE_LAYOUT_MDSTHRESH, | ||
600 | PNFS_UPDATE_LAYOUT_NOMEM, | ||
601 | PNFS_UPDATE_LAYOUT_BULK_RECALL, | ||
602 | PNFS_UPDATE_LAYOUT_IO_TEST_FAIL, | ||
603 | PNFS_UPDATE_LAYOUT_FOUND_CACHED, | ||
604 | PNFS_UPDATE_LAYOUT_RETURN, | ||
605 | PNFS_UPDATE_LAYOUT_BLOCKED, | ||
606 | PNFS_UPDATE_LAYOUT_SEND_LAYOUTGET, | ||
607 | }; | ||
608 | |||
595 | #endif | 609 | #endif |