mirror of https://github.com/ceph/go-ceph
Merge pull request #19 from abligh/fix-read-at-write-at-race
Replace ReadAt and WriteAt with thread-safe versions
This commit is contained in:
commit
62e94854a4
45
rbd/rbd.go
45
rbd/rbd.go
|
@ -672,19 +672,48 @@ func (image *Image) Discard(ofs uint64, length uint64) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (image *Image) ReadAt(data []byte, off int64) (n int, err error) {
|
func (image *Image) ReadAt(data []byte, off int64) (n int, err error) {
|
||||||
_, err = image.Seek(off, 0)
|
if image.image == nil {
|
||||||
if err != nil {
|
return 0, RbdErrorImageNotOpen
|
||||||
return 0, err
|
|
||||||
}
|
}
|
||||||
return image.Read(data)
|
|
||||||
|
if len(data) == 0 {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := int(C.rbd_read(
|
||||||
|
image.image,
|
||||||
|
(C.uint64_t)(off),
|
||||||
|
(C.size_t)(len(data)),
|
||||||
|
(*C.char)(unsafe.Pointer(&data[0]))))
|
||||||
|
|
||||||
|
if ret < 0 {
|
||||||
|
return 0, RBDError(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ret < n {
|
||||||
|
return ret, io.EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (image *Image) WriteAt(data []byte, off int64) (n int, err error) {
|
func (image *Image) WriteAt(data []byte, off int64) (n int, err error) {
|
||||||
_, err = image.Seek(off, 0)
|
if image.image == nil {
|
||||||
if err != nil {
|
return 0, RbdErrorImageNotOpen
|
||||||
return 0, err
|
|
||||||
}
|
}
|
||||||
return image.Write(data)
|
|
||||||
|
if len(data) == 0 {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
ret := int(C.rbd_write(image.image, C.uint64_t(off),
|
||||||
|
C.size_t(len(data)), (*C.char)(unsafe.Pointer(&data[0]))))
|
||||||
|
|
||||||
|
if ret != len(data) {
|
||||||
|
err = RBDError(-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// int rbd_flush(rbd_image_t image);
|
// int rbd_flush(rbd_image_t image);
|
||||||
|
|
Loading…
Reference in New Issue