Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 331653
b: refs/heads/master
c: 9fcbb80
h: refs/heads/master
i:
  331651: e9dffb7
v: v3
  • Loading branch information
Alex Elder committed Oct 1, 2012
1 parent 9e520ea commit 6a971c7
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 7 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e28393082dd3991156d12a9e64b9584cef28fe25
refs/heads/master: 9fcbb80024795dc1a282f11af593ae5aa3d1b67e
27 changes: 21 additions & 6 deletions trunk/drivers/block/rbd.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@ static DEFINE_SPINLOCK(rbd_dev_list_lock);
static LIST_HEAD(rbd_client_list); /* clients */
static DEFINE_SPINLOCK(rbd_client_list_lock);

static int __rbd_init_snaps_header(struct rbd_device *rbd_dev);
static int rbd_dev_snap_devs_update(struct rbd_device *rbd_dev);
static void rbd_dev_release(struct device *dev);
static ssize_t rbd_snap_add(struct device *dev,
struct device_attribute *attr,
Expand Down Expand Up @@ -1848,7 +1848,7 @@ static int __rbd_refresh_header(struct rbd_device *rbd_dev, u64 *hver)
WARN_ON(strcmp(rbd_dev->header.object_prefix, h.object_prefix));
kfree(h.object_prefix);

ret = __rbd_init_snaps_header(rbd_dev);
ret = rbd_dev_snap_devs_update(rbd_dev);

up_write(&rbd_dev->header_rwsem);

Expand Down Expand Up @@ -1880,7 +1880,7 @@ static int rbd_init_disk(struct rbd_device *rbd_dev)
return rc;

/* no need to lock here, as rbd_dev is not registered yet */
rc = __rbd_init_snaps_header(rbd_dev);
rc = rbd_dev_snap_devs_update(rbd_dev);
if (rc)
return rc;

Expand Down Expand Up @@ -2184,7 +2184,7 @@ static struct rbd_snap *__rbd_add_snap_dev(struct rbd_device *rbd_dev,
* snapshot id, highest id first. (Snapshots in the rbd_dev's list
* are also maintained in that order.)
*/
static int __rbd_init_snaps_header(struct rbd_device *rbd_dev)
static int rbd_dev_snap_devs_update(struct rbd_device *rbd_dev)
{
struct ceph_snap_context *snapc = rbd_dev->header.snapc;
const u32 snap_count = snapc->num_snaps;
Expand All @@ -2193,6 +2193,7 @@ static int __rbd_init_snaps_header(struct rbd_device *rbd_dev)
struct list_head *links = head->next;
u32 index = 0;

dout("%s: snap count is %u\n", __func__, (unsigned int) snap_count);
while (index < snap_count || links != head) {
u64 snap_id;
struct rbd_snap *snap;
Expand All @@ -2211,32 +2212,45 @@ static int __rbd_init_snaps_header(struct rbd_device *rbd_dev)
if (rbd_dev->snap_id == snap->id)
rbd_dev->snap_exists = false;
__rbd_remove_snap_dev(snap);
dout("%ssnap id %llu has been removed\n",
rbd_dev->snap_id == snap->id ? "mapped " : "",
(unsigned long long) snap->id);

/* Done with this list entry; advance */

links = next;
continue;
}

dout("entry %u: snap_id = %llu\n", (unsigned int) snap_count,
(unsigned long long) snap_id);
if (!snap || (snap_id != CEPH_NOSNAP && snap->id < snap_id)) {
struct rbd_snap *new_snap;

/* We haven't seen this snapshot before */

new_snap = __rbd_add_snap_dev(rbd_dev, index,
snap_name);
if (IS_ERR(new_snap))
return PTR_ERR(new_snap);
if (IS_ERR(new_snap)) {
int err = PTR_ERR(new_snap);

dout(" failed to add dev, error %d\n", err);

return err;
}

/* New goes before existing, or at end of list */

dout(" added dev%s\n", snap ? "" : " at end\n");
if (snap)
list_add_tail(&new_snap->node, &snap->node);
else
list_add_tail(&new_snap->node, head);
} else {
/* Already have this one */

dout(" already present\n");

rbd_assert(snap->size ==
rbd_dev->header.snap_sizes[index]);
rbd_assert(!strcmp(snap->name, snap_name));
Expand All @@ -2251,6 +2265,7 @@ static int __rbd_init_snaps_header(struct rbd_device *rbd_dev)
index++;
snap_name += strlen(snap_name) + 1;
}
dout("%s: done\n", __func__);

return 0;
}
Expand Down

0 comments on commit 6a971c7

Please sign in to comment.