Skip to content

Commit

Permalink
rbd: whole-object write and zeroout should copyup when snapshots exist
Browse files Browse the repository at this point in the history
Otherwise, once the parent snapshot is removed, the clone's snapshot
wouldn't reflect the state of the clone prior to whole-object write or
zeroout because a deep-copyup was never done ("rbd flatten" wouldn't do
it because the modified object would exist in HEAD).

Signed-off-by: Ilya Dryomov <[email protected]>
  • Loading branch information
idryomov committed Mar 5, 2019
1 parent 89a59c1 commit 9b17eb2
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions drivers/block/rbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1445,7 +1445,8 @@ static bool rbd_obj_is_tail(struct rbd_obj_request *obj_req)
static bool rbd_obj_copyup_enabled(struct rbd_obj_request *obj_req)
{
if (!obj_req->num_img_extents ||
rbd_obj_is_entire(obj_req))
(rbd_obj_is_entire(obj_req) &&
!obj_req->img_request->snapc->num_snaps))
return false;

return true;
Expand Down Expand Up @@ -1955,7 +1956,8 @@ static int count_zeroout_ops(struct rbd_obj_request *obj_req)
{
int num_osd_ops;

if (rbd_obj_is_entire(obj_req) && obj_req->num_img_extents)
if (rbd_obj_is_entire(obj_req) && obj_req->num_img_extents &&
!rbd_obj_copyup_enabled(obj_req))
num_osd_ops = 2; /* create + truncate */
else
num_osd_ops = 1; /* delete/truncate/zero */
Expand All @@ -1970,8 +1972,9 @@ static void __rbd_obj_setup_zeroout(struct rbd_obj_request *obj_req,

if (rbd_obj_is_entire(obj_req)) {
if (obj_req->num_img_extents) {
osd_req_op_init(obj_req->osd_req, which++,
CEPH_OSD_OP_CREATE, 0);
if (!rbd_obj_copyup_enabled(obj_req))
osd_req_op_init(obj_req->osd_req, which++,
CEPH_OSD_OP_CREATE, 0);
opcode = CEPH_OSD_OP_TRUNCATE;
} else {
osd_req_op_init(obj_req->osd_req, which++,
Expand Down Expand Up @@ -2551,7 +2554,6 @@ static int rbd_obj_issue_copyup_ops(struct rbd_obj_request *obj_req, u32 bytes)
__rbd_obj_setup_write(obj_req, which);
break;
case OBJ_OP_ZEROOUT:
rbd_assert(!rbd_obj_is_entire(obj_req));
__rbd_obj_setup_zeroout(obj_req, which);
break;
default:
Expand Down

0 comments on commit 9b17eb2

Please sign in to comment.