Re: [PATCH 2/6] rbd: store snapshot id instead of index

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux