|
@@ -402,7 +402,7 @@ ext_tree_split(struct rb_root *root, struct pnfs_block_extent *be,
|
|
|
|
|
|
int
|
|
int
|
|
ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start,
|
|
ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start,
|
|
- sector_t len)
|
|
|
|
|
|
+ sector_t len, u64 lwb)
|
|
{
|
|
{
|
|
struct rb_root *root = &bl->bl_ext_rw;
|
|
struct rb_root *root = &bl->bl_ext_rw;
|
|
sector_t end = start + len;
|
|
sector_t end = start + len;
|
|
@@ -471,6 +471,8 @@ ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
out:
|
|
out:
|
|
|
|
+ if (bl->bl_lwb < lwb)
|
|
|
|
+ bl->bl_lwb = lwb;
|
|
spin_unlock(&bl->bl_ext_lock);
|
|
spin_unlock(&bl->bl_ext_lock);
|
|
|
|
|
|
__ext_put_deviceids(&tmp);
|
|
__ext_put_deviceids(&tmp);
|
|
@@ -518,7 +520,7 @@ static __be32 *encode_scsi_range(struct pnfs_block_extent *be, __be32 *p)
|
|
}
|
|
}
|
|
|
|
|
|
static int ext_tree_encode_commit(struct pnfs_block_layout *bl, __be32 *p,
|
|
static int ext_tree_encode_commit(struct pnfs_block_layout *bl, __be32 *p,
|
|
- size_t buffer_size, size_t *count)
|
|
|
|
|
|
+ size_t buffer_size, size_t *count, __u64 *lastbyte)
|
|
{
|
|
{
|
|
struct pnfs_block_extent *be;
|
|
struct pnfs_block_extent *be;
|
|
int ret = 0;
|
|
int ret = 0;
|
|
@@ -542,6 +544,8 @@ static int ext_tree_encode_commit(struct pnfs_block_layout *bl, __be32 *p,
|
|
p = encode_block_extent(be, p);
|
|
p = encode_block_extent(be, p);
|
|
be->be_tag = EXTENT_COMMITTING;
|
|
be->be_tag = EXTENT_COMMITTING;
|
|
}
|
|
}
|
|
|
|
+ *lastbyte = bl->bl_lwb - 1;
|
|
|
|
+ bl->bl_lwb = 0;
|
|
spin_unlock(&bl->bl_ext_lock);
|
|
spin_unlock(&bl->bl_ext_lock);
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
@@ -564,7 +568,7 @@ ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg)
|
|
arg->layoutupdate_pages = &arg->layoutupdate_page;
|
|
arg->layoutupdate_pages = &arg->layoutupdate_page;
|
|
|
|
|
|
retry:
|
|
retry:
|
|
- ret = ext_tree_encode_commit(bl, start_p + 1, buffer_size, &count);
|
|
|
|
|
|
+ ret = ext_tree_encode_commit(bl, start_p + 1, buffer_size, &count, &arg->lastbytewritten);
|
|
if (unlikely(ret)) {
|
|
if (unlikely(ret)) {
|
|
ext_tree_free_commitdata(arg, buffer_size);
|
|
ext_tree_free_commitdata(arg, buffer_size);
|
|
|
|
|