aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/nfs4trace.h56
-rw-r--r--fs/nfs/pnfs.c38
-rw-r--r--include/linux/nfs4.h14
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);
1442DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutreturn); 1442DEFINE_NFS4_INODE_STATEID_EVENT(nfs4_layoutreturn);
1443DEFINE_NFS4_INODE_EVENT(nfs4_layoutreturn_on_close); 1443DEFINE_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
1459TRACE_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
1532lookup_again: 1541lookup_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);
1617out_put_layout_hdr: 1643out_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
595enum 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