Skip to content

Commit 4ff47df

Browse files
maharmstonekdave
authored andcommitted
btrfs: move priv off stack in btrfs_encoded_read_regular_fill_pages()
Change btrfs_encoded_read_regular_fill_pages() so that the priv struct is allocated rather than stored on the stack, in preparation for adding an asynchronous mode to the function. Signed-off-by: Mark Harmstone <maharmstone@fb.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
1 parent 1729a27 commit 4ff47df

File tree

1 file changed

+18
-11
lines changed

1 file changed

+18
-11
lines changed

fs/btrfs/inode.c

+18-11
Original file line numberDiff line numberDiff line change
@@ -9085,28 +9085,33 @@ int btrfs_encoded_read_regular_fill_pages(struct btrfs_inode *inode,
90859085
struct page **pages)
90869086
{
90879087
struct btrfs_fs_info *fs_info = inode->root->fs_info;
9088-
struct btrfs_encoded_read_private priv = {
9089-
.pending = ATOMIC_INIT(1),
9090-
};
9088+
struct btrfs_encoded_read_private *priv;
90919089
unsigned long i = 0;
90929090
struct btrfs_bio *bbio;
9091+
int ret;
90939092

9094-
init_waitqueue_head(&priv.wait);
9093+
priv = kmalloc(sizeof(struct btrfs_encoded_read_private), GFP_NOFS);
9094+
if (!priv)
9095+
return -ENOMEM;
9096+
9097+
init_waitqueue_head(&priv->wait);
9098+
atomic_set(&priv->pending, 1);
9099+
priv->status = 0;
90959100

90969101
bbio = btrfs_bio_alloc(BIO_MAX_VECS, REQ_OP_READ, fs_info,
9097-
btrfs_encoded_read_endio, &priv);
9102+
btrfs_encoded_read_endio, priv);
90989103
bbio->bio.bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT;
90999104
bbio->inode = inode;
91009105

91019106
do {
91029107
size_t bytes = min_t(u64, disk_io_size, PAGE_SIZE);
91039108

91049109
if (bio_add_page(&bbio->bio, pages[i], bytes, 0) < bytes) {
9105-
atomic_inc(&priv.pending);
9110+
atomic_inc(&priv->pending);
91069111
btrfs_submit_bbio(bbio, 0);
91079112

91089113
bbio = btrfs_bio_alloc(BIO_MAX_VECS, REQ_OP_READ, fs_info,
9109-
btrfs_encoded_read_endio, &priv);
9114+
btrfs_encoded_read_endio, priv);
91109115
bbio->bio.bi_iter.bi_sector = disk_bytenr >> SECTOR_SHIFT;
91119116
bbio->inode = inode;
91129117
continue;
@@ -9117,13 +9122,15 @@ int btrfs_encoded_read_regular_fill_pages(struct btrfs_inode *inode,
91179122
disk_io_size -= bytes;
91189123
} while (disk_io_size);
91199124

9120-
atomic_inc(&priv.pending);
9125+
atomic_inc(&priv->pending);
91219126
btrfs_submit_bbio(bbio, 0);
91229127

9123-
if (atomic_dec_return(&priv.pending))
9124-
io_wait_event(priv.wait, !atomic_read(&priv.pending));
9128+
if (atomic_dec_return(&priv->pending))
9129+
io_wait_event(priv->wait, !atomic_read(&priv->pending));
91259130
/* See btrfs_encoded_read_endio() for ordering. */
9126-
return blk_status_to_errno(READ_ONCE(priv.status));
9131+
ret = blk_status_to_errno(READ_ONCE(priv->status));
9132+
kfree(priv);
9133+
return ret;
91279134
}
91289135

91299136
ssize_t btrfs_encoded_read_regular(struct kiocb *iocb, struct iov_iter *iter,

0 commit comments

Comments
 (0)