@@ -9122,13 +9122,11 @@ int btrfs_encoded_read_regular_fill_pages(struct btrfs_inode *inode,
9122
9122
return blk_status_to_errno (READ_ONCE (priv .status ));
9123
9123
}
9124
9124
9125
- static ssize_t btrfs_encoded_read_regular (struct kiocb * iocb ,
9126
- struct iov_iter * iter ,
9127
- u64 start , u64 lockend ,
9128
- struct extent_state * * cached_state ,
9129
- u64 disk_bytenr , u64 disk_io_size ,
9130
- size_t count , bool compressed ,
9131
- bool * unlocked )
9125
+ ssize_t btrfs_encoded_read_regular (struct kiocb * iocb , struct iov_iter * iter ,
9126
+ u64 start , u64 lockend ,
9127
+ struct extent_state * * cached_state ,
9128
+ u64 disk_bytenr , u64 disk_io_size ,
9129
+ size_t count , bool compressed , bool * unlocked )
9132
9130
{
9133
9131
struct btrfs_inode * inode = BTRFS_I (file_inode (iocb -> ki_filp ));
9134
9132
struct extent_io_tree * io_tree = & inode -> io_tree ;
@@ -9189,15 +9187,16 @@ static ssize_t btrfs_encoded_read_regular(struct kiocb *iocb,
9189
9187
}
9190
9188
9191
9189
ssize_t btrfs_encoded_read (struct kiocb * iocb , struct iov_iter * iter ,
9192
- struct btrfs_ioctl_encoded_io_args * encoded )
9190
+ struct btrfs_ioctl_encoded_io_args * encoded ,
9191
+ struct extent_state * * cached_state ,
9192
+ u64 * disk_bytenr , u64 * disk_io_size )
9193
9193
{
9194
9194
struct btrfs_inode * inode = BTRFS_I (file_inode (iocb -> ki_filp ));
9195
9195
struct btrfs_fs_info * fs_info = inode -> root -> fs_info ;
9196
9196
struct extent_io_tree * io_tree = & inode -> io_tree ;
9197
9197
ssize_t ret ;
9198
9198
size_t count = iov_iter_count (iter );
9199
- u64 start , lockend , disk_bytenr , disk_io_size ;
9200
- struct extent_state * cached_state = NULL ;
9199
+ u64 start , lockend ;
9201
9200
struct extent_map * em ;
9202
9201
bool unlocked = false;
9203
9202
@@ -9223,13 +9222,13 @@ ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
9223
9222
lockend - start + 1 );
9224
9223
if (ret )
9225
9224
goto out_unlock_inode ;
9226
- lock_extent (io_tree , start , lockend , & cached_state );
9225
+ lock_extent (io_tree , start , lockend , cached_state );
9227
9226
ordered = btrfs_lookup_ordered_range (inode , start ,
9228
9227
lockend - start + 1 );
9229
9228
if (!ordered )
9230
9229
break ;
9231
9230
btrfs_put_ordered_extent (ordered );
9232
- unlock_extent (io_tree , start , lockend , & cached_state );
9231
+ unlock_extent (io_tree , start , lockend , cached_state );
9233
9232
cond_resched ();
9234
9233
}
9235
9234
@@ -9249,7 +9248,7 @@ ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
9249
9248
free_extent_map (em );
9250
9249
em = NULL ;
9251
9250
ret = btrfs_encoded_read_inline (iocb , iter , start , lockend ,
9252
- & cached_state , extent_start ,
9251
+ cached_state , extent_start ,
9253
9252
count , encoded , & unlocked );
9254
9253
goto out_em ;
9255
9254
}
@@ -9262,12 +9261,12 @@ ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
9262
9261
inode -> vfs_inode .i_size ) - iocb -> ki_pos ;
9263
9262
if (em -> disk_bytenr == EXTENT_MAP_HOLE ||
9264
9263
(em -> flags & EXTENT_FLAG_PREALLOC )) {
9265
- disk_bytenr = EXTENT_MAP_HOLE ;
9264
+ * disk_bytenr = EXTENT_MAP_HOLE ;
9266
9265
count = min_t (u64 , count , encoded -> len );
9267
9266
encoded -> len = count ;
9268
9267
encoded -> unencoded_len = count ;
9269
9268
} else if (extent_map_is_compressed (em )) {
9270
- disk_bytenr = em -> disk_bytenr ;
9269
+ * disk_bytenr = em -> disk_bytenr ;
9271
9270
/*
9272
9271
* Bail if the buffer isn't large enough to return the whole
9273
9272
* compressed extent.
@@ -9276,7 +9275,7 @@ ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
9276
9275
ret = - ENOBUFS ;
9277
9276
goto out_em ;
9278
9277
}
9279
- disk_io_size = em -> disk_num_bytes ;
9278
+ * disk_io_size = em -> disk_num_bytes ;
9280
9279
count = em -> disk_num_bytes ;
9281
9280
encoded -> unencoded_len = em -> ram_bytes ;
9282
9281
encoded -> unencoded_offset = iocb -> ki_pos - (em -> start - em -> offset );
@@ -9286,44 +9285,42 @@ ssize_t btrfs_encoded_read(struct kiocb *iocb, struct iov_iter *iter,
9286
9285
goto out_em ;
9287
9286
encoded -> compression = ret ;
9288
9287
} else {
9289
- disk_bytenr = extent_map_block_start (em ) + (start - em -> start );
9288
+ * disk_bytenr = extent_map_block_start (em ) + (start - em -> start );
9290
9289
if (encoded -> len > count )
9291
9290
encoded -> len = count ;
9292
9291
/*
9293
9292
* Don't read beyond what we locked. This also limits the page
9294
9293
* allocations that we'll do.
9295
9294
*/
9296
- disk_io_size = min (lockend + 1 , iocb -> ki_pos + encoded -> len ) - start ;
9297
- count = start + disk_io_size - iocb -> ki_pos ;
9295
+ * disk_io_size = min (lockend + 1 , iocb -> ki_pos + encoded -> len ) - start ;
9296
+ count = start + * disk_io_size - iocb -> ki_pos ;
9298
9297
encoded -> len = count ;
9299
9298
encoded -> unencoded_len = count ;
9300
- disk_io_size = ALIGN (disk_io_size , fs_info -> sectorsize );
9299
+ * disk_io_size = ALIGN (* disk_io_size , fs_info -> sectorsize );
9301
9300
}
9302
9301
free_extent_map (em );
9303
9302
em = NULL ;
9304
9303
9305
- if (disk_bytenr == EXTENT_MAP_HOLE ) {
9306
- unlock_extent (io_tree , start , lockend , & cached_state );
9304
+ if (* disk_bytenr == EXTENT_MAP_HOLE ) {
9305
+ unlock_extent (io_tree , start , lockend , cached_state );
9307
9306
btrfs_inode_unlock (inode , BTRFS_ILOCK_SHARED );
9308
9307
unlocked = true;
9309
9308
ret = iov_iter_zero (count , iter );
9310
9309
if (ret != count )
9311
9310
ret = - EFAULT ;
9312
9311
} else {
9313
- ret = btrfs_encoded_read_regular (iocb , iter , start , lockend ,
9314
- & cached_state , disk_bytenr ,
9315
- disk_io_size , count ,
9316
- encoded -> compression ,
9317
- & unlocked );
9312
+ ret = - EIOCBQUEUED ;
9313
+ goto out_em ;
9318
9314
}
9319
9315
9320
9316
out_em :
9321
9317
free_extent_map (em );
9322
9318
out_unlock_extent :
9323
- if (!unlocked )
9324
- unlock_extent (io_tree , start , lockend , & cached_state );
9319
+ /* Leave inode and extent locked if we need to do a read. */
9320
+ if (!unlocked && ret != - EIOCBQUEUED )
9321
+ unlock_extent (io_tree , start , lockend , cached_state );
9325
9322
out_unlock_inode :
9326
- if (!unlocked )
9323
+ if (!unlocked && ret != - EIOCBQUEUED )
9327
9324
btrfs_inode_unlock (inode , BTRFS_ILOCK_SHARED );
9328
9325
return ret ;
9329
9326
}
0 commit comments