Lines Matching refs:lseg

315 init_lseg(struct pnfs_layout_hdr *lo, struct pnfs_layout_segment *lseg)  in init_lseg()  argument
317 INIT_LIST_HEAD(&lseg->pls_list); in init_lseg()
318 INIT_LIST_HEAD(&lseg->pls_lc_list); in init_lseg()
319 atomic_set(&lseg->pls_refcount, 1); in init_lseg()
321 set_bit(NFS_LSEG_VALID, &lseg->pls_flags); in init_lseg()
322 lseg->pls_layout = lo; in init_lseg()
325 static void pnfs_free_lseg(struct pnfs_layout_segment *lseg) in pnfs_free_lseg() argument
327 struct inode *ino = lseg->pls_layout->plh_inode; in pnfs_free_lseg()
329 NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg); in pnfs_free_lseg()
334 struct pnfs_layout_segment *lseg) in pnfs_layout_remove_lseg() argument
338 WARN_ON(test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); in pnfs_layout_remove_lseg()
339 list_del_init(&lseg->pls_list); in pnfs_layout_remove_lseg()
350 struct pnfs_layout_segment *lseg) in pnfs_layout_need_return() argument
354 if (!test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags)) in pnfs_layout_need_return()
358 if (s != lseg && test_bit(NFS_LSEG_LAYOUTRETURN, &s->pls_flags)) in pnfs_layout_need_return()
364 static void pnfs_layoutreturn_before_put_lseg(struct pnfs_layout_segment *lseg, in pnfs_layoutreturn_before_put_lseg() argument
367 lo = lseg->pls_layout; in pnfs_layoutreturn_before_put_lseg()
371 if (pnfs_layout_need_return(lo, lseg)) { in pnfs_layoutreturn_before_put_lseg()
390 pnfs_put_lseg(struct pnfs_layout_segment *lseg) in pnfs_put_lseg() argument
395 if (!lseg) in pnfs_put_lseg()
398 dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg, in pnfs_put_lseg()
399 atomic_read(&lseg->pls_refcount), in pnfs_put_lseg()
400 test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); in pnfs_put_lseg()
403 if (atomic_add_unless(&lseg->pls_refcount, -1, 1)) in pnfs_put_lseg()
406 lo = lseg->pls_layout; in pnfs_put_lseg()
409 if (test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags)) in pnfs_put_lseg()
410 pnfs_layoutreturn_before_put_lseg(lseg, lo, inode); in pnfs_put_lseg()
412 if (atomic_dec_and_lock(&lseg->pls_refcount, &inode->i_lock)) { in pnfs_put_lseg()
414 pnfs_layout_remove_lseg(lo, lseg); in pnfs_put_lseg()
416 pnfs_free_lseg(lseg); in pnfs_put_lseg()
424 struct pnfs_layout_segment *lseg; in pnfs_free_lseg_async_work() local
427 lseg = container_of(work, struct pnfs_layout_segment, pls_work); in pnfs_free_lseg_async_work()
428 lo = lseg->pls_layout; in pnfs_free_lseg_async_work()
430 pnfs_free_lseg(lseg); in pnfs_free_lseg_async_work()
434 static void pnfs_free_lseg_async(struct pnfs_layout_segment *lseg) in pnfs_free_lseg_async() argument
436 INIT_WORK(&lseg->pls_work, pnfs_free_lseg_async_work); in pnfs_free_lseg_async()
437 schedule_work(&lseg->pls_work); in pnfs_free_lseg_async()
441 pnfs_put_lseg_locked(struct pnfs_layout_segment *lseg) in pnfs_put_lseg_locked() argument
443 if (!lseg) in pnfs_put_lseg_locked()
446 assert_spin_locked(&lseg->pls_layout->plh_inode->i_lock); in pnfs_put_lseg_locked()
448 dprintk("%s: lseg %p ref %d valid %d\n", __func__, lseg, in pnfs_put_lseg_locked()
449 atomic_read(&lseg->pls_refcount), in pnfs_put_lseg_locked()
450 test_bit(NFS_LSEG_VALID, &lseg->pls_flags)); in pnfs_put_lseg_locked()
451 if (atomic_dec_and_test(&lseg->pls_refcount)) { in pnfs_put_lseg_locked()
452 struct pnfs_layout_hdr *lo = lseg->pls_layout; in pnfs_put_lseg_locked()
454 pnfs_layout_remove_lseg(lo, lseg); in pnfs_put_lseg_locked()
455 pnfs_free_lseg_async(lseg); in pnfs_put_lseg_locked()
517 static bool pnfs_lseg_dec_and_remove_zero(struct pnfs_layout_segment *lseg, in pnfs_lseg_dec_and_remove_zero() argument
520 if (!atomic_dec_and_test(&lseg->pls_refcount)) in pnfs_lseg_dec_and_remove_zero()
522 pnfs_layout_remove_lseg(lseg->pls_layout, lseg); in pnfs_lseg_dec_and_remove_zero()
523 list_add(&lseg->pls_list, tmp_list); in pnfs_lseg_dec_and_remove_zero()
528 static int mark_lseg_invalid(struct pnfs_layout_segment *lseg, in mark_lseg_invalid() argument
533 if (test_and_clear_bit(NFS_LSEG_VALID, &lseg->pls_flags)) { in mark_lseg_invalid()
538 dprintk("%s: lseg %p ref %d\n", __func__, lseg, in mark_lseg_invalid()
539 atomic_read(&lseg->pls_refcount)); in mark_lseg_invalid()
540 if (pnfs_lseg_dec_and_remove_zero(lseg, tmp_list)) in mark_lseg_invalid()
554 struct pnfs_layout_segment *lseg, *next; in pnfs_mark_matching_lsegs_invalid() local
561 list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) in pnfs_mark_matching_lsegs_invalid()
563 should_free_lseg(&lseg->pls_range, recall_range)) { in pnfs_mark_matching_lsegs_invalid()
566 lseg, lseg->pls_range.iomode, lseg->pls_range.offset, in pnfs_mark_matching_lsegs_invalid()
567 lseg->pls_range.length); in pnfs_mark_matching_lsegs_invalid()
569 removed += mark_lseg_invalid(lseg, tmp_list); in pnfs_mark_matching_lsegs_invalid()
579 struct pnfs_layout_segment *lseg, *tmp; in pnfs_free_lseg_list() local
584 list_for_each_entry_safe(lseg, tmp, free_me, pls_list) { in pnfs_free_lseg_list()
585 list_del(&lseg->pls_list); in pnfs_free_lseg_list()
586 pnfs_free_lseg(lseg); in pnfs_free_lseg_list()
866 struct pnfs_layout_segment *lseg; in send_layoutget() local
888 lseg = nfs4_proc_layoutget(lgp, gfp_flags); in send_layoutget()
889 if (IS_ERR(lseg)) { in send_layoutget()
890 switch (PTR_ERR(lseg)) { in send_layoutget()
903 return lseg; in send_layoutget()
910 struct pnfs_layout_segment *lseg, *tmp; in pnfs_clear_layoutcommit() local
914 list_for_each_entry_safe(lseg, tmp, &nfsi->layout->plh_segs, pls_list) { in pnfs_clear_layoutcommit()
915 if (!test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) in pnfs_clear_layoutcommit()
917 pnfs_lseg_dec_and_remove_zero(lseg, head); in pnfs_clear_layoutcommit()
1059 struct pnfs_layout_segment *lseg, *tmp; in pnfs_roc() local
1082 list_for_each_entry_safe(lseg, tmp, &lo->plh_segs, pls_list) in pnfs_roc()
1083 if (test_bit(NFS_LSEG_ROC, &lseg->pls_flags)) { in pnfs_roc()
1084 mark_lseg_invalid(lseg, &tmp_list); in pnfs_roc()
1145 struct pnfs_layout_segment *lseg; in pnfs_roc_drain() local
1151 list_for_each_entry(lseg, &nfsi->layout->plh_segs, pls_list) in pnfs_roc_drain()
1152 if (test_bit(NFS_LSEG_ROC, &lseg->pls_flags)) { in pnfs_roc_drain()
1210 struct pnfs_layout_segment *lseg) in pnfs_layout_insert_lseg() argument
1217 if (pnfs_lseg_range_cmp(&lseg->pls_range, &lp->pls_range) > 0) in pnfs_layout_insert_lseg()
1219 list_add_tail(&lseg->pls_list, &lp->pls_list); in pnfs_layout_insert_lseg()
1223 __func__, lseg, lseg->pls_range.iomode, in pnfs_layout_insert_lseg()
1224 lseg->pls_range.offset, lseg->pls_range.length, in pnfs_layout_insert_lseg()
1229 list_add_tail(&lseg->pls_list, &lo->plh_segs); in pnfs_layout_insert_lseg()
1232 __func__, lseg, lseg->pls_range.iomode, in pnfs_layout_insert_lseg()
1233 lseg->pls_range.offset, lseg->pls_range.length); in pnfs_layout_insert_lseg()
1320 struct pnfs_layout_segment *lseg, *ret = NULL; in pnfs_find_lseg() local
1324 list_for_each_entry(lseg, &lo->plh_segs, pls_list) { in pnfs_find_lseg()
1325 if (test_bit(NFS_LSEG_VALID, &lseg->pls_flags) && in pnfs_find_lseg()
1326 !test_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags) && in pnfs_find_lseg()
1327 pnfs_lseg_range_match(&lseg->pls_range, range)) { in pnfs_find_lseg()
1328 ret = pnfs_get_lseg(lseg); in pnfs_find_lseg()
1331 if (lseg->pls_range.offset > range->offset) in pnfs_find_lseg()
1465 struct pnfs_layout_segment *lseg = NULL; in pnfs_update_layout() local
1511 lseg = pnfs_find_lseg(lo, &arg); in pnfs_update_layout()
1512 if (lseg) in pnfs_update_layout()
1520 if (!lseg && pnfs_should_retry_layoutget(lo) && in pnfs_update_layout()
1557 lseg = send_layoutget(lo, ctx, &arg, gfp_flags); in pnfs_update_layout()
1569 lseg == NULL ? "not found" : "found", in pnfs_update_layout()
1573 return lseg; in pnfs_update_layout()
1585 struct pnfs_layout_segment *lseg; in pnfs_layout_process() local
1591 lseg = NFS_SERVER(ino)->pnfs_curr_ld->alloc_lseg(lo, res, lgp->gfp_flags); in pnfs_layout_process()
1592 if (!lseg || IS_ERR(lseg)) { in pnfs_layout_process()
1593 if (!lseg) in pnfs_layout_process()
1596 status = PTR_ERR(lseg); in pnfs_layout_process()
1602 init_lseg(lo, lseg); in pnfs_layout_process()
1603 lseg->pls_range = res->range; in pnfs_layout_process()
1637 pnfs_get_lseg(lseg); in pnfs_layout_process()
1638 pnfs_layout_insert_lseg(lo, lseg); in pnfs_layout_process()
1641 set_bit(NFS_LSEG_ROC, &lseg->pls_flags); in pnfs_layout_process()
1647 return lseg; in pnfs_layout_process()
1653 lseg->pls_layout = lo; in pnfs_layout_process()
1654 NFS_SERVER(ino)->pnfs_curr_ld->free_lseg(lseg); in pnfs_layout_process()
1663 struct pnfs_layout_segment *lseg, *next; in pnfs_mark_matching_lsegs_return() local
1670 list_for_each_entry_safe(lseg, next, &lo->plh_segs, pls_list) in pnfs_mark_matching_lsegs_return()
1671 if (should_free_lseg(&lseg->pls_range, return_range)) { in pnfs_mark_matching_lsegs_return()
1674 lseg, lseg->pls_range.iomode, in pnfs_mark_matching_lsegs_return()
1675 lseg->pls_range.offset, in pnfs_mark_matching_lsegs_return()
1676 lseg->pls_range.length); in pnfs_mark_matching_lsegs_return()
1677 set_bit(NFS_LSEG_LAYOUTRETURN, &lseg->pls_flags); in pnfs_mark_matching_lsegs_return()
1678 mark_lseg_invalid(lseg, tmp_list); in pnfs_mark_matching_lsegs_return()
1683 struct pnfs_layout_segment *lseg) in pnfs_error_mark_layout_for_return() argument
1686 int iomode = pnfs_iomode_to_fail_bit(lseg->pls_range.iomode); in pnfs_error_mark_layout_for_return()
1688 .iomode = lseg->pls_range.iomode, in pnfs_error_mark_layout_for_return()
1848 pnfs_set_layoutcommit(hdr->inode, hdr->lseg, in pnfs_ld_write_done()
1875 struct pnfs_layout_segment *lseg, in pnfs_try_to_write_data() argument
1898 struct pnfs_layout_segment *lseg = desc->pg_lseg; in pnfs_do_write() local
1901 trypnfs = pnfs_try_to_write_data(hdr, call_ops, lseg, how); in pnfs_do_write()
1908 pnfs_put_lseg(hdr->lseg); in pnfs_writehdr_free()
1927 hdr->lseg = pnfs_get_lseg(desc->pg_lseg); in pnfs_generic_pg_writepages()
1993 struct pnfs_layout_segment *lseg) in pnfs_try_to_read_data() argument
2025 struct pnfs_layout_segment *lseg = desc->pg_lseg; in pnfs_do_read() local
2029 trypnfs = pnfs_try_to_read_data(hdr, call_ops, lseg); in pnfs_do_read()
2038 pnfs_put_lseg(hdr->lseg); in pnfs_readhdr_free()
2056 hdr->lseg = pnfs_get_lseg(desc->pg_lseg); in pnfs_generic_pg_readpages()
2078 struct pnfs_layout_segment *lseg; in pnfs_list_write_lseg() local
2080 list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) { in pnfs_list_write_lseg()
2081 if (lseg->pls_range.iomode == IOMODE_RW && in pnfs_list_write_lseg()
2082 test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) in pnfs_list_write_lseg()
2083 list_add(&lseg->pls_lc_list, listp); in pnfs_list_write_lseg()
2089 struct pnfs_layout_segment *lseg, *tmp; in pnfs_list_write_lseg_done() local
2092 list_for_each_entry_safe(lseg, tmp, listp, pls_lc_list) { in pnfs_list_write_lseg_done()
2093 list_del_init(&lseg->pls_lc_list); in pnfs_list_write_lseg_done()
2094 pnfs_put_lseg(lseg); in pnfs_list_write_lseg_done()
2100 void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg) in pnfs_set_lo_fail() argument
2102 pnfs_layout_io_set_failed(lseg->pls_layout, lseg->pls_range.iomode); in pnfs_set_lo_fail()
2107 pnfs_set_layoutcommit(struct inode *inode, struct pnfs_layout_segment *lseg, in pnfs_set_layoutcommit() argument
2121 if (!test_and_set_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags)) { in pnfs_set_layoutcommit()
2123 pnfs_get_lseg(lseg); in pnfs_set_layoutcommit()
2127 __func__, lseg, nfsi->layout->plh_lwb); in pnfs_set_layoutcommit()