diff options
Diffstat (limited to 'fs/btrfs/qgroup.c')
| -rw-r--r-- | fs/btrfs/qgroup.c | 40 |
1 files changed, 24 insertions, 16 deletions
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c index b65015581744..5039686df6ae 100644 --- a/fs/btrfs/qgroup.c +++ b/fs/btrfs/qgroup.c | |||
| @@ -1145,12 +1145,12 @@ 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)(uintptr_t)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; |
| 1152 | 1152 | ||
| 1153 | qg = (struct btrfs_qgroup *)tmp_unode->aux; | 1153 | qg = (struct btrfs_qgroup *)(uintptr_t)tmp_unode->aux; |
| 1154 | if (qg->refcnt < seq) | 1154 | if (qg->refcnt < seq) |
| 1155 | qg->refcnt = seq + 1; | 1155 | qg->refcnt = seq + 1; |
| 1156 | else | 1156 | else |
| @@ -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)(uintptr_t)glist->group, |
| 1162 | GFP_ATOMIC); | 1162 | GFP_ATOMIC); |
| 1163 | } | 1163 | } |
| 1164 | } | 1164 | } |
| @@ -1168,13 +1168,13 @@ 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, (uintptr_t)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; |
| 1175 | struct btrfs_qgroup_list *glist; | 1175 | struct btrfs_qgroup_list *glist; |
| 1176 | 1176 | ||
| 1177 | qg = (struct btrfs_qgroup *)unode->aux; | 1177 | qg = (struct btrfs_qgroup *)(uintptr_t)unode->aux; |
| 1178 | if (qg->refcnt < seq) { | 1178 | if (qg->refcnt < seq) { |
| 1179 | /* not visited by step 1 */ | 1179 | /* not visited by step 1 */ |
| 1180 | qg->rfer += sgn * node->num_bytes; | 1180 | qg->rfer += sgn * node->num_bytes; |
| @@ -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 | (uintptr_t)glist->group, GFP_ATOMIC); |
| 1194 | } | 1194 | } |
| 1195 | } | 1195 | } |
| 1196 | 1196 | ||
| @@ -1208,12 +1208,12 @@ 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, (uintptr_t)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; |
| 1215 | 1215 | ||
| 1216 | qg = (struct btrfs_qgroup *)tmp_unode->aux; | 1216 | qg = (struct btrfs_qgroup *)(uintptr_t)tmp_unode->aux; |
| 1217 | if (qg->tag == seq) | 1217 | if (qg->tag == seq) |
| 1218 | continue; | 1218 | continue; |
| 1219 | 1219 | ||
| @@ -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 | (uintptr_t)glist->group, |
| 1229 | GFP_ATOMIC); | 1229 | GFP_ATOMIC); |
| 1230 | } | 1230 | } |
| 1231 | } | 1231 | } |
| @@ -1469,13 +1469,17 @@ 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 | if (!ulist) { |
| 1473 | ret = -ENOMEM; | ||
| 1474 | goto out; | ||
| 1475 | } | ||
| 1476 | ulist_add(ulist, qgroup->qgroupid, (uintptr_t)qgroup, GFP_ATOMIC); | ||
| 1473 | ULIST_ITER_INIT(&uiter); | 1477 | ULIST_ITER_INIT(&uiter); |
| 1474 | while ((unode = ulist_next(ulist, &uiter))) { | 1478 | while ((unode = ulist_next(ulist, &uiter))) { |
| 1475 | struct btrfs_qgroup *qg; | 1479 | struct btrfs_qgroup *qg; |
| 1476 | struct btrfs_qgroup_list *glist; | 1480 | struct btrfs_qgroup_list *glist; |
| 1477 | 1481 | ||
| 1478 | qg = (struct btrfs_qgroup *)unode->aux; | 1482 | qg = (struct btrfs_qgroup *)(uintptr_t)unode->aux; |
| 1479 | 1483 | ||
| 1480 | if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) && | 1484 | if ((qg->lim_flags & BTRFS_QGROUP_LIMIT_MAX_RFER) && |
| 1481 | qg->reserved + qg->rfer + num_bytes > | 1485 | qg->reserved + qg->rfer + num_bytes > |
| @@ -1489,7 +1493,7 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes) | |||
| 1489 | 1493 | ||
| 1490 | list_for_each_entry(glist, &qg->groups, next_group) { | 1494 | list_for_each_entry(glist, &qg->groups, next_group) { |
| 1491 | ulist_add(ulist, glist->group->qgroupid, | 1495 | ulist_add(ulist, glist->group->qgroupid, |
| 1492 | (unsigned long)glist->group, GFP_ATOMIC); | 1496 | (uintptr_t)glist->group, GFP_ATOMIC); |
| 1493 | } | 1497 | } |
| 1494 | } | 1498 | } |
| 1495 | if (ret) | 1499 | if (ret) |
| @@ -1502,7 +1506,7 @@ int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes) | |||
| 1502 | while ((unode = ulist_next(ulist, &uiter))) { | 1506 | while ((unode = ulist_next(ulist, &uiter))) { |
| 1503 | struct btrfs_qgroup *qg; | 1507 | struct btrfs_qgroup *qg; |
| 1504 | 1508 | ||
| 1505 | qg = (struct btrfs_qgroup *)unode->aux; | 1509 | qg = (struct btrfs_qgroup *)(uintptr_t)unode->aux; |
| 1506 | 1510 | ||
| 1507 | qg->reserved += num_bytes; | 1511 | qg->reserved += num_bytes; |
| 1508 | } | 1512 | } |
| @@ -1541,19 +1545,23 @@ void btrfs_qgroup_free(struct btrfs_root *root, u64 num_bytes) | |||
| 1541 | goto out; | 1545 | goto out; |
| 1542 | 1546 | ||
| 1543 | ulist = ulist_alloc(GFP_ATOMIC); | 1547 | ulist = ulist_alloc(GFP_ATOMIC); |
| 1544 | ulist_add(ulist, qgroup->qgroupid, (unsigned long)qgroup, GFP_ATOMIC); | 1548 | if (!ulist) { |
| 1549 | btrfs_std_error(fs_info, -ENOMEM); | ||
| 1550 | goto out; | ||
| 1551 | } | ||
| 1552 | ulist_add(ulist, qgroup->qgroupid, (uintptr_t)qgroup, GFP_ATOMIC); | ||
| 1545 | ULIST_ITER_INIT(&uiter); | 1553 | ULIST_ITER_INIT(&uiter); |
| 1546 | while ((unode = ulist_next(ulist, &uiter))) { | 1554 | while ((unode = ulist_next(ulist, &uiter))) { |
| 1547 | struct btrfs_qgroup *qg; | 1555 | struct btrfs_qgroup *qg; |
| 1548 | struct btrfs_qgroup_list *glist; | 1556 | struct btrfs_qgroup_list *glist; |
| 1549 | 1557 | ||
| 1550 | qg = (struct btrfs_qgroup *)unode->aux; | 1558 | qg = (struct btrfs_qgroup *)(uintptr_t)unode->aux; |
| 1551 | 1559 | ||
| 1552 | qg->reserved -= num_bytes; | 1560 | qg->reserved -= num_bytes; |
| 1553 | 1561 | ||
| 1554 | list_for_each_entry(glist, &qg->groups, next_group) { | 1562 | list_for_each_entry(glist, &qg->groups, next_group) { |
| 1555 | ulist_add(ulist, glist->group->qgroupid, | 1563 | ulist_add(ulist, glist->group->qgroupid, |
| 1556 | (unsigned long)glist->group, GFP_ATOMIC); | 1564 | (uintptr_t)glist->group, GFP_ATOMIC); |
| 1557 | } | 1565 | } |
| 1558 | } | 1566 | } |
| 1559 | 1567 | ||
