diff options
author | Alexander Block <ablock84@googlemail.com> | 2012-07-28 10:18:58 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2012-10-01 15:18:53 -0400 |
commit | 34d73f54e2e2227cece751f168d08d3103092992 (patch) | |
tree | 08993b77d664256059a6d6bb97d10e67fdb753f8 | |
parent | 7e0926fe5f20b5c88e51cba68512302b10f73d2a (diff) |
Btrfs: make aux field of ulist 64 bit
Btrfs send/receive uses the aux field to store inode numbers. On
32 bit machines this may become a problem.
Also fix all users of ulist_add and ulist_add_merged.
Reported-by: Arne Jansen <sensille@gmx.net>
Signed-off-by: Alexander Block <ablock84@googlemail.com>
-rw-r--r-- | fs/btrfs/backref.c | 8 | ||||
-rw-r--r-- | fs/btrfs/qgroup.c | 20 | ||||
-rw-r--r-- | fs/btrfs/ulist.c | 7 | ||||
-rw-r--r-- | fs/btrfs/ulist.h | 9 |
4 files changed, 21 insertions, 23 deletions
diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c index ff6475f409d6..6655ca615364 100644 --- a/fs/btrfs/backref.c +++ b/fs/btrfs/backref.c | |||
@@ -231,7 +231,7 @@ static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path, | |||
231 | } | 231 | } |
232 | if (!ret) { | 232 | if (!ret) { |
233 | ret = ulist_add(parents, eb->start, | 233 | ret = ulist_add(parents, eb->start, |
234 | (unsigned long)eie, GFP_NOFS); | 234 | (u64)eie, GFP_NOFS); |
235 | if (ret < 0) | 235 | if (ret < 0) |
236 | break; | 236 | break; |
237 | if (!extent_item_pos) { | 237 | if (!extent_item_pos) { |
@@ -914,8 +914,8 @@ again: | |||
914 | free_extent_buffer(eb); | 914 | free_extent_buffer(eb); |
915 | } | 915 | } |
916 | ret = ulist_add_merge(refs, ref->parent, | 916 | ret = ulist_add_merge(refs, ref->parent, |
917 | (unsigned long)ref->inode_list, | 917 | (u64)ref->inode_list, |
918 | (unsigned long *)&eie, GFP_NOFS); | 918 | (u64 *)&eie, GFP_NOFS); |
919 | if (!ret && extent_item_pos) { | 919 | if (!ret && extent_item_pos) { |
920 | /* | 920 | /* |
921 | * we've recorded that parent, so we must extend | 921 | * we've recorded that parent, so we must extend |
@@ -1404,7 +1404,7 @@ int iterate_extent_inodes(struct btrfs_fs_info *fs_info, | |||
1404 | ULIST_ITER_INIT(&root_uiter); | 1404 | ULIST_ITER_INIT(&root_uiter); |
1405 | while (!ret && (root_node = ulist_next(roots, &root_uiter))) { | 1405 | while (!ret && (root_node = ulist_next(roots, &root_uiter))) { |
1406 | pr_debug("root %llu references leaf %llu, data list " | 1406 | pr_debug("root %llu references leaf %llu, data list " |
1407 | "%#lx\n", root_node->val, ref_node->val, | 1407 | "%#llx\n", root_node->val, ref_node->val, |
1408 | ref_node->aux); | 1408 | ref_node->aux); |
1409 | ret = iterate_leaf_refs( | 1409 | ret = iterate_leaf_refs( |
1410 | (struct extent_inode_elem *)ref_node->aux, | 1410 | (struct extent_inode_elem *)ref_node->aux, |
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index b65015581744..24f6adcdf339 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
@@ -1145,7 +1145,7 @@ int btrfs_qgroup_account_ref(struct btrfs_trans_handle *trans, | |||
1145 | 1145 | ||
1146 | ulist_reinit(tmp); | 1146 | ulist_reinit(tmp); |
1147 | /* XXX id not needed */ | 1147 | /* XXX id not needed */ |
1148 | ulist_add(tmp, qg->qgroupid, (unsigned long)qg, GFP_ATOMIC); | 1148 | ulist_add(tmp, qg->qgroupid, (u64)qg, GFP_ATOMIC); |
1149 | ULIST_ITER_INIT(&tmp_uiter); | 1149 | ULIST_ITER_INIT(&tmp_uiter); |
1150 | while ((tmp_unode = ulist_next(tmp, &tmp_uiter))) { | 1150 | while ((tmp_unode = ulist_next(tmp, &tmp_uiter))) { |
1151 | struct btrfs_qgroup_list *glist; | 1151 | struct btrfs_qgroup_list *glist; |
@@ -1158,7 +1158,7 @@ int btrfs_qgroup_account_ref(struct btrfs_trans_handle *trans, | |||
1158 | 1158 | ||
1159 | list_for_each_entry(glist, &qg->groups, next_group) { | 1159 | list_for_each_entry(glist, &qg->groups, next_group) { |
1160 | ulist_add(tmp, glist->group->qgroupid, | 1160 | ulist_add(tmp, glist->group->qgroupid, |
1161 | (unsigned long)glist->group, | 1161 | (u64)glist->group, |
1162 | GFP_ATOMIC); | 1162 | GFP_ATOMIC); |
1163 | } | 1163 | } |
1164 | } | 1164 | } |
@@ -1168,7 +1168,7 @@ int btrfs_qgroup_account_ref(struct btrfs_trans_handle *trans, | |||
1168 | * step 2: walk from the new root | 1168 | * step 2: walk from the new root |
1169 | */ | 1169 | */ |
1170 | ulist_reinit(tmp); | 1170 | ulist_reinit(tmp); |
1171 | ulist_add(tmp, qgroup->qgroupid, (unsigned long)qgroup, GFP_ATOMIC); | 1171 | ulist_add(tmp, qgroup->qgroupid, (u64)qgroup, GFP_ATOMIC); |
1172 | ULIST_ITER_INIT(&uiter); | 1172 | ULIST_ITER_INIT(&uiter); |
1173 | while ((unode = ulist_next(tmp, &uiter))) { | 1173 | while ((unode = ulist_next(tmp, &uiter))) { |
1174 | struct btrfs_qgroup *qg; | 1174 | struct btrfs_qgroup *qg; |
@@ -1190,7 +1190,7 @@ int btrfs_qgroup_account_ref(struct btrfs_trans_handle *trans, | |||
1190 | 1190 | ||
1191 | list_for_each_entry(glist, &qg->groups, next_group) { | 1191 | list_for_each_entry(glist, &qg->groups, next_group) { |
1192 | ulist_add(tmp, glist->group->qgroupid, | 1192 | ulist_add(tmp, glist->group->qgroupid, |
1193 | (unsigned long)glist->group, GFP_ATOMIC); | 1193 | (u64)glist->group, GFP_ATOMIC); |
1194 | } | 1194 | } |
1195 | } | 1195 | } |
1196 | 1196 | ||
@@ -1208,7 +1208,7 @@ int btrfs_qgroup_account_ref(struct btrfs_trans_handle *trans, | |||
1208 | continue; | 1208 | continue; |
1209 | 1209 | ||
1210 | ulist_reinit(tmp); | 1210 | ulist_reinit(tmp); |
1211 | ulist_add(tmp, qg->qgroupid, (unsigned long)qg, GFP_ATOMIC); | 1211 | ulist_add(tmp, qg->qgroupid, (u64)qg, GFP_ATOMIC); |
1212 | ULIST_ITER_INIT(&tmp_uiter); | 1212 | ULIST_ITER_INIT(&tmp_uiter); |
1213 | while ((tmp_unode = ulist_next(tmp, &tmp_uiter))) { | 1213 | while ((tmp_unode = ulist_next(tmp, &tmp_uiter))) { |
1214 | struct btrfs_qgroup_list *glist; | 1214 | struct btrfs_qgroup_list *glist; |
@@ -1225,7 +1225,7 @@ int btrfs_qgroup_account_ref(struct btrfs_trans_handle *trans, | |||
1225 | 1225 | ||
1226 | list_for_each_entry(glist, &qg->groups, next_group) { | 1226 | list_for_each_entry(glist, &qg->groups, next_group) { |
1227 | ulist_add(tmp, glist->group->qgroupid, | 1227 | ulist_add(tmp, glist->group->qgroupid, |
1228 | (unsigned long)glist->group, | 1228 | (u64)glist->group, |
1229 | GFP_ATOMIC); | 1229 | GFP_ATOMIC); |
1230 | } | 1230 | } |
1231 | } | 1231 | } |
@@ -1469,7 +1469,7 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes) | |||
1469 | * be exceeded | 1469 | * be exceeded |
1470 | */ | 1470 | */ |
1471 | ulist = ulist_alloc(GFP_ATOMIC); | 1471 | ulist = ulist_alloc(GFP_ATOMIC); |
1472 | ulist_add(ulist, qgroup->qgroupid, (unsigned long)qgroup, GFP_ATOMIC); | 1472 | ulist_add(ulist, qgroup->qgroupid, (u64)qgroup, GFP_ATOMIC); |
1473 | ULIST_ITER_INIT(&uiter); | 1473 | ULIST_ITER_INIT(&uiter); |
1474 | while ((unode = ulist_next(ulist, &uiter))) { | 1474 | while ((unode = ulist_next(ulist, &uiter))) { |
1475 | struct btrfs_qgroup *qg; | 1475 | struct btrfs_qgroup *qg; |
@@ -1489,7 +1489,7 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes) | |||
1489 | 1489 | ||
1490 | list_for_each_entry(glist, &qg->groups, next_group) { | 1490 | list_for_each_entry(glist, &qg->groups, next_group) { |
1491 | ulist_add(ulist, glist->group->qgroupid, | 1491 | ulist_add(ulist, glist->group->qgroupid, |
1492 | (unsigned long)glist->group, GFP_ATOMIC); | 1492 | (u64)glist->group, GFP_ATOMIC); |
1493 | } | 1493 | } |
1494 | } | 1494 | } |
1495 | if (ret) | 1495 | if (ret) |
@@ -1541,7 +1541,7 @@ void btrfs_qgroup_free(struct btrfs_root *root, u64 num_bytes) | |||
1541 | goto out; | 1541 | goto out; |
1542 | 1542 | ||
1543 | ulist = ulist_alloc(GFP_ATOMIC); | 1543 | ulist = ulist_alloc(GFP_ATOMIC); |
1544 | ulist_add(ulist, qgroup->qgroupid, (unsigned long)qgroup, GFP_ATOMIC); | 1544 | ulist_add(ulist, qgroup->qgroupid, (u64)qgroup, GFP_ATOMIC); |
1545 | ULIST_ITER_INIT(&uiter); | 1545 | ULIST_ITER_INIT(&uiter); |
1546 | while ((unode = ulist_next(ulist, &uiter))) { | 1546 | while ((unode = ulist_next(ulist, &uiter))) { |
1547 | struct btrfs_qgroup *qg; | 1547 | struct btrfs_qgroup *qg; |
@@ -1553,7 +1553,7 @@ void btrfs_qgroup_free(struct btrfs_root *root, u64 num_bytes) | |||
1553 | 1553 | ||
1554 | list_for_each_entry(glist, &qg->groups, next_group) { | 1554 | list_for_each_entry(glist, &qg->groups, next_group) { |
1555 | ulist_add(ulist, glist->group->qgroupid, | 1555 | ulist_add(ulist, glist->group->qgroupid, |
1556 | (unsigned long)glist->group, GFP_ATOMIC); | 1556 | (u64)glist->group, GFP_ATOMIC); |
1557 | } | 1557 | } |
1558 | } | 1558 | } |
1559 | 1559 | ||
diff --git a/fs/btrfs/ulist.c b/fs/btrfs/ulist.c index ab942f46b3dd..99be4c138db6 100644 --- a/fs/btrfs/ulist.c +++ b/fs/btrfs/ulist.c | |||
@@ -143,14 +143,13 @@ EXPORT_SYMBOL(ulist_free); | |||
143 | * In case of allocation failure -ENOMEM is returned and the ulist stays | 143 | * In case of allocation failure -ENOMEM is returned and the ulist stays |
144 | * unaltered. | 144 | * unaltered. |
145 | */ | 145 | */ |
146 | int ulist_add(struct ulist *ulist, u64 val, unsigned long aux, | 146 | int ulist_add(struct ulist *ulist, u64 val, u64 aux, gfp_t gfp_mask) |
147 | gfp_t gfp_mask) | ||
148 | { | 147 | { |
149 | return ulist_add_merge(ulist, val, aux, NULL, gfp_mask); | 148 | return ulist_add_merge(ulist, val, aux, NULL, gfp_mask); |
150 | } | 149 | } |
151 | 150 | ||
152 | int ulist_add_merge(struct ulist *ulist, u64 val, unsigned long aux, | 151 | int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux, |
153 | unsigned long *old_aux, gfp_t gfp_mask) | 152 | u64 *old_aux, gfp_t gfp_mask) |
154 | { | 153 | { |
155 | int i; | 154 | int i; |
156 | 155 | ||
diff --git a/fs/btrfs/ulist.h b/fs/btrfs/ulist.h index 21bdc8ec8130..21a1963439c3 100644 --- a/fs/btrfs/ulist.h +++ b/fs/btrfs/ulist.h | |||
@@ -33,7 +33,7 @@ struct ulist_iterator { | |||
33 | */ | 33 | */ |
34 | struct ulist_node { | 34 | struct ulist_node { |
35 | u64 val; /* value to store */ | 35 | u64 val; /* value to store */ |
36 | unsigned long aux; /* auxiliary value saved along with the val */ | 36 | u64 aux; /* auxiliary value saved along with the val */ |
37 | }; | 37 | }; |
38 | 38 | ||
39 | struct ulist { | 39 | struct ulist { |
@@ -65,10 +65,9 @@ void ulist_fini(struct ulist *ulist); | |||
65 | void ulist_reinit(struct ulist *ulist); | 65 | void ulist_reinit(struct ulist *ulist); |
66 | struct ulist *ulist_alloc(gfp_t gfp_mask); | 66 | struct ulist *ulist_alloc(gfp_t gfp_mask); |
67 | void ulist_free(struct ulist *ulist); | 67 | void ulist_free(struct ulist *ulist); |
68 | int ulist_add(struct ulist *ulist, u64 val, unsigned long aux, | 68 | int ulist_add(struct ulist *ulist, u64 val, u64 aux, gfp_t gfp_mask); |
69 | gfp_t gfp_mask); | 69 | int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux, |
70 | int ulist_add_merge(struct ulist *ulist, u64 val, unsigned long aux, | 70 | u64 *old_aux, gfp_t gfp_mask); |
71 | unsigned long *old_aux, gfp_t gfp_mask); | ||
72 | struct ulist_node *ulist_next(struct ulist *ulist, | 71 | struct ulist_node *ulist_next(struct ulist *ulist, |
73 | struct ulist_iterator *uiter); | 72 | struct ulist_iterator *uiter); |
74 | 73 | ||