Lines Matching defs:lseg

62 static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg,
375 struct pnfs_layout_segment *lseg;
379 list_for_each_entry(lseg, &lo->plh_segs, pls_list) {
380 if (!test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags))
382 pnfs_set_plh_return_info(lo, lseg->pls_range.iomode, 0);
396 pnfs_clear_lseg_state(struct pnfs_layout_segment *lseg,
399 clear_bit(NFS_LSEG_ROC, &lseg->pls_flags);
400 clear_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags);
401 if (test_and_clear_bit(NFS_LSEG_VALID, &lseg->pls_flags))
402 pnfs_lseg_dec_and_remove_zero(lseg, free_me);
403 if (test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
404 pnfs_lseg_dec_and_remove_zero(lseg, free_me);
465 struct pnfs_layout_segment *lseg, *next;
468 list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
469 pnfs_clear_lseg_state(lseg, lseg_list);
540 pnfs_init_lseg(struct pnfs_layout_hdr *lo, struct pnfs_layout_segment *lseg,
544 INIT_LIST_HEAD(&lseg->pls_list);
545 INIT_LIST_HEAD(&lseg->pls_lc_list);
546 INIT_LIST_HEAD(&lseg->pls_commits);
547 refcount_set(&lseg->pls_refcount, 1);
548 set_bit(NFS_LSEG_VALID, &lseg->pls_flags);
549 lseg->pls_layout = lo;
550 lseg->pls_range = *range;
551 lseg->pls_seq = be32_to_cpu(stateid->seqid);
554 static void pnfs_free_lseg(struct pnfs_layout_segment *lseg)
556 if (lseg != NULL) {
557 struct inode *inode = lseg->pls_layout->plh_inode;
558 NFS_SERVER(inode)->pnfs_curr_ld->free_lseg(lseg);
564 struct pnfs_layout_segment *lseg)
566 WARN_ON(test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
567 list_del_init(&lseg->pls_list);
570 if (test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags))
583 struct pnfs_layout_segment *lseg)
585 if (test_and_clear_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags) &&
587 pnfs_set_plh_return_info(lo, lseg->pls_range.iomode, 0);
588 list_move_tail(&lseg->pls_list, &lo->plh_return_segs);
595 pnfs_put_lseg(struct pnfs_layout_segment *lseg)
600 if (!lseg)
603 dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg,
604 refcount_read(&lseg->pls_refcount),
605 test_bit(NFS_LSEG_VALID, &lseg->pls_flags));
607 lo = lseg->pls_layout;
610 if (refcount_dec_and_lock(&lseg->pls_refcount, &inode->i_lock)) {
612 pnfs_layout_remove_lseg(lo, lseg);
613 if (pnfs_cache_lseg_for_layoutreturn(lo, lseg))
614 lseg = NULL;
616 pnfs_free_lseg(lseg);
641 static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg,
644 if (!refcount_dec_and_test(&lseg->pls_refcount))
646 pnfs_layout_remove_lseg(lseg->pls_layout, lseg);
647 list_add(&lseg->pls_list, tmp_list);
651 /* Returns 1 if lseg is removed from list, 0 otherwise */
652 static int mark_lseg_invalid(struct pnfs_layout_segment *lseg,
657 if (test_and_clear_bit(NFS_LSEG_VALID, &lseg->pls_flags)) {
658 /* Remove the reference keeping the lseg in the
662 dprintk("%s: lseg %p ref %d\n", __func__, lseg,
663 refcount_read(&lseg->pls_refcount));
664 if (pnfs_lseg_dec_and_remove_zero(lseg, tmp_list))
680 pnfs_match_lseg_recall(const struct pnfs_layout_segment *lseg,
684 if (seq != 0 && pnfs_seqid_is_newer(lseg->pls_seq, seq))
688 return pnfs_should_free_range(&lseg->pls_range, recall_range);
712 struct pnfs_layout_segment *lseg, *next;
720 list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
721 if (pnfs_match_lseg_recall(lseg, recall_range, seq)) {
722 dprintk("%s: freeing lseg %p iomode %d seq %u "
724 lseg, lseg->pls_range.iomode, lseg->pls_seq,
725 lseg->pls_range.offset, lseg->pls_range.length);
726 if (mark_lseg_invalid(lseg, tmp_list))
729 pnfs_lseg_cancel_io(server, lseg);
741 struct pnfs_layout_segment *lseg, *next;
743 list_for_each_entry_safe(lseg, next, &lo->plh_return_segs, pls_list) {
744 if (pnfs_match_lseg_recall(lseg, range, seq))
745 list_move_tail(&lseg->pls_list, free_me);
753 struct pnfs_layout_segment *lseg, *tmp;
758 list_for_each_entry_safe(lseg, tmp, free_me, pls_list) {
759 list_del(&lseg->pls_list);
760 pnfs_free_lseg(lseg);
1155 struct pnfs_layout_segment *lseg, *tmp;
1159 list_for_each_entry_safe(lseg, tmp, &nfsi->layout->plh_segs, pls_list) {
1160 if (!test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
1162 pnfs_lseg_dec_and_remove_zero(lseg, head);
1429 struct pnfs_layout_segment *lseg, *next;
1476 list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) {
1477 if (skip_read && lseg->pls_range.iomode == IOMODE_READ)
1480 if (!test_and_clear_bit(NFS_LSEG_ROC, &lseg->pls_flags))
1483 * Note: mark lseg for return so pnfs_layout_remove_lseg
1486 set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags);
1487 if (!mark_lseg_invalid(lseg, &lo->plh_return_segs))
1489 pnfs_set_plh_return_info(lo, lseg->pls_range.iomode, 0);
1655 pnfs_lseg_no_merge(struct pnfs_layout_segment *lseg,
1663 struct pnfs_layout_segment *lseg,
1677 if (do_merge(lseg, lp)) {
1681 if (is_after(&lseg->pls_range, &lp->pls_range))
1683 list_add_tail(&lseg->pls_list, &lp->pls_list);
1684 dprintk("%s: inserted lseg %p "
1687 __func__, lseg, lseg->pls_range.iomode,
1688 lseg->pls_range.offset, lseg->pls_range.length,
1693 list_add_tail(&lseg->pls_list, &lo->plh_segs);
1694 dprintk("%s: inserted lseg %p "
1696 __func__, lseg, lseg->pls_range.iomode,
1697 lseg->pls_range.offset, lseg->pls_range.length);
1707 struct pnfs_layout_segment *lseg,
1714 ld->add_lseg(lo, lseg, free_me);
1716 pnfs_generic_layout_insert_lseg(lo, lseg,
1773 * iomode lseg strict match
1812 struct pnfs_layout_segment *lseg, *ret = NULL;
1816 list_for_each_entry(lseg, &lo->plh_segs, pls_list) {
1817 if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags) &&
1818 pnfs_lseg_range_match(&lseg->pls_range, range,
1820 ret = pnfs_get_lseg(lseg);
1825 dprintk("%s:Return lseg %p ref %d\n",
1908 * send layoutcommit as it can hold up layoutreturn due to lseg
1980 struct pnfs_layout_segment *lseg = NULL;
1990 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
1996 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2004 iomode, lo, lseg,
2006 lseg = ERR_PTR(-EIO);
2010 lseg = ERR_PTR(nfs4_client_recover_expired_lease(clp));
2011 if (IS_ERR(lseg))
2018 lseg = ERR_PTR(-ENOMEM);
2019 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2026 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2034 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2046 lseg = ERR_PTR(wait_on_bit(&lo->plh_flags, NFS_LAYOUT_DRAIN,
2048 if (IS_ERR(lseg))
2061 lseg = ERR_PTR(pnfs_prepare_to_retry_layoutget(lo));
2062 if (!IS_ERR(lseg)) {
2066 lseg,
2070 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2075 lseg = pnfs_find_lseg(lo, &arg, strict_iomode);
2076 if (lseg) {
2077 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2097 lseg = ERR_PTR(wait_on_bit(&lo->plh_flags,
2100 if (IS_ERR(lseg))
2113 lseg = ERR_PTR(status);
2115 iomode, lo, lseg,
2128 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2147 lseg = ERR_PTR(-ENOMEM);
2157 lseg = nfs4_proc_layoutget(lgp, &exception);
2158 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2161 if (IS_ERR(lseg)) {
2162 switch(PTR_ERR(lseg)) {
2165 lseg = NULL;
2174 lseg = NULL;
2177 if (!nfs_error_is_fatal(PTR_ERR(lseg))) {
2179 lseg = NULL;
2183 if (lseg) {
2189 iomode, lo, lseg, PNFS_UPDATE_LAYOUT_RETRY);
2200 trace_pnfs_update_layout(ino, pos, count, iomode, lo, lseg,
2208 IS_ERR_OR_NULL(lseg) ? "not found" : "found",
2212 return lseg;
2346 struct pnfs_layout_segment *lseg;
2383 lseg = pnfs_layout_process(lgp);
2384 if (!IS_ERR(lseg)) {
2387 pnfs_put_lseg(lseg);
2407 struct pnfs_layout_segment *lseg;
2415 lseg = NFS_SERVER(ino)->pnfs_curr_ld->alloc_lseg(lo, res, lgp->gfp_flags);
2416 if (IS_ERR_OR_NULL(lseg)) {
2417 if (!lseg)
2418 lseg = ERR_PTR(-ENOMEM);
2421 __func__, PTR_ERR(lseg));
2422 return lseg;
2425 pnfs_init_lseg(lo, lseg, &res->range, &res->stateid);
2462 pnfs_get_lseg(lseg);
2463 pnfs_layout_insert_lseg(lo, lseg, &free_me);
2467 set_bit(NFS_LSEG_ROC, &lseg->pls_flags);
2471 return lseg;
2475 lseg->pls_layout = lo;
2476 NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg);
2502 struct pnfs_layout_segment *lseg, *next;
2513 list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list)
2514 if (pnfs_match_lseg_recall(lseg, return_range, seq)) {
2515 dprintk("%s: marking lseg %p iomode %d "
2517 lseg, lseg->pls_range.iomode,
2518 lseg->pls_range.offset,
2519 lseg->pls_range.length);
2520 if (test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags))
2522 if (mark_lseg_invalid(lseg, tmp_list))
2525 set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags);
2526 pnfs_lseg_cancel_io(server, lseg);
2577 struct pnfs_layout_segment *lseg)
2580 .iomode = lseg->pls_range.iomode,
2602 struct pnfs_layout_segment *lseg;
2604 list_for_each_entry(lseg, &lo->plh_segs, pls_list) {
2605 if (!test_bit(NFS_LSEG_VALID, &lseg->pls_flags))
2607 if (test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags))
2609 if (lseg->pls_range.iomode != iomode && iomode != IOMODE_ANY)
2611 if (pnfs_lseg_range_intersecting(&lseg->pls_range, range))
2612 return lseg;
2758 /* If no lseg, fall back to read through mds */
2782 /* If no lseg, fall back to write through mds */
2873 pnfs_set_layoutcommit(hdr->inode, hdr->lseg,
2901 struct pnfs_layout_segment *lseg,
2924 struct pnfs_layout_segment *lseg = desc->pg_lseg;
2927 trypnfs = pnfs_try_to_write_data(hdr, call_ops, lseg, how);
2947 pnfs_put_lseg(hdr->lseg);
2964 hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
3028 struct pnfs_layout_segment *lseg)
3054 pnfs_put_lseg(hdr->lseg);
3055 hdr->lseg = NULL;
3069 struct pnfs_layout_segment *lseg = desc->pg_lseg;
3072 trypnfs = pnfs_try_to_read_data(hdr, call_ops, lseg);
3092 pnfs_put_lseg(hdr->lseg);
3108 hdr->lseg = pnfs_get_lseg(desc->pg_lseg);
3130 struct pnfs_layout_segment *lseg;
3132 list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) {
3133 if (lseg->pls_range.iomode == IOMODE_RW &&
3134 test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
3135 list_add(&lseg->pls_lc_list, listp);
3141 struct pnfs_layout_segment *lseg, *tmp;
3144 list_for_each_entry_safe(lseg, tmp, listp, pls_lc_list) {
3145 list_del_init(&lseg->pls_lc_list);
3146 pnfs_put_lseg(lseg);
3152 void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg)
3154 pnfs_layout_io_set_failed(lseg->pls_layout, lseg->pls_range.iomode);
3159 pnfs_set_layoutcommit(struct inode *inode, struct pnfs_layout_segment *lseg,
3173 if (!test_and_set_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) {
3175 pnfs_get_lseg(lseg);
3178 dprintk("%s: lseg %p end_pos %llu\n",
3179 __func__, lseg, nfsi->layout->plh_lwb);