All of the early exit paths need to drop the mutex; it is only the normal
path through the function that does not. Skip the unlock in that case
with a goto out_unlocked.
Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Jianpeng Ma <majianpeng@gmail.com>
&ceph_sb_to_client(inode->i_sb)->client->osdc;
ssize_t count, written = 0;
int err, want, got;
&ceph_sb_to_client(inode->i_sb)->client->osdc;
ssize_t count, written = 0;
int err, want, got;
if (ceph_snap(inode) != CEPH_NOSNAP)
return -EROFS;
mutex_lock(&inode->i_mutex);
if (ceph_snap(inode) != CEPH_NOSNAP)
return -EROFS;
mutex_lock(&inode->i_mutex);
err = generic_segment_checks(iov, &nr_segs, &count, VERIFY_READ);
if (err)
err = generic_segment_checks(iov, &nr_segs, &count, VERIFY_READ);
if (err)
inode, ceph_vinop(inode),
pos, (unsigned)iov->iov_len);
mutex_lock(&inode->i_mutex);
inode, ceph_vinop(inode),
pos, (unsigned)iov->iov_len);
mutex_lock(&inode->i_mutex);
goto retry_snap;
}
} else {
goto retry_snap;
}
} else {
count, 0);
mutex_unlock(&inode->i_mutex);
}
count, 0);
mutex_unlock(&inode->i_mutex);
}
if (written >= 0) {
int dirty;
if (written >= 0) {
int dirty;
- if (hold_mutex)
- mutex_unlock(&inode->i_mutex);
+ mutex_unlock(&inode->i_mutex);
+out_unlocked:
current->backing_dev_info = NULL;
current->backing_dev_info = NULL;
return written ? written : err;
}
return written ? written : err;
}