13
13
#include <linux/iversion.h>
14
14
#include <linux/ktime.h>
15
15
#include <linux/netfs.h>
16
+ #include <trace/events/netfs.h>
16
17
17
18
#include "super.h"
18
19
#include "mds_client.h"
@@ -205,21 +206,6 @@ static void ceph_netfs_expand_readahead(struct netfs_io_request *rreq)
205
206
}
206
207
}
207
208
208
- static bool ceph_netfs_clamp_length (struct netfs_io_subrequest * subreq )
209
- {
210
- struct inode * inode = subreq -> rreq -> inode ;
211
- struct ceph_fs_client * fsc = ceph_inode_to_fs_client (inode );
212
- struct ceph_inode_info * ci = ceph_inode (inode );
213
- u64 objno , objoff ;
214
- u32 xlen ;
215
-
216
- /* Truncate the extent at the end of the current block */
217
- ceph_calc_file_object_mapping (& ci -> i_layout , subreq -> start , subreq -> len ,
218
- & objno , & objoff , & xlen );
219
- subreq -> len = min (xlen , fsc -> mount_options -> rsize );
220
- return true;
221
- }
222
-
223
209
static void finish_netfs_read (struct ceph_osd_request * req )
224
210
{
225
211
struct inode * inode = req -> r_inode ;
@@ -264,7 +250,12 @@ static void finish_netfs_read(struct ceph_osd_request *req)
264
250
calc_pages_for (osd_data -> alignment ,
265
251
osd_data -> length ), false);
266
252
}
267
- netfs_subreq_terminated (subreq , err , false);
253
+ if (err > 0 ) {
254
+ subreq -> transferred = err ;
255
+ err = 0 ;
256
+ }
257
+ trace_netfs_sreq (subreq , netfs_sreq_trace_io_progress );
258
+ netfs_read_subreq_terminated (subreq , err , false);
268
259
iput (req -> r_inode );
269
260
ceph_dec_osd_stopping_blocker (fsc -> mdsc );
270
261
}
@@ -278,7 +269,6 @@ static bool ceph_netfs_issue_op_inline(struct netfs_io_subrequest *subreq)
278
269
struct ceph_mds_request * req ;
279
270
struct ceph_mds_client * mdsc = ceph_sb_to_mdsc (inode -> i_sb );
280
271
struct ceph_inode_info * ci = ceph_inode (inode );
281
- struct iov_iter iter ;
282
272
ssize_t err = 0 ;
283
273
size_t len ;
284
274
int mode ;
@@ -301,6 +291,7 @@ static bool ceph_netfs_issue_op_inline(struct netfs_io_subrequest *subreq)
301
291
req -> r_args .getattr .mask = cpu_to_le32 (CEPH_STAT_CAP_INLINE_DATA );
302
292
req -> r_num_caps = 2 ;
303
293
294
+ trace_netfs_sreq (subreq , netfs_sreq_trace_submit );
304
295
err = ceph_mdsc_do_request (mdsc , NULL , req );
305
296
if (err < 0 )
306
297
goto out ;
@@ -314,17 +305,36 @@ static bool ceph_netfs_issue_op_inline(struct netfs_io_subrequest *subreq)
314
305
}
315
306
316
307
len = min_t (size_t , iinfo -> inline_len - subreq -> start , subreq -> len );
317
- iov_iter_xarray (& iter , ITER_DEST , & rreq -> mapping -> i_pages , subreq -> start , len );
318
- err = copy_to_iter (iinfo -> inline_data + subreq -> start , len , & iter );
319
- if (err == 0 )
308
+ err = copy_to_iter (iinfo -> inline_data + subreq -> start , len , & subreq -> io_iter );
309
+ if (err == 0 ) {
320
310
err = - EFAULT ;
311
+ } else {
312
+ subreq -> transferred += err ;
313
+ err = 0 ;
314
+ }
321
315
322
316
ceph_mdsc_put_request (req );
323
317
out :
324
- netfs_subreq_terminated (subreq , err , false);
318
+ netfs_read_subreq_terminated (subreq , err , false);
325
319
return true;
326
320
}
327
321
322
+ static int ceph_netfs_prepare_read (struct netfs_io_subrequest * subreq )
323
+ {
324
+ struct netfs_io_request * rreq = subreq -> rreq ;
325
+ struct inode * inode = rreq -> inode ;
326
+ struct ceph_inode_info * ci = ceph_inode (inode );
327
+ struct ceph_fs_client * fsc = ceph_inode_to_fs_client (inode );
328
+ u64 objno , objoff ;
329
+ u32 xlen ;
330
+
331
+ /* Truncate the extent at the end of the current block */
332
+ ceph_calc_file_object_mapping (& ci -> i_layout , subreq -> start , subreq -> len ,
333
+ & objno , & objoff , & xlen );
334
+ rreq -> io_streams [0 ].sreq_max_len = umin (xlen , fsc -> mount_options -> rsize );
335
+ return 0 ;
336
+ }
337
+
328
338
static void ceph_netfs_issue_read (struct netfs_io_subrequest * subreq )
329
339
{
330
340
struct netfs_io_request * rreq = subreq -> rreq ;
@@ -334,9 +344,8 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
334
344
struct ceph_client * cl = fsc -> client ;
335
345
struct ceph_osd_request * req = NULL ;
336
346
struct ceph_vino vino = ceph_vino (inode );
337
- struct iov_iter iter ;
338
- int err = 0 ;
339
- u64 len = subreq -> len ;
347
+ int err ;
348
+ u64 len ;
340
349
bool sparse = IS_ENCRYPTED (inode ) || ceph_test_mount_opt (fsc , SPARSEREAD );
341
350
u64 off = subreq -> start ;
342
351
int extent_cnt ;
@@ -349,6 +358,12 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
349
358
if (ceph_has_inline_data (ci ) && ceph_netfs_issue_op_inline (subreq ))
350
359
return ;
351
360
361
+ // TODO: This rounding here is slightly dodgy. It *should* work, for
362
+ // now, as the cache only deals in blocks that are a multiple of
363
+ // PAGE_SIZE and fscrypt blocks are at most PAGE_SIZE. What needs to
364
+ // happen is for the fscrypt driving to be moved into netfslib and the
365
+ // data in the cache also to be stored encrypted.
366
+ len = subreq -> len ;
352
367
ceph_fscrypt_adjust_off_and_len (inode , & off , & len );
353
368
354
369
req = ceph_osdc_new_request (& fsc -> client -> osdc , & ci -> i_layout , vino ,
@@ -371,8 +386,6 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
371
386
doutc (cl , "%llx.%llx pos=%llu orig_len=%zu len=%llu\n" ,
372
387
ceph_vinop (inode ), subreq -> start , subreq -> len , len );
373
388
374
- iov_iter_xarray (& iter , ITER_DEST , & rreq -> mapping -> i_pages , subreq -> start , len );
375
-
376
389
/*
377
390
* FIXME: For now, use CEPH_OSD_DATA_TYPE_PAGES instead of _ITER for
378
391
* encrypted inodes. We'd need infrastructure that handles an iov_iter
@@ -384,7 +397,7 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
384
397
struct page * * pages ;
385
398
size_t page_off ;
386
399
387
- err = iov_iter_get_pages_alloc2 (& iter , & pages , len , & page_off );
400
+ err = iov_iter_get_pages_alloc2 (& subreq -> io_iter , & pages , len , & page_off );
388
401
if (err < 0 ) {
389
402
doutc (cl , "%llx.%llx failed to allocate pages, %d\n" ,
390
403
ceph_vinop (inode ), err );
@@ -399,7 +412,7 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
399
412
osd_req_op_extent_osd_data_pages (req , 0 , pages , len , 0 , false,
400
413
false);
401
414
} else {
402
- osd_req_op_extent_osd_iter (req , 0 , & iter );
415
+ osd_req_op_extent_osd_iter (req , 0 , & subreq -> io_iter );
403
416
}
404
417
if (!ceph_inc_osd_stopping_blocker (fsc -> mdsc )) {
405
418
err = - EIO ;
@@ -410,17 +423,19 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
410
423
req -> r_inode = inode ;
411
424
ihold (inode );
412
425
426
+ trace_netfs_sreq (subreq , netfs_sreq_trace_submit );
413
427
ceph_osdc_start_request (req -> r_osdc , req );
414
428
out :
415
429
ceph_osdc_put_request (req );
416
430
if (err )
417
- netfs_subreq_terminated (subreq , err , false);
431
+ netfs_read_subreq_terminated (subreq , err , false);
418
432
doutc (cl , "%llx.%llx result %d\n" , ceph_vinop (inode ), err );
419
433
}
420
434
421
435
static int ceph_init_request (struct netfs_io_request * rreq , struct file * file )
422
436
{
423
437
struct inode * inode = rreq -> inode ;
438
+ struct ceph_fs_client * fsc = ceph_inode_to_fs_client (inode );
424
439
struct ceph_client * cl = ceph_inode_to_client (inode );
425
440
int got = 0 , want = CEPH_CAP_FILE_CACHE ;
426
441
struct ceph_netfs_request_data * priv ;
@@ -472,6 +487,7 @@ static int ceph_init_request(struct netfs_io_request *rreq, struct file *file)
472
487
473
488
priv -> caps = got ;
474
489
rreq -> netfs_priv = priv ;
490
+ rreq -> io_streams [0 ].sreq_max_len = fsc -> mount_options -> rsize ;
475
491
476
492
out :
477
493
if (ret < 0 )
@@ -496,9 +512,9 @@ static void ceph_netfs_free_request(struct netfs_io_request *rreq)
496
512
const struct netfs_request_ops ceph_netfs_ops = {
497
513
.init_request = ceph_init_request ,
498
514
.free_request = ceph_netfs_free_request ,
515
+ .prepare_read = ceph_netfs_prepare_read ,
499
516
.issue_read = ceph_netfs_issue_read ,
500
517
.expand_readahead = ceph_netfs_expand_readahead ,
501
- .clamp_length = ceph_netfs_clamp_length ,
502
518
.check_write_begin = ceph_netfs_check_write_begin ,
503
519
};
504
520
0 commit comments