btrfs: convert btrfs_dio_private->pending_bios to refcount_t
authorOmar Sandoval <osandov@fb.com>
Thu, 16 Apr 2020 21:46:20 +0000 (14:46 -0700)
committerDavid Sterba <dsterba@suse.com>
Mon, 25 May 2020 09:25:26 +0000 (11:25 +0200)
This is really a reference count now, so convert it to refcount_t and
rename it to refs.

Reviewed-by: Nikolay Borisov <nborisov@suse.com>
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/btrfs_inode.h
fs/btrfs/inode.c

index ad36685..b965fa5 100644 (file)
@@ -7,6 +7,7 @@
 #define BTRFS_INODE_H
 
 #include <linux/hash.h>
+#include <linux/refcount.h>
 #include "extent_map.h"
 #include "extent_io.h"
 #include "ordered-data.h"
@@ -302,8 +303,11 @@ struct btrfs_dio_private {
        u64 disk_bytenr;
        u64 bytes;
 
-       /* number of bios pending for this dio */
-       atomic_t pending_bios;
+       /*
+        * References to this structure. There is one reference per in-flight
+        * bio plus one while we're still setting up.
+        */
+       refcount_t refs;
 
        /* IO errors */
        int errors;
index 6a240d8..a487454 100644 (file)
@@ -7811,7 +7811,7 @@ static void btrfs_end_dio_bio(struct bio *bio)
        }
 
        /* if there are more bios still pending for this dio, just exit */
-       if (!atomic_dec_and_test(&dip->pending_bios))
+       if (!refcount_dec_and_test(&dip->refs))
                goto out;
 
        if (dip->errors) {
@@ -7929,7 +7929,7 @@ static struct btrfs_dio_private *btrfs_create_dio_private(struct bio *dio_bio,
        dip->disk_bytenr = (u64)dio_bio->bi_iter.bi_sector << 9;
        dip->orig_bio = bio;
        dip->dio_bio = dio_bio;
-       atomic_set(&dip->pending_bios, 1);
+       refcount_set(&dip->refs, 1);
 
        if (write) {
                struct btrfs_dio_data *dio_data = current->journal_info;
@@ -8025,13 +8025,13 @@ static void btrfs_submit_direct(struct bio *dio_bio, struct inode *inode,
                 * count. Otherwise, the dip might get freed before we're
                 * done setting it up.
                 */
-               atomic_inc(&dip->pending_bios);
+               refcount_inc(&dip->refs);
 
                status = btrfs_submit_dio_bio(bio, inode, file_offset,
                                                async_submit);
                if (status) {
                        bio_put(bio);
-                       atomic_dec(&dip->pending_bios);
+                       refcount_dec(&dip->refs);
                        goto out_err;
                }
 
@@ -8060,7 +8060,7 @@ out_err:
         * atomic operations with a return value are fully ordered as per
         * atomic_t.txt
         */
-       if (atomic_dec_and_test(&dip->pending_bios))
+       if (refcount_dec_and_test(&dip->refs))
                bio_io_error(dip->orig_bio);
 }