}
static inline bool is_copy_on_read(ImageCtx *ictx, librados::snap_t snap_id) {
+ assert(ictx->owner_lock.is_locked());
assert(ictx->snap_lock.is_locked());
- return (ictx->clone_copy_on_read) &&
- (!ictx->read_only) && (snap_id == CEPH_NOSNAP);
+ return (ictx->clone_copy_on_read &&
+ !ictx->read_only && snap_id == CEPH_NOSNAP &&
+ (ictx->exclusive_lock == nullptr ||
+ ictx->exclusive_lock->is_lock_owner()));
}
/** read **/
// This is the step to read from parent
if (!m_tried_parent && r == -ENOENT) {
{
+ RWLock::RLocker owner_locker(m_ictx->owner_lock);
RWLock::RLocker snap_locker(m_ictx->snap_lock);
RWLock::RLocker parent_locker(m_ictx->parent_lock);
if (m_ictx->parent == NULL) {
void AioObjectRead::send_copyup()
{
{
+ RWLock::RLocker owner_locker(m_ictx->owner_lock);
RWLock::RLocker snap_locker(m_ictx->snap_lock);
RWLock::RLocker parent_locker(m_ictx->parent_lock);
- if (!compute_parent_extents()) {
+ if (!compute_parent_extents() ||
+ (m_ictx->exclusive_lock != nullptr &&
+ !m_ictx->exclusive_lock->is_lock_owner())) {
return;
}
}
RWLock::RLocker snap_locker(m_ictx->snap_lock);
if (m_ictx->object_map != nullptr) {
bool copy_on_read = m_pending_requests.empty();
- if (!m_ictx->exclusive_lock->is_lock_owner()) {
- ldout(m_ictx->cct, 20) << "exclusive lock not held for copyup request"
- << dendl;
- assert(copy_on_read);
- return true;
- }
+ assert(m_ictx->exclusive_lock->is_lock_owner());
RWLock::WLocker object_map_locker(m_ictx->object_map_lock);
if (copy_on_read &&