|
@@ -1746,11 +1746,27 @@ static void pnfs_list_write_lseg(struct inode *inode, struct list_head *listp)
|
|
|
|
|
|
list_for_each_entry(lseg, &NFS_I(inode)->layout->plh_segs, pls_list) {
|
|
|
if (lseg->pls_range.iomode == IOMODE_RW &&
|
|
|
- test_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
|
|
|
+ test_and_clear_bit(NFS_LSEG_LAYOUTCOMMIT, &lseg->pls_flags))
|
|
|
list_add(&lseg->pls_lc_list, listp);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void pnfs_list_write_lseg_done(struct inode *inode, struct list_head *listp)
|
|
|
+{
|
|
|
+ struct pnfs_layout_segment *lseg, *tmp;
|
|
|
+ unsigned long *bitlock = &NFS_I(inode)->flags;
|
|
|
+
|
|
|
+ /* Matched by references in pnfs_set_layoutcommit */
|
|
|
+ list_for_each_entry_safe(lseg, tmp, listp, pls_lc_list) {
|
|
|
+ list_del_init(&lseg->pls_lc_list);
|
|
|
+ pnfs_put_lseg(lseg);
|
|
|
+ }
|
|
|
+
|
|
|
+ clear_bit_unlock(NFS_INO_LAYOUTCOMMITTING, bitlock);
|
|
|
+ smp_mb__after_clear_bit();
|
|
|
+ wake_up_bit(bitlock, NFS_INO_LAYOUTCOMMITTING);
|
|
|
+}
|
|
|
+
|
|
|
void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg)
|
|
|
{
|
|
|
pnfs_layout_io_set_failed(lseg->pls_layout, lseg->pls_range.iomode);
|
|
@@ -1795,6 +1811,7 @@ void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data)
|
|
|
|
|
|
if (nfss->pnfs_curr_ld->cleanup_layoutcommit)
|
|
|
nfss->pnfs_curr_ld->cleanup_layoutcommit(data);
|
|
|
+ pnfs_list_write_lseg_done(data->args.inode, &data->lseg_list);
|
|
|
}
|
|
|
|
|
|
/*
|