spin_lock(&bl->bl_ext_lock); if (!rw)
found = __ext_tree_lookup(&bl->bl_ext_ro, isect, ret); if (!found)
found = __ext_tree_lookup(&bl->bl_ext_rw, isect, ret);
spin_unlock(&bl->bl_ext_lock);
return found;
}
int ext_tree_remove(struct pnfs_block_layout *bl, bool rw,
sector_t start, sector_t end)
{ int err, err2;
LIST_HEAD(tmp);
int
ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start,
sector_t len, u64 lwb)
{ struct rb_root *root = &bl->bl_ext_rw;
sector_t end = start + len; struct pnfs_block_extent *be; int err = 0;
LIST_HEAD(tmp);
spin_lock(&bl->bl_ext_lock); /* * First remove all COW extents or holes from written to range.
*/
err = __ext_tree_remove(&bl->bl_ext_ro, start, end, &tmp); if (err) goto out;
/* * Then mark all invalid extents in the range as written to.
*/ for (be = __ext_tree_search(root, start); be; be = ext_tree_next(be)) { if (be->be_f_offset >= end) break;
if (be->be_state != PNFS_BLOCK_INVALID_DATA || be->be_tag) continue;
if (be->be_f_offset < start) { struct pnfs_block_extent *left = ext_tree_prev(be);
/** * ext_tree_try_encode_commit - try to encode all extents into the buffer * @bl: pointer to the layout * @p: pointer to the output buffer * @buffer_size: size of the output buffer * @count: output pointer to the number of encoded extents * @lastbyte: output pointer to the last written byte * * Return values: * %0: Success, all required extents encoded, outputs are valid * %-ENOSPC: Buffer too small, nothing encoded, outputs are invalid
*/ staticint
ext_tree_try_encode_commit(struct pnfs_block_layout *bl, __be32 *p,
size_t buffer_size, size_t *count, __u64 *lastbyte)
{ struct pnfs_block_extent *be;
spin_lock(&bl->bl_ext_lock); for (be = ext_tree_first(&bl->bl_ext_rw); be; be = ext_tree_next(be)) { if (be->be_state != PNFS_BLOCK_INVALID_DATA ||
be->be_tag != EXTENT_WRITTEN) continue;
(*count)++; if (ext_tree_layoutupdate_size(bl, *count) > buffer_size) {
spin_unlock(&bl->bl_ext_lock); return -ENOSPC;
}
} for (be = ext_tree_first(&bl->bl_ext_rw); be; be = ext_tree_next(be)) { if (be->be_state != PNFS_BLOCK_INVALID_DATA ||
be->be_tag != EXTENT_WRITTEN) continue;
if (bl->bl_scsi_layout)
p = encode_scsi_range(be, p); else
p = encode_block_extent(be, p);
be->be_tag = EXTENT_COMMITTING;
}
*lastbyte = (bl->bl_lwb != 0) ? bl->bl_lwb - 1 : U64_MAX;
bl->bl_lwb = 0;
spin_unlock(&bl->bl_ext_lock);
return 0;
}
/** * ext_tree_encode_commit - encode as much as possible extents into the buffer * @bl: pointer to the layout * @p: pointer to the output buffer * @buffer_size: size of the output buffer * @count: output pointer to the number of encoded extents * @lastbyte: output pointer to the last written byte * * Return values: * %0: Success, all required extents encoded, outputs are valid * %-ENOSPC: Buffer too small, some extents are encoded, outputs are valid
*/ staticint
ext_tree_encode_commit(struct pnfs_block_layout *bl, __be32 *p,
size_t buffer_size, size_t *count, __u64 *lastbyte)
{ struct pnfs_block_extent *be, *be_prev; int ret = 0;
spin_lock(&bl->bl_ext_lock); for (be = ext_tree_first(&bl->bl_ext_rw); be; be = ext_tree_next(be)) { if (be->be_state != PNFS_BLOCK_INVALID_DATA ||
be->be_tag != EXTENT_WRITTEN) continue;
(*count)++; if (ext_tree_layoutupdate_size(bl, *count) > buffer_size) {
(*count)--;
ret = -ENOSPC; break;
}
/** * ext_tree_prepare_commit - encode extents that need to be committed * @arg: layout commit data * * Return values: * %0: Success, all required extents are encoded * %-ENOSPC: Some extents are encoded, but not all, due to RPC size limit * %-ENOMEM: Out of memory, extents not encoded
*/ int
ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg)
{ struct pnfs_block_layout *bl = BLK_LO2EXT(NFS_I(arg->inode)->layout);
size_t count = 0, buffer_size = PAGE_SIZE;
__be32 *start_p; int ret;
spin_lock(&bl->bl_ext_lock); for (be = ext_tree_first(root); be; be = ext_tree_next(be)) { if (be->be_state != PNFS_BLOCK_INVALID_DATA ||
be->be_tag != EXTENT_COMMITTING) continue;
if (status) { /* * Mark as written and try again. * * XXX: some real error handling here wouldn't hurt..
*/
be->be_tag = EXTENT_WRITTEN;
} else {
be->be_state = PNFS_BLOCK_READWRITE_DATA;
be->be_tag = 0;
}
be = ext_try_to_merge_left(root, be);
be = ext_try_to_merge_right(root, be);
}
spin_unlock(&bl->bl_ext_lock);
}
Messung V0.5
¤ Dauer der Verarbeitung: 0.2 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.