xarray: Replace exceptional entries
[sfrench/cifs-2.6.git] / drivers / staging / erofs / utils.c
index 595cf90af9bb2f98a5695e38070c7616e84ba208..bdee9bd09f11fac0e5a426e74bb75b5525492a85 100644 (file)
@@ -35,7 +35,6 @@ static atomic_long_t erofs_global_shrink_cnt;
 
 #ifdef CONFIG_EROFS_FS_ZIP
 
-/* radix_tree and the future XArray both don't use tagptr_t yet */
 struct erofs_workgroup *erofs_find_workgroup(
        struct super_block *sb, pgoff_t index, bool *tag)
 {
@@ -47,9 +46,8 @@ repeat:
        rcu_read_lock();
        grp = radix_tree_lookup(&sbi->workstn_tree, index);
        if (grp != NULL) {
-               *tag = radix_tree_exceptional_entry(grp);
-               grp = (void *)((unsigned long)grp &
-                       ~RADIX_TREE_EXCEPTIONAL_ENTRY);
+               *tag = xa_pointer_tag(grp);
+               grp = xa_untag_pointer(grp);
 
                if (erofs_workgroup_get(grp, &oldcount)) {
                        /* prefer to relax rcu read side */
@@ -83,9 +81,7 @@ int erofs_register_workgroup(struct super_block *sb,
        sbi = EROFS_SB(sb);
        erofs_workstn_lock(sbi);
 
-       if (tag)
-               grp = (void *)((unsigned long)grp |
-                       1UL << RADIX_TREE_EXCEPTIONAL_SHIFT);
+       grp = xa_tag_pointer(grp, tag);
 
        err = radix_tree_insert(&sbi->workstn_tree,
                grp->index, grp);
@@ -131,9 +127,7 @@ repeat:
 
        for (i = 0; i < found; ++i) {
                int cnt;
-               struct erofs_workgroup *grp = (void *)
-                       ((unsigned long)batch[i] &
-                               ~RADIX_TREE_EXCEPTIONAL_ENTRY);
+               struct erofs_workgroup *grp = xa_untag_pointer(batch[i]);
 
                first_index = grp->index + 1;
 
@@ -150,8 +144,8 @@ repeat:
 #endif
                        continue;
 
-               if (radix_tree_delete(&sbi->workstn_tree,
-                       grp->index) != grp) {
+               if (xa_untag_pointer(radix_tree_delete(&sbi->workstn_tree,
+                       grp->index)) != grp) {
 #ifdef EROFS_FS_HAS_MANAGED_CACHE
 skip:
                        erofs_workgroup_unfreeze(grp, 1);