summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOmar Sandoval <osandov@fb.com>2020-04-16 14:46:20 -0700
committerDavid Sterba <dsterba@suse.com>2020-05-25 11:25:26 +0200
commite3b318d14df7d6d04f37ce10f9a2f33ca3d550be (patch)
tree1168eeee23b8241c447b1f695e65c107967b1186
parent2390a6daf92d241b23bc02687bfb9fabdf93f117 (diff)
downloadlinux-e3b318d14df7d6d04f37ce10f9a2f33ca3d550be.tar.bz2
btrfs: convert btrfs_dio_private->pending_bios to refcount_t
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>
-rw-r--r--fs/btrfs/btrfs_inode.h8
-rw-r--r--fs/btrfs/inode.c10
2 files changed, 11 insertions, 7 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index ad36685ce046..b965fa5429ec 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -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;
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 6a240d846017..a487454b049d 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -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);
}