@@ -354,6 +354,45 @@ static void ceph_netfs_issue_read(struct netfs_io_subrequest *subreq)
354
354
dout ("%s: result %d\n" , __func__ , err );
355
355
}
356
356
357
+ static int ceph_init_request (struct netfs_io_request * rreq , struct file * file )
358
+ {
359
+ struct inode * inode = rreq -> inode ;
360
+ int got = 0 , want = CEPH_CAP_FILE_CACHE ;
361
+ int ret = 0 ;
362
+
363
+ if (rreq -> origin != NETFS_READAHEAD )
364
+ return 0 ;
365
+
366
+ if (file ) {
367
+ struct ceph_rw_context * rw_ctx ;
368
+ struct ceph_file_info * fi = file -> private_data ;
369
+
370
+ rw_ctx = ceph_find_rw_context (fi );
371
+ if (rw_ctx )
372
+ return 0 ;
373
+ }
374
+
375
+ /*
376
+ * readahead callers do not necessarily hold Fcb caps
377
+ * (e.g. fadvise, madvise).
378
+ */
379
+ ret = ceph_try_get_caps (inode , CEPH_CAP_FILE_RD , want , true, & got );
380
+ if (ret < 0 ) {
381
+ dout ("start_read %p, error getting cap\n" , inode );
382
+ return ret ;
383
+ }
384
+
385
+ if (!(got & want )) {
386
+ dout ("start_read %p, no cache cap\n" , inode );
387
+ return - EACCES ;
388
+ }
389
+ if (ret == 0 )
390
+ return - EACCES ;
391
+
392
+ rreq -> netfs_priv = (void * )(uintptr_t )got ;
393
+ return 0 ;
394
+ }
395
+
357
396
static void ceph_readahead_cleanup (struct address_space * mapping , void * priv )
358
397
{
359
398
struct inode * inode = mapping -> host ;
@@ -365,7 +404,7 @@ static void ceph_readahead_cleanup(struct address_space *mapping, void *priv)
365
404
}
366
405
367
406
static const struct netfs_request_ops ceph_netfs_read_ops = {
368
- .is_cache_enabled = ceph_is_cache_enabled ,
407
+ .init_request = ceph_init_request ,
369
408
.begin_cache_operation = ceph_begin_cache_operation ,
370
409
.issue_read = ceph_netfs_issue_read ,
371
410
.expand_readahead = ceph_netfs_expand_readahead ,
@@ -393,33 +432,7 @@ static int ceph_readpage(struct file *file, struct page *subpage)
393
432
394
433
static void ceph_readahead (struct readahead_control * ractl )
395
434
{
396
- struct inode * inode = file_inode (ractl -> file );
397
- struct ceph_file_info * fi = ractl -> file -> private_data ;
398
- struct ceph_rw_context * rw_ctx ;
399
- int got = 0 ;
400
- int ret = 0 ;
401
-
402
- if (ceph_inode (inode )-> i_inline_version != CEPH_INLINE_NONE )
403
- return ;
404
-
405
- rw_ctx = ceph_find_rw_context (fi );
406
- if (!rw_ctx ) {
407
- /*
408
- * readahead callers do not necessarily hold Fcb caps
409
- * (e.g. fadvise, madvise).
410
- */
411
- int want = CEPH_CAP_FILE_CACHE ;
412
-
413
- ret = ceph_try_get_caps (inode , CEPH_CAP_FILE_RD , want , true, & got );
414
- if (ret < 0 )
415
- dout ("start_read %p, error getting cap\n" , inode );
416
- else if (!(got & want ))
417
- dout ("start_read %p, no cache cap\n" , inode );
418
-
419
- if (ret <= 0 )
420
- return ;
421
- }
422
- netfs_readahead (ractl , & ceph_netfs_read_ops , (void * )(uintptr_t )got );
435
+ netfs_readahead (ractl , & ceph_netfs_read_ops , NULL );
423
436
}
424
437
425
438
#ifdef CONFIG_CEPH_FSCACHE
0 commit comments