On Wed, Apr 18, 2012 at 7:41 AM, Alex Elder <elder@xxxxxxxxxxxxx> wrote: > When a device was open at a snapshot, and snapshots were deleted or > added, data from the wrong snapshot could be read. Instead of > assuming the snap context is constant, store the actual snap id when > the device is initialized, and rely on the OSDs to signal an error > if we try reading from a snapshot that was deleted. > > Signed-off-by: Josh Durgin <josh.durgin@xxxxxxxxxxxxx> > Reviewed-by: Alex Elder <elder@xxxxxxxxxxxxx> > --- > drivers/block/rbd.c | 27 +++++---------------------- > 1 file changed, 5 insertions(+), 22 deletions(-) > > Index: b/drivers/block/rbd.c > =================================================================== > --- a/drivers/block/rbd.c > +++ b/drivers/block/rbd.c > @@ -175,8 +175,7 @@ > /* protects updating the header */ > struct rw_semaphore header_rwsem; > char snap_name[RBD_MAX_SNAP_NAME_LEN]; > - u32 cur_snap; /* index+1 of current snapshot within snap context > - 0 - for the head */ > + u64 snap_id; /* current snapshot id */ > int read_only; > > struct list_head node; > @@ -554,21 +553,6 @@ > return -ENOMEM; > } > > -static int snap_index(struct rbd_image_header *header, int snap_num) > -{ > - return header->total_snaps - snap_num; > -} > - > -static u64 cur_snap_id(struct rbd_device *rbd_dev) > -{ > - struct rbd_image_header *header = &rbd_dev->header; > - > - if (!rbd_dev->cur_snap) > - return 0; > - > - return header->snapc->snaps[snap_index(header, rbd_dev->cur_snap)]; > -} > - > static int snap_by_name(struct rbd_image_header *header, const char > *snap_name, > u64 *seq, u64 *size) > { > @@ -607,7 +591,7 @@ > snapc->seq = header->snap_seq; > else > snapc->seq = 0; > - dev->cur_snap = 0; > + dev->snap_id = CEPH_NOSNAP; > dev->read_only = 0; > if (size) > *size = header->image_size; > @@ -615,8 +599,7 @@ > ret = snap_by_name(header, dev->snap_name, &snapc->seq, > size); > if (ret < 0) > goto done; > - > - dev->cur_snap = header->total_snaps - ret; > + dev->snap_id = snapc->seq; > dev->read_only = 1; > } > > @@ -1523,7 +1506,7 @@ > coll, cur_seg); > else > rbd_req_read(rq, rbd_dev, > - cur_snap_id(rbd_dev), > + rbd_dev->snap_id, > ofs, > op_size, bio, > coll, cur_seg); > @@ -1658,7 +1641,7 @@ > struct ceph_mon_client *monc; > > /* we should create a snapshot only if we're pointing at the head */ > - if (dev->cur_snap) > + if (dev->snap_id != CEPH_NOSNAP) > return -EINVAL; > > monc = &dev->rbd_client->client->monc; Reviewed-by: Yehuda Sadeh <yehuda@xxxxxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html