rbd: access snapshot context and mapping size safely
authorJosh Durgin <josh.durgin@inktank.com>
Tue, 8 Apr 2014 18:12:11 +0000 (11:12 -0700)
committerIlya Dryomov <idryomov@redhat.com>
Tue, 14 Oct 2014 17:03:27 +0000 (21:03 +0400)
commit4e752f0ab0e8114f4edd7574081dc625d679dd15
tree80ef03b61b96c8eacf052607f28fcea03d5cce9f
parent7dd440c9e0711d828442c3e129ab8bcb9aeeac23
rbd: access snapshot context and mapping size safely

These fields may both change while the image is mapped if a snapshot
is created or deleted or the image is resized.  They are guarded by
rbd_dev->header_rwsem, so hold that while reading them, and store a
local copy to refer to outside of the critical section. The local copy
will stay consistent since the snapshot context is reference counted,
and the mapping size is just a u64. This prevents torn loads from
giving us inconsistent values.

Move reading header.snapc into the caller of rbd_img_request_create()
so that we only need to take the semaphore once. The read-only caller,
rbd_parent_request_create() can just pass NULL for snapc, since the
snapshot context is only relevant for writes.

Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
drivers/block/rbd.c