···376 dout("sync_read on file %p %llu~%u %s\n", file, off, len,377 (file->f_flags & O_DIRECT) ? "O_DIRECT" : "");378379- if (file->f_flags & O_DIRECT) {380- pages = ceph_get_direct_page_vector(data, num_pages, off, len);381-382- /*383- * flush any page cache pages in this range. this384- * will make concurrent normal and O_DIRECT io slow,385- * but it will at least behave sensibly when they are386- * in sequence.387- */388- } else {389 pages = ceph_alloc_page_vector(num_pages, GFP_NOFS);390- }391 if (IS_ERR(pages))392 return PTR_ERR(pages);393000000394 ret = filemap_write_and_wait(inode->i_mapping);395 if (ret < 0)396 goto done;
···376 dout("sync_read on file %p %llu~%u %s\n", file, off, len,377 (file->f_flags & O_DIRECT) ? "O_DIRECT" : "");378379+ if (file->f_flags & O_DIRECT)380+ pages = ceph_get_direct_page_vector(data, num_pages);381+ else0000000382 pages = ceph_alloc_page_vector(num_pages, GFP_NOFS);0383 if (IS_ERR(pages))384 return PTR_ERR(pages);385386+ /*387+ * flush any page cache pages in this range. this388+ * will make concurrent normal and sync io slow,389+ * but it will at least behave sensibly when they are390+ * in sequence.391+ */392 ret = filemap_write_and_wait(inode->i_mapping);393 if (ret < 0)394 goto done;
+1-2
include/linux/ceph/libceph.h
···227extern void ceph_release_page_vector(struct page **pages, int num_pages);228229extern struct page **ceph_get_direct_page_vector(const char __user *data,230- int num_pages,231- loff_t off, size_t len);232extern void ceph_put_page_vector(struct page **pages, int num_pages);233extern void ceph_release_page_vector(struct page **pages, int num_pages);234extern struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags);
···227extern void ceph_release_page_vector(struct page **pages, int num_pages);228229extern struct page **ceph_get_direct_page_vector(const char __user *data,230+ int num_pages);0231extern void ceph_put_page_vector(struct page **pages, int num_pages);232extern void ceph_release_page_vector(struct page **pages, int num_pages);233extern struct page **ceph_alloc_page_vector(int num_pages, gfp_t flags);
+1-2
net/ceph/pagevec.c
···13 * build a vector of user pages14 */15struct page **ceph_get_direct_page_vector(const char __user *data,16- int num_pages,17- loff_t off, size_t len)18{19 struct page **pages;20 int rc;
···13 * build a vector of user pages14 */15struct page **ceph_get_direct_page_vector(const char __user *data,16+ int num_pages)017{18 struct page **pages;19 int rc;