Merge tag 'staging-4.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[sfrench/cifs-2.6.git] / drivers / staging / erofs / utils.c
index ddd220ac33fd6122bad0f5731be364bf7540eeff..ea8a962e5c9504a2c2f7f54e744b10da9bdc1048 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);