diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-28 14:10:53 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-07-28 14:10:53 -0400 |
| commit | 6c50e1a49b4377b760ee46f824ed04b17be913e3 (patch) | |
| tree | 5e558bcd8fa3ca0d1a999e4c472d206aa688ec68 | |
| parent | d2a97a4e99ff0ffdccd1fc46f22fb34270ef1e56 (diff) | |
| parent | 03066f23452ff088ad8e2c8acdf4443043f35b51 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:
ceph: use complete_all and wake_up_all
ceph: Correct obvious typo of Kconfig variable "CRYPTO_AES"
ceph: fix dentry lease release
ceph: fix leak of dentry in ceph_init_dentry() error path
ceph: fix pg_mapping leak on pg_temp updates
ceph: fix d_release dop for snapdir, snapped dentries
ceph: avoid dcache readdir for snapdir
| -rw-r--r-- | fs/ceph/Kconfig | 2 | ||||
| -rw-r--r-- | fs/ceph/caps.c | 15 | ||||
| -rw-r--r-- | fs/ceph/dir.c | 13 | ||||
| -rw-r--r-- | fs/ceph/file.c | 2 | ||||
| -rw-r--r-- | fs/ceph/inode.c | 6 | ||||
| -rw-r--r-- | fs/ceph/mds_client.c | 10 | ||||
| -rw-r--r-- | fs/ceph/mon_client.c | 6 | ||||
| -rw-r--r-- | fs/ceph/osd_client.c | 6 | ||||
| -rw-r--r-- | fs/ceph/osdmap.c | 26 |
9 files changed, 50 insertions, 36 deletions
diff --git a/fs/ceph/Kconfig b/fs/ceph/Kconfig index 04b8280582a9..bc87b9c1d27e 100644 --- a/fs/ceph/Kconfig +++ b/fs/ceph/Kconfig | |||
| @@ -2,7 +2,7 @@ config CEPH_FS | |||
| 2 | tristate "Ceph distributed file system (EXPERIMENTAL)" | 2 | tristate "Ceph distributed file system (EXPERIMENTAL)" |
| 3 | depends on INET && EXPERIMENTAL | 3 | depends on INET && EXPERIMENTAL |
| 4 | select LIBCRC32C | 4 | select LIBCRC32C |
| 5 | select CONFIG_CRYPTO_AES | 5 | select CRYPTO_AES |
| 6 | help | 6 | help |
| 7 | Choose Y or M here to include support for mounting the | 7 | Choose Y or M here to include support for mounting the |
| 8 | experimental Ceph distributed file system. Ceph is an extremely | 8 | experimental Ceph distributed file system. Ceph is an extremely |
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 74144d6389f0..b81be9a56487 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -627,7 +627,7 @@ retry: | |||
| 627 | if (fmode >= 0) | 627 | if (fmode >= 0) |
| 628 | __ceph_get_fmode(ci, fmode); | 628 | __ceph_get_fmode(ci, fmode); |
| 629 | spin_unlock(&inode->i_lock); | 629 | spin_unlock(&inode->i_lock); |
| 630 | wake_up(&ci->i_cap_wq); | 630 | wake_up_all(&ci->i_cap_wq); |
| 631 | return 0; | 631 | return 0; |
| 632 | } | 632 | } |
| 633 | 633 | ||
| @@ -1181,7 +1181,7 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, | |||
| 1181 | } | 1181 | } |
| 1182 | 1182 | ||
| 1183 | if (wake) | 1183 | if (wake) |
| 1184 | wake_up(&ci->i_cap_wq); | 1184 | wake_up_all(&ci->i_cap_wq); |
| 1185 | 1185 | ||
| 1186 | return delayed; | 1186 | return delayed; |
| 1187 | } | 1187 | } |
| @@ -2153,7 +2153,7 @@ void ceph_put_cap_refs(struct ceph_inode_info *ci, int had) | |||
| 2153 | else if (flushsnaps) | 2153 | else if (flushsnaps) |
| 2154 | ceph_flush_snaps(ci); | 2154 | ceph_flush_snaps(ci); |
| 2155 | if (wake) | 2155 | if (wake) |
| 2156 | wake_up(&ci->i_cap_wq); | 2156 | wake_up_all(&ci->i_cap_wq); |
| 2157 | if (put) | 2157 | if (put) |
| 2158 | iput(inode); | 2158 | iput(inode); |
| 2159 | } | 2159 | } |
| @@ -2229,7 +2229,7 @@ void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr, | |||
| 2229 | iput(inode); | 2229 | iput(inode); |
| 2230 | } else if (complete_capsnap) { | 2230 | } else if (complete_capsnap) { |
| 2231 | ceph_flush_snaps(ci); | 2231 | ceph_flush_snaps(ci); |
| 2232 | wake_up(&ci->i_cap_wq); | 2232 | wake_up_all(&ci->i_cap_wq); |
| 2233 | } | 2233 | } |
| 2234 | if (drop_capsnap) | 2234 | if (drop_capsnap) |
| 2235 | iput(inode); | 2235 | iput(inode); |
| @@ -2405,7 +2405,7 @@ static void handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant, | |||
| 2405 | if (queue_invalidate) | 2405 | if (queue_invalidate) |
| 2406 | ceph_queue_invalidate(inode); | 2406 | ceph_queue_invalidate(inode); |
| 2407 | if (wake) | 2407 | if (wake) |
| 2408 | wake_up(&ci->i_cap_wq); | 2408 | wake_up_all(&ci->i_cap_wq); |
| 2409 | 2409 | ||
| 2410 | if (check_caps == 1) | 2410 | if (check_caps == 1) |
| 2411 | ceph_check_caps(ci, CHECK_CAPS_NODELAY|CHECK_CAPS_AUTHONLY, | 2411 | ceph_check_caps(ci, CHECK_CAPS_NODELAY|CHECK_CAPS_AUTHONLY, |
| @@ -2460,7 +2460,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid, | |||
| 2460 | struct ceph_inode_info, | 2460 | struct ceph_inode_info, |
| 2461 | i_flushing_item)->vfs_inode); | 2461 | i_flushing_item)->vfs_inode); |
| 2462 | mdsc->num_cap_flushing--; | 2462 | mdsc->num_cap_flushing--; |
| 2463 | wake_up(&mdsc->cap_flushing_wq); | 2463 | wake_up_all(&mdsc->cap_flushing_wq); |
| 2464 | dout(" inode %p now !flushing\n", inode); | 2464 | dout(" inode %p now !flushing\n", inode); |
| 2465 | 2465 | ||
| 2466 | if (ci->i_dirty_caps == 0) { | 2466 | if (ci->i_dirty_caps == 0) { |
| @@ -2472,7 +2472,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid, | |||
| 2472 | } | 2472 | } |
| 2473 | } | 2473 | } |
| 2474 | spin_unlock(&mdsc->cap_dirty_lock); | 2474 | spin_unlock(&mdsc->cap_dirty_lock); |
| 2475 | wake_up(&ci->i_cap_wq); | 2475 | wake_up_all(&ci->i_cap_wq); |
| 2476 | 2476 | ||
| 2477 | out: | 2477 | out: |
| 2478 | spin_unlock(&inode->i_lock); | 2478 | spin_unlock(&inode->i_lock); |
| @@ -2984,6 +2984,7 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry, | |||
| 2984 | memcpy(*p, dentry->d_name.name, dentry->d_name.len); | 2984 | memcpy(*p, dentry->d_name.name, dentry->d_name.len); |
| 2985 | *p += dentry->d_name.len; | 2985 | *p += dentry->d_name.len; |
| 2986 | rel->dname_seq = cpu_to_le32(di->lease_seq); | 2986 | rel->dname_seq = cpu_to_le32(di->lease_seq); |
| 2987 | __ceph_mdsc_drop_dentry_lease(dentry); | ||
| 2987 | } | 2988 | } |
| 2988 | spin_unlock(&dentry->d_lock); | 2989 | spin_unlock(&dentry->d_lock); |
| 2989 | return ret; | 2990 | return ret; |
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index f85719310db2..f94ed3c7f6a5 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c | |||
| @@ -266,6 +266,7 @@ static int ceph_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 266 | spin_lock(&inode->i_lock); | 266 | spin_lock(&inode->i_lock); |
| 267 | if ((filp->f_pos == 2 || fi->dentry) && | 267 | if ((filp->f_pos == 2 || fi->dentry) && |
| 268 | !ceph_test_opt(client, NOASYNCREADDIR) && | 268 | !ceph_test_opt(client, NOASYNCREADDIR) && |
| 269 | ceph_snap(inode) != CEPH_SNAPDIR && | ||
| 269 | (ci->i_ceph_flags & CEPH_I_COMPLETE) && | 270 | (ci->i_ceph_flags & CEPH_I_COMPLETE) && |
| 270 | __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) { | 271 | __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1)) { |
| 271 | err = __dcache_readdir(filp, dirent, filldir); | 272 | err = __dcache_readdir(filp, dirent, filldir); |
| @@ -1013,18 +1014,22 @@ out_touch: | |||
| 1013 | 1014 | ||
| 1014 | /* | 1015 | /* |
| 1015 | * When a dentry is released, clear the dir I_COMPLETE if it was part | 1016 | * When a dentry is released, clear the dir I_COMPLETE if it was part |
| 1016 | * of the current dir gen. | 1017 | * of the current dir gen or if this is in the snapshot namespace. |
| 1017 | */ | 1018 | */ |
| 1018 | static void ceph_dentry_release(struct dentry *dentry) | 1019 | static void ceph_dentry_release(struct dentry *dentry) |
| 1019 | { | 1020 | { |
| 1020 | struct ceph_dentry_info *di = ceph_dentry(dentry); | 1021 | struct ceph_dentry_info *di = ceph_dentry(dentry); |
| 1021 | struct inode *parent_inode = dentry->d_parent->d_inode; | 1022 | struct inode *parent_inode = dentry->d_parent->d_inode; |
| 1023 | u64 snapid = ceph_snap(parent_inode); | ||
| 1022 | 1024 | ||
| 1023 | if (parent_inode) { | 1025 | dout("dentry_release %p parent %p\n", dentry, parent_inode); |
| 1026 | |||
| 1027 | if (parent_inode && snapid != CEPH_SNAPDIR) { | ||
| 1024 | struct ceph_inode_info *ci = ceph_inode(parent_inode); | 1028 | struct ceph_inode_info *ci = ceph_inode(parent_inode); |
| 1025 | 1029 | ||
| 1026 | spin_lock(&parent_inode->i_lock); | 1030 | spin_lock(&parent_inode->i_lock); |
| 1027 | if (ci->i_shared_gen == di->lease_shared_gen) { | 1031 | if (ci->i_shared_gen == di->lease_shared_gen || |
| 1032 | snapid <= CEPH_MAXSNAP) { | ||
| 1028 | dout(" clearing %p complete (d_release)\n", | 1033 | dout(" clearing %p complete (d_release)\n", |
| 1029 | parent_inode); | 1034 | parent_inode); |
| 1030 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; | 1035 | ci->i_ceph_flags &= ~CEPH_I_COMPLETE; |
| @@ -1241,7 +1246,9 @@ struct dentry_operations ceph_dentry_ops = { | |||
| 1241 | 1246 | ||
| 1242 | struct dentry_operations ceph_snapdir_dentry_ops = { | 1247 | struct dentry_operations ceph_snapdir_dentry_ops = { |
| 1243 | .d_revalidate = ceph_snapdir_d_revalidate, | 1248 | .d_revalidate = ceph_snapdir_d_revalidate, |
| 1249 | .d_release = ceph_dentry_release, | ||
| 1244 | }; | 1250 | }; |
| 1245 | 1251 | ||
| 1246 | struct dentry_operations ceph_snap_dentry_ops = { | 1252 | struct dentry_operations ceph_snap_dentry_ops = { |
| 1253 | .d_release = ceph_dentry_release, | ||
| 1247 | }; | 1254 | }; |
diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 6251a1574b94..7c08698fad3e 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c | |||
| @@ -265,7 +265,7 @@ int ceph_release(struct inode *inode, struct file *file) | |||
| 265 | kmem_cache_free(ceph_file_cachep, cf); | 265 | kmem_cache_free(ceph_file_cachep, cf); |
| 266 | 266 | ||
| 267 | /* wake up anyone waiting for caps on this inode */ | 267 | /* wake up anyone waiting for caps on this inode */ |
| 268 | wake_up(&ci->i_cap_wq); | 268 | wake_up_all(&ci->i_cap_wq); |
| 269 | return 0; | 269 | return 0; |
| 270 | } | 270 | } |
| 271 | 271 | ||
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 8f9b9fe8ef9f..389f9dbd9949 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
| @@ -1199,8 +1199,10 @@ retry_lookup: | |||
| 1199 | goto out; | 1199 | goto out; |
| 1200 | } | 1200 | } |
| 1201 | err = ceph_init_dentry(dn); | 1201 | err = ceph_init_dentry(dn); |
| 1202 | if (err < 0) | 1202 | if (err < 0) { |
| 1203 | dput(dn); | ||
| 1203 | goto out; | 1204 | goto out; |
| 1205 | } | ||
| 1204 | } else if (dn->d_inode && | 1206 | } else if (dn->d_inode && |
| 1205 | (ceph_ino(dn->d_inode) != vino.ino || | 1207 | (ceph_ino(dn->d_inode) != vino.ino || |
| 1206 | ceph_snap(dn->d_inode) != vino.snap)) { | 1208 | ceph_snap(dn->d_inode) != vino.snap)) { |
| @@ -1499,7 +1501,7 @@ retry: | |||
| 1499 | if (wrbuffer_refs == 0) | 1501 | if (wrbuffer_refs == 0) |
| 1500 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); | 1502 | ceph_check_caps(ci, CHECK_CAPS_AUTHONLY, NULL); |
| 1501 | if (wake) | 1503 | if (wake) |
| 1502 | wake_up(&ci->i_cap_wq); | 1504 | wake_up_all(&ci->i_cap_wq); |
| 1503 | } | 1505 | } |
| 1504 | 1506 | ||
| 1505 | 1507 | ||
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c index 416c08d315db..dd440bd438a9 100644 --- a/fs/ceph/mds_client.c +++ b/fs/ceph/mds_client.c | |||
| @@ -868,7 +868,7 @@ static int wake_up_session_cb(struct inode *inode, struct ceph_cap *cap, | |||
| 868 | { | 868 | { |
| 869 | struct ceph_inode_info *ci = ceph_inode(inode); | 869 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 870 | 870 | ||
| 871 | wake_up(&ci->i_cap_wq); | 871 | wake_up_all(&ci->i_cap_wq); |
| 872 | if (arg) { | 872 | if (arg) { |
| 873 | spin_lock(&inode->i_lock); | 873 | spin_lock(&inode->i_lock); |
| 874 | ci->i_wanted_max_size = 0; | 874 | ci->i_wanted_max_size = 0; |
| @@ -1564,7 +1564,7 @@ static void complete_request(struct ceph_mds_client *mdsc, | |||
| 1564 | if (req->r_callback) | 1564 | if (req->r_callback) |
| 1565 | req->r_callback(mdsc, req); | 1565 | req->r_callback(mdsc, req); |
| 1566 | else | 1566 | else |
| 1567 | complete(&req->r_completion); | 1567 | complete_all(&req->r_completion); |
| 1568 | } | 1568 | } |
| 1569 | 1569 | ||
| 1570 | /* | 1570 | /* |
| @@ -1932,7 +1932,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) | |||
| 1932 | if (head->safe) { | 1932 | if (head->safe) { |
| 1933 | req->r_got_safe = true; | 1933 | req->r_got_safe = true; |
| 1934 | __unregister_request(mdsc, req); | 1934 | __unregister_request(mdsc, req); |
| 1935 | complete(&req->r_safe_completion); | 1935 | complete_all(&req->r_safe_completion); |
| 1936 | 1936 | ||
| 1937 | if (req->r_got_unsafe) { | 1937 | if (req->r_got_unsafe) { |
| 1938 | /* | 1938 | /* |
| @@ -1947,7 +1947,7 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg) | |||
| 1947 | 1947 | ||
| 1948 | /* last unsafe request during umount? */ | 1948 | /* last unsafe request during umount? */ |
| 1949 | if (mdsc->stopping && !__get_oldest_req(mdsc)) | 1949 | if (mdsc->stopping && !__get_oldest_req(mdsc)) |
| 1950 | complete(&mdsc->safe_umount_waiters); | 1950 | complete_all(&mdsc->safe_umount_waiters); |
| 1951 | mutex_unlock(&mdsc->mutex); | 1951 | mutex_unlock(&mdsc->mutex); |
| 1952 | goto out; | 1952 | goto out; |
| 1953 | } | 1953 | } |
| @@ -2126,7 +2126,7 @@ static void handle_session(struct ceph_mds_session *session, | |||
| 2126 | pr_info("mds%d reconnect denied\n", session->s_mds); | 2126 | pr_info("mds%d reconnect denied\n", session->s_mds); |
| 2127 | remove_session_caps(session); | 2127 | remove_session_caps(session); |
| 2128 | wake = 1; /* for good measure */ | 2128 | wake = 1; /* for good measure */ |
| 2129 | complete(&mdsc->session_close_waiters); | 2129 | complete_all(&mdsc->session_close_waiters); |
| 2130 | kick_requests(mdsc, mds); | 2130 | kick_requests(mdsc, mds); |
| 2131 | break; | 2131 | break; |
| 2132 | 2132 | ||
diff --git a/fs/ceph/mon_client.c b/fs/ceph/mon_client.c index cc115eafae11..54fe01c50706 100644 --- a/fs/ceph/mon_client.c +++ b/fs/ceph/mon_client.c | |||
| @@ -345,7 +345,7 @@ static void ceph_monc_handle_map(struct ceph_mon_client *monc, | |||
| 345 | 345 | ||
| 346 | out: | 346 | out: |
| 347 | mutex_unlock(&monc->mutex); | 347 | mutex_unlock(&monc->mutex); |
| 348 | wake_up(&client->auth_wq); | 348 | wake_up_all(&client->auth_wq); |
| 349 | } | 349 | } |
| 350 | 350 | ||
| 351 | /* | 351 | /* |
| @@ -462,7 +462,7 @@ static void handle_statfs_reply(struct ceph_mon_client *monc, | |||
| 462 | } | 462 | } |
| 463 | mutex_unlock(&monc->mutex); | 463 | mutex_unlock(&monc->mutex); |
| 464 | if (req) { | 464 | if (req) { |
| 465 | complete(&req->completion); | 465 | complete_all(&req->completion); |
| 466 | put_generic_request(req); | 466 | put_generic_request(req); |
| 467 | } | 467 | } |
| 468 | return; | 468 | return; |
| @@ -718,7 +718,7 @@ static void handle_auth_reply(struct ceph_mon_client *monc, | |||
| 718 | monc->m_auth->front_max); | 718 | monc->m_auth->front_max); |
| 719 | if (ret < 0) { | 719 | if (ret < 0) { |
| 720 | monc->client->auth_err = ret; | 720 | monc->client->auth_err = ret; |
| 721 | wake_up(&monc->client->auth_wq); | 721 | wake_up_all(&monc->client->auth_wq); |
| 722 | } else if (ret > 0) { | 722 | } else if (ret > 0) { |
| 723 | __send_prepared_auth_request(monc, ret); | 723 | __send_prepared_auth_request(monc, ret); |
| 724 | } else if (!was_auth && monc->auth->ops->is_authenticated(monc->auth)) { | 724 | } else if (!was_auth && monc->auth->ops->is_authenticated(monc->auth)) { |
diff --git a/fs/ceph/osd_client.c b/fs/ceph/osd_client.c index 92b7251a53f1..e38522347898 100644 --- a/fs/ceph/osd_client.c +++ b/fs/ceph/osd_client.c | |||
| @@ -862,12 +862,12 @@ static void handle_reply(struct ceph_osd_client *osdc, struct ceph_msg *msg, | |||
| 862 | if (req->r_callback) | 862 | if (req->r_callback) |
| 863 | req->r_callback(req, msg); | 863 | req->r_callback(req, msg); |
| 864 | else | 864 | else |
| 865 | complete(&req->r_completion); | 865 | complete_all(&req->r_completion); |
| 866 | 866 | ||
| 867 | if (flags & CEPH_OSD_FLAG_ONDISK) { | 867 | if (flags & CEPH_OSD_FLAG_ONDISK) { |
| 868 | if (req->r_safe_callback) | 868 | if (req->r_safe_callback) |
| 869 | req->r_safe_callback(req, msg); | 869 | req->r_safe_callback(req, msg); |
| 870 | complete(&req->r_safe_completion); /* fsync waiter */ | 870 | complete_all(&req->r_safe_completion); /* fsync waiter */ |
| 871 | } | 871 | } |
| 872 | 872 | ||
| 873 | done: | 873 | done: |
| @@ -1083,7 +1083,7 @@ done: | |||
| 1083 | if (newmap) | 1083 | if (newmap) |
| 1084 | kick_requests(osdc, NULL); | 1084 | kick_requests(osdc, NULL); |
| 1085 | up_read(&osdc->map_sem); | 1085 | up_read(&osdc->map_sem); |
| 1086 | wake_up(&osdc->client->auth_wq); | 1086 | wake_up_all(&osdc->client->auth_wq); |
| 1087 | return; | 1087 | return; |
| 1088 | 1088 | ||
| 1089 | bad: | 1089 | bad: |
diff --git a/fs/ceph/osdmap.c b/fs/ceph/osdmap.c index 277f8b339577..416d46adbf87 100644 --- a/fs/ceph/osdmap.c +++ b/fs/ceph/osdmap.c | |||
| @@ -831,12 +831,13 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 831 | /* remove any? */ | 831 | /* remove any? */ |
| 832 | while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping, | 832 | while (rbp && pgid_cmp(rb_entry(rbp, struct ceph_pg_mapping, |
| 833 | node)->pgid, pgid) <= 0) { | 833 | node)->pgid, pgid) <= 0) { |
| 834 | struct rb_node *cur = rbp; | 834 | struct ceph_pg_mapping *cur = |
| 835 | rb_entry(rbp, struct ceph_pg_mapping, node); | ||
| 836 | |||
| 835 | rbp = rb_next(rbp); | 837 | rbp = rb_next(rbp); |
| 836 | dout(" removed pg_temp %llx\n", | 838 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); |
| 837 | *(u64 *)&rb_entry(cur, struct ceph_pg_mapping, | 839 | rb_erase(&cur->node, &map->pg_temp); |
| 838 | node)->pgid); | 840 | kfree(cur); |
| 839 | rb_erase(cur, &map->pg_temp); | ||
| 840 | } | 841 | } |
| 841 | 842 | ||
| 842 | if (pglen) { | 843 | if (pglen) { |
| @@ -852,19 +853,22 @@ struct ceph_osdmap *osdmap_apply_incremental(void **p, void *end, | |||
| 852 | for (j = 0; j < pglen; j++) | 853 | for (j = 0; j < pglen; j++) |
| 853 | pg->osds[j] = ceph_decode_32(p); | 854 | pg->osds[j] = ceph_decode_32(p); |
| 854 | err = __insert_pg_mapping(pg, &map->pg_temp); | 855 | err = __insert_pg_mapping(pg, &map->pg_temp); |
| 855 | if (err) | 856 | if (err) { |
| 857 | kfree(pg); | ||
| 856 | goto bad; | 858 | goto bad; |
| 859 | } | ||
| 857 | dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, | 860 | dout(" added pg_temp %llx len %d\n", *(u64 *)&pgid, |
| 858 | pglen); | 861 | pglen); |
| 859 | } | 862 | } |
| 860 | } | 863 | } |
| 861 | while (rbp) { | 864 | while (rbp) { |
| 862 | struct rb_node *cur = rbp; | 865 | struct ceph_pg_mapping *cur = |
| 866 | rb_entry(rbp, struct ceph_pg_mapping, node); | ||
| 867 | |||
| 863 | rbp = rb_next(rbp); | 868 | rbp = rb_next(rbp); |
| 864 | dout(" removed pg_temp %llx\n", | 869 | dout(" removed pg_temp %llx\n", *(u64 *)&cur->pgid); |
| 865 | *(u64 *)&rb_entry(cur, struct ceph_pg_mapping, | 870 | rb_erase(&cur->node, &map->pg_temp); |
| 866 | node)->pgid); | 871 | kfree(cur); |
| 867 | rb_erase(cur, &map->pg_temp); | ||
| 868 | } | 872 | } |
| 869 | 873 | ||
| 870 | /* ignore the rest */ | 874 | /* ignore the rest */ |
