]> git.ipfire.org Git - people/ms/linux.git/blobdiff - fs/afs/volume.c
Merge branch 'for-6.0/dax' into libnvdimm-fixes
[people/ms/linux.git] / fs / afs / volume.c
index cc665cef0abe4cd9f8ac91315be1bda91f9b2282..f4937029dcd72493ff242b9e923df83ad68e42f6 100644 (file)
@@ -52,7 +52,7 @@ static void afs_remove_volume_from_cell(struct afs_volume *volume)
        struct afs_cell *cell = volume->cell;
 
        if (!hlist_unhashed(&volume->proc_link)) {
-               trace_afs_volume(volume->vid, atomic_read(&volume->usage),
+               trace_afs_volume(volume->vid, refcount_read(&cell->ref),
                                 afs_volume_trace_remove);
                write_seqlock(&cell->volume_lock);
                hlist_del_rcu(&volume->proc_link);
@@ -87,7 +87,7 @@ static struct afs_volume *afs_alloc_volume(struct afs_fs_context *params,
        volume->type_force      = params->force;
        volume->name_len        = vldb->name_len;
 
-       atomic_set(&volume->usage, 1);
+       refcount_set(&volume->ref, 1);
        INIT_HLIST_NODE(&volume->proc_link);
        rwlock_init(&volume->servers_lock);
        rwlock_init(&volume->cb_v_break_lock);
@@ -228,7 +228,7 @@ static void afs_destroy_volume(struct afs_net *net, struct afs_volume *volume)
        afs_remove_volume_from_cell(volume);
        afs_put_serverlist(net, rcu_access_pointer(volume->servers));
        afs_put_cell(volume->cell, afs_cell_trace_put_vol);
-       trace_afs_volume(volume->vid, atomic_read(&volume->usage),
+       trace_afs_volume(volume->vid, refcount_read(&volume->ref),
                         afs_volume_trace_free);
        kfree_rcu(volume, rcu);
 
@@ -242,8 +242,10 @@ struct afs_volume *afs_get_volume(struct afs_volume *volume,
                                  enum afs_volume_trace reason)
 {
        if (volume) {
-               int u = atomic_inc_return(&volume->usage);
-               trace_afs_volume(volume->vid, u, reason);
+               int r;
+
+               __refcount_inc(&volume->ref, &r);
+               trace_afs_volume(volume->vid, r + 1, reason);
        }
        return volume;
 }
@@ -257,9 +259,12 @@ void afs_put_volume(struct afs_net *net, struct afs_volume *volume,
 {
        if (volume) {
                afs_volid_t vid = volume->vid;
-               int u = atomic_dec_return(&volume->usage);
-               trace_afs_volume(vid, u, reason);
-               if (u == 0)
+               bool zero;
+               int r;
+
+               zero = __refcount_dec_and_test(&volume->ref, &r);
+               trace_afs_volume(vid, r - 1, reason);
+               if (zero)
                        afs_destroy_volume(net, volume);
        }
 }