Lines Matching refs:lseg
316 init_lseg(struct pnfs_layout_hdr *lo, struct pnfs_layout_segment *lseg) in init_lseg() argument
318 INIT_LIST_HEAD(&lseg->pls_list); in init_lseg()
319 INIT_LIST_HEAD(&lseg->pls_lc_list); in init_lseg()
320 atomic_set(&lseg->pls_refcount, 1); in init_lseg()
322 set_bit(NFS_LSEG_VALID, &lseg->pls_flags); in init_lseg()
323 lseg->pls_layout = lo; in init_lseg()
326 static void pnfs_free_lseg(struct pnfs_layout_segment *lseg) in pnfs_free_lseg() argument
328 struct inode *ino = lseg->pls_layout->plh_inode; in pnfs_free_lseg()
330 NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg); in pnfs_free_lseg()
335 struct pnfs_layout_segment *lseg) in pnfs_layout_remove_lseg() argument
339 WARN_ON(test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); in pnfs_layout_remove_lseg()
340 list_del_init(&lseg->pls_list); in pnfs_layout_remove_lseg()
351 struct pnfs_layout_segment *lseg) in pnfs_layout_need_return() argument
355 if (!test_and_clear_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags)) in pnfs_layout_need_return()
359 if (s != lseg && test_bit(NFS_LSEG_LAYOUTRETURN, &s->pls_flags)) in pnfs_layout_need_return()
376 static void pnfs_layoutreturn_before_put_lseg(struct pnfs_layout_segment *lseg, in pnfs_layoutreturn_before_put_lseg() argument
379 lo = lseg->pls_layout; in pnfs_layoutreturn_before_put_lseg()
383 if (pnfs_layout_need_return(lo, lseg)) { in pnfs_layoutreturn_before_put_lseg()
401 pnfs_put_lseg(struct pnfs_layout_segment *lseg) in pnfs_put_lseg() argument
406 if (!lseg) in pnfs_put_lseg()
409 dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg, in pnfs_put_lseg()
410 atomic_read(&lseg->pls_refcount), in pnfs_put_lseg()
411 test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); in pnfs_put_lseg()
414 if (atomic_add_unless(&lseg->pls_refcount, -1, 1)) in pnfs_put_lseg()
417 lo = lseg->pls_layout; in pnfs_put_lseg()
420 if (test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags)) in pnfs_put_lseg()
421 pnfs_layoutreturn_before_put_lseg(lseg, lo, inode); in pnfs_put_lseg()
423 if (atomic_dec_and_lock(&lseg->pls_refcount, &inode->i_lock)) { in pnfs_put_lseg()
424 if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags)) { in pnfs_put_lseg()
429 pnfs_layout_remove_lseg(lo, lseg); in pnfs_put_lseg()
431 pnfs_free_lseg(lseg); in pnfs_put_lseg()
439 struct pnfs_layout_segment *lseg; in pnfs_free_lseg_async_work() local
442 lseg = container_of(work, struct pnfs_layout_segment, pls_work); in pnfs_free_lseg_async_work()
443 lo = lseg->pls_layout; in pnfs_free_lseg_async_work()
445 pnfs_free_lseg(lseg); in pnfs_free_lseg_async_work()
449 static void pnfs_free_lseg_async(struct pnfs_layout_segment *lseg) in pnfs_free_lseg_async() argument
451 INIT_WORK(&lseg->pls_work, pnfs_free_lseg_async_work); in pnfs_free_lseg_async()
452 schedule_work(&lseg->pls_work); in pnfs_free_lseg_async()
456 pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg) in pnfs_put_lseg_locked() argument
458 if (!lseg) in pnfs_put_lseg_locked()
461 assert_spin_locked(&lseg->pls_layout->plh_inode->i_lock); in pnfs_put_lseg_locked()
463 dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg, in pnfs_put_lseg_locked()
464 atomic_read(&lseg->pls_refcount), in pnfs_put_lseg_locked()
465 test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); in pnfs_put_lseg_locked()
466 if (atomic_dec_and_test(&lseg->pls_refcount)) { in pnfs_put_lseg_locked()
467 struct pnfs_layout_hdr *lo = lseg->pls_layout; in pnfs_put_lseg_locked()
468 if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags)) in pnfs_put_lseg_locked()
471 pnfs_layout_remove_lseg(lo, lseg); in pnfs_put_lseg_locked()
472 pnfs_free_lseg_async(lseg); in pnfs_put_lseg_locked()
534 static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg, in pnfs_lseg_dec_and_remove_zero() argument
537 if (!atomic_dec_and_test(&lseg->pls_refcount)) in pnfs_lseg_dec_and_remove_zero()
539 pnfs_layout_remove_lseg(lseg->pls_layout, lseg); in pnfs_lseg_dec_and_remove_zero()
540 list_add(&lseg->pls_list, tmp_list); in pnfs_lseg_dec_and_remove_zero()
545 static int mark_lseg_invalid(struct pnfs_layout_segment *lseg, in mark_lseg_invalid() argument
550 if (test_and_clear_bit(NFS_LSEG_VALID, &lseg->pls_flags)) { in mark_lseg_invalid()
555 dprintk("%s: lseg %p ref %d\n", __func__, lseg, in mark_lseg_invalid()
556 atomic_read(&lseg->pls_refcount)); in mark_lseg_invalid()
557 if (pnfs_lseg_dec_and_remove_zero(lseg, tmp_list)) in mark_lseg_invalid()
571 struct pnfs_layout_segment *lseg, *next; in pnfs_mark_matching_lsegs_invalid() local
578 list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) in pnfs_mark_matching_lsegs_invalid()
580 should_free_lseg(&lseg->pls_range, recall_range)) { in pnfs_mark_matching_lsegs_invalid()
583 lseg, lseg->pls_range.iomode, lseg->pls_range.offset, in pnfs_mark_matching_lsegs_invalid()
584 lseg->pls_range.length); in pnfs_mark_matching_lsegs_invalid()
586 removed += mark_lseg_invalid(lseg, tmp_list); in pnfs_mark_matching_lsegs_invalid()
596 struct pnfs_layout_segment *lseg, *tmp; in pnfs_free_lseg_list() local
601 list_for_each_entry_safe(lseg, tmp, free_me, pls_list) { in pnfs_free_lseg_list()
602 list_del(&lseg->pls_list); in pnfs_free_lseg_list()
603 pnfs_free_lseg(lseg); in pnfs_free_lseg_list()
870 struct pnfs_layout_segment *lseg; in send_layoutget() local
904 lseg = nfs4_proc_layoutget(lgp, gfp_flags); in send_layoutget()
905 } while (lseg == ERR_PTR(-EAGAIN)); in send_layoutget()
907 if (IS_ERR(lseg)) { in send_layoutget()
908 switch (PTR_ERR(lseg)) { in send_layoutget()
921 return lseg; in send_layoutget()
928 struct pnfs_layout_segment *lseg, *tmp; in pnfs_clear_layoutcommit() local
932 list_for_each_entry_safe(lseg, tmp, &nfsi->layout->plh_segs, pls_list) { in pnfs_clear_layoutcommit()
933 if (!test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) in pnfs_clear_layoutcommit()
935 pnfs_lseg_dec_and_remove_zero(lseg, head); in pnfs_clear_layoutcommit()
1078 struct pnfs_layout_segment *lseg, *tmp; in pnfs_roc() local
1106 list_for_each_entry_safe(lseg, tmp, &lo->plh_segs, pls_list) in pnfs_roc()
1108 if (layoutreturn || test_bit(NFS_LSEG_ROC, &lseg->pls_flags)) { in pnfs_roc()
1109 mark_lseg_invalid(lseg, &tmp_list); in pnfs_roc()
1228 pnfs_lseg_no_merge(struct pnfs_layout_segment *lseg, in pnfs_lseg_no_merge() argument
1236 struct pnfs_layout_segment *lseg, in pnfs_generic_layout_insert_lseg() argument
1250 if (do_merge(lseg, lp)) { in pnfs_generic_layout_insert_lseg()
1254 if (is_after(&lseg->pls_range, &lp->pls_range)) in pnfs_generic_layout_insert_lseg()
1256 list_add_tail(&lseg->pls_list, &lp->pls_list); in pnfs_generic_layout_insert_lseg()
1260 __func__, lseg, lseg->pls_range.iomode, in pnfs_generic_layout_insert_lseg()
1261 lseg->pls_range.offset, lseg->pls_range.length, in pnfs_generic_layout_insert_lseg()
1266 list_add_tail(&lseg->pls_list, &lo->plh_segs); in pnfs_generic_layout_insert_lseg()
1269 __func__, lseg, lseg->pls_range.iomode, in pnfs_generic_layout_insert_lseg()
1270 lseg->pls_range.offset, lseg->pls_range.length); in pnfs_generic_layout_insert_lseg()
1280 struct pnfs_layout_segment *lseg, in pnfs_layout_insert_lseg() argument
1287 ld->add_lseg(lo, lseg, free_me); in pnfs_layout_insert_lseg()
1289 pnfs_generic_layout_insert_lseg(lo, lseg, in pnfs_layout_insert_lseg()
1375 struct pnfs_layout_segment *lseg, *ret = NULL; in pnfs_find_lseg() local
1379 list_for_each_entry(lseg, &lo->plh_segs, pls_list) { in pnfs_find_lseg()
1380 if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags) && in pnfs_find_lseg()
1381 !test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags) && in pnfs_find_lseg()
1382 pnfs_lseg_range_match(&lseg->pls_range, range)) { in pnfs_find_lseg()
1383 ret = pnfs_get_lseg(lseg); in pnfs_find_lseg()
1520 struct pnfs_layout_segment *lseg = NULL; in pnfs_update_layout() local
1569 lseg = pnfs_find_lseg(lo, &arg); in pnfs_update_layout()
1570 if (lseg) in pnfs_update_layout()
1614 lseg = send_layoutget(lo, ctx, &arg, gfp_flags); in pnfs_update_layout()
1626 lseg == NULL ? "not found" : "found", in pnfs_update_layout()
1630 return lseg; in pnfs_update_layout()
1662 struct pnfs_layout_segment *lseg; in pnfs_layout_process() local
1671 lseg = NFS_SERVER(ino)->pnfs_curr_ld->alloc_lseg(lo, res, lgp->gfp_flags); in pnfs_layout_process()
1672 if (!lseg || IS_ERR(lseg)) { in pnfs_layout_process()
1673 if (!lseg) in pnfs_layout_process()
1676 status = PTR_ERR(lseg); in pnfs_layout_process()
1682 init_lseg(lo, lseg); in pnfs_layout_process()
1683 lseg->pls_range = res->range; in pnfs_layout_process()
1713 pnfs_get_lseg(lseg); in pnfs_layout_process()
1714 pnfs_layout_insert_lseg(lo, lseg, &free_me); in pnfs_layout_process()
1717 set_bit(NFS_LSEG_ROC, &lseg->pls_flags); in pnfs_layout_process()
1721 return lseg; in pnfs_layout_process()
1727 lseg->pls_layout = lo; in pnfs_layout_process()
1728 NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg); in pnfs_layout_process()
1737 struct pnfs_layout_segment *lseg, *next; in pnfs_mark_matching_lsegs_return() local
1744 list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) in pnfs_mark_matching_lsegs_return()
1745 if (should_free_lseg(&lseg->pls_range, return_range)) { in pnfs_mark_matching_lsegs_return()
1748 lseg, lseg->pls_range.iomode, in pnfs_mark_matching_lsegs_return()
1749 lseg->pls_range.offset, in pnfs_mark_matching_lsegs_return()
1750 lseg->pls_range.length); in pnfs_mark_matching_lsegs_return()
1751 set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags); in pnfs_mark_matching_lsegs_return()
1752 mark_lseg_invalid(lseg, tmp_list); in pnfs_mark_matching_lsegs_return()
1759 struct pnfs_layout_segment *lseg) in pnfs_error_mark_layout_for_return() argument
1762 int iomode = pnfs_iomode_to_fail_bit(lseg->pls_range.iomode); in pnfs_error_mark_layout_for_return()
1764 .iomode = lseg->pls_range.iomode, in pnfs_error_mark_layout_for_return()
1922 pnfs_set_layoutcommit(hdr->inode, hdr->lseg, in pnfs_ld_write_done()
1951 struct pnfs_layout_segment *lseg, in pnfs_try_to_write_data() argument
1974 struct pnfs_layout_segment *lseg = desc->pg_lseg; in pnfs_do_write() local
1977 trypnfs = pnfs_try_to_write_data(hdr, call_ops, lseg, how); in pnfs_do_write()
1984 pnfs_put_lseg(hdr->lseg); in pnfs_writehdr_free()
2003 hdr->lseg = pnfs_get_lseg(desc->pg_lseg); in pnfs_generic_pg_writepages()
2070 struct pnfs_layout_segment *lseg) in pnfs_try_to_read_data() argument
2102 struct pnfs_layout_segment *lseg = desc->pg_lseg; in pnfs_do_read() local
2106 trypnfs = pnfs_try_to_read_data(hdr, call_ops, lseg); in pnfs_do_read()
2115 pnfs_put_lseg(hdr->lseg); in pnfs_readhdr_free()
2133 hdr->lseg = pnfs_get_lseg(desc->pg_lseg); in pnfs_generic_pg_readpages()
2155 struct pnfs_layout_segment *lseg; in pnfs_list_write_lseg() local
2157 list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) { in pnfs_list_write_lseg()
2158 if (lseg->pls_range.iomode == IOMODE_RW && in pnfs_list_write_lseg()
2159 test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) in pnfs_list_write_lseg()
2160 list_add(&lseg->pls_lc_list, listp); in pnfs_list_write_lseg()
2166 struct pnfs_layout_segment *lseg, *tmp; in pnfs_list_write_lseg_done() local
2169 list_for_each_entry_safe(lseg, tmp, listp, pls_lc_list) { in pnfs_list_write_lseg_done()
2170 list_del_init(&lseg->pls_lc_list); in pnfs_list_write_lseg_done()
2171 pnfs_put_lseg(lseg); in pnfs_list_write_lseg_done()
2177 void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg) in pnfs_set_lo_fail() argument
2179 pnfs_layout_io_set_failed(lseg->pls_layout, lseg->pls_range.iomode); in pnfs_set_lo_fail()
2184 pnfs_set_layoutcommit(struct inode *inode, struct pnfs_layout_segment *lseg, in pnfs_set_layoutcommit() argument
2198 if (!test_and_set_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) { in pnfs_set_layoutcommit()
2200 pnfs_get_lseg(lseg); in pnfs_set_layoutcommit()
2204 __func__, lseg, nfsi->layout->plh_lwb); in pnfs_set_layoutcommit()