Merge tag 'x86-entry-2021-02-24' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / fs / ceph / file.c
index 3f4c993..209535d 100644 (file)
@@ -182,8 +182,7 @@ static void put_bvecs(struct bio_vec *bvecs, int num_bvecs, bool should_dirty)
 static struct ceph_mds_request *
 prepare_open_request(struct super_block *sb, int flags, int create_mode)
 {
-       struct ceph_fs_client *fsc = ceph_sb_to_client(sb);
-       struct ceph_mds_client *mdsc = fsc->mdsc;
+       struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(sb);
        struct ceph_mds_request *req;
        int want_auth = USE_ANY_MDS;
        int op = (flags & O_CREAT) ? CEPH_MDS_OP_CREATE : CEPH_MDS_OP_OPEN;
@@ -256,8 +255,6 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode)
        case S_IFDIR:
                ret = ceph_init_file_info(inode, file, fmode,
                                                S_ISDIR(inode->i_mode));
-               if (ret)
-                       return ret;
                break;
 
        case S_IFLNK:
@@ -285,7 +282,7 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode)
  */
 int ceph_renew_caps(struct inode *inode, int fmode)
 {
-       struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc;
+       struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
        struct ceph_inode_info *ci = ceph_inode(inode);
        struct ceph_mds_request *req;
        int err, flags, wanted;
@@ -865,6 +862,8 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
                size_t page_off;
                u64 i_size;
                bool more;
+               int idx;
+               size_t left;
 
                req = ceph_osdc_new_request(osdc, &ci->i_layout,
                                        ci->i_vino, off, &len, 0, 1,
@@ -878,29 +877,13 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
 
                more = len < iov_iter_count(to);
 
-               if (unlikely(iov_iter_is_pipe(to))) {
-                       ret = iov_iter_get_pages_alloc(to, &pages, len,
-                                                      &page_off);
-                       if (ret <= 0) {
-                               ceph_osdc_put_request(req);
-                               ret = -ENOMEM;
-                               break;
-                       }
-                       num_pages = DIV_ROUND_UP(ret + page_off, PAGE_SIZE);
-                       if (ret < len) {
-                               len = ret;
-                               osd_req_op_extent_update(req, 0, len);
-                               more = false;
-                       }
-               } else {
-                       num_pages = calc_pages_for(off, len);
-                       page_off = off & ~PAGE_MASK;
-                       pages = ceph_alloc_page_vector(num_pages, GFP_KERNEL);
-                       if (IS_ERR(pages)) {
-                               ceph_osdc_put_request(req);
-                               ret = PTR_ERR(pages);
-                               break;
-                       }
+               num_pages = calc_pages_for(off, len);
+               page_off = off & ~PAGE_MASK;
+               pages = ceph_alloc_page_vector(num_pages, GFP_KERNEL);
+               if (IS_ERR(pages)) {
+                       ceph_osdc_put_request(req);
+                       ret = PTR_ERR(pages);
+                       break;
                }
 
                osd_req_op_extent_osd_data_pages(req, 0, pages, len, page_off,
@@ -931,36 +914,27 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
                        ret += zlen;
                }
 
-               if (unlikely(iov_iter_is_pipe(to))) {
-                       if (ret > 0) {
-                               iov_iter_advance(to, ret);
-                               off += ret;
-                       } else {
-                               iov_iter_advance(to, 0);
-                       }
-                       ceph_put_page_vector(pages, num_pages, false);
-               } else {
-                       int idx = 0;
-                       size_t left = ret > 0 ? ret : 0;
-                       while (left > 0) {
-                               size_t len, copied;
-                               page_off = off & ~PAGE_MASK;
-                               len = min_t(size_t, left, PAGE_SIZE - page_off);
-                               copied = copy_page_to_iter(pages[idx++],
-                                                          page_off, len, to);
-                               off += copied;
-                               left -= copied;
-                               if (copied < len) {
-                                       ret = -EFAULT;
-                                       break;
-                               }
+               idx = 0;
+               left = ret > 0 ? ret : 0;
+               while (left > 0) {
+                       size_t len, copied;
+                       page_off = off & ~PAGE_MASK;
+                       len = min_t(size_t, left, PAGE_SIZE - page_off);
+                       SetPageUptodate(pages[idx]);
+                       copied = copy_page_to_iter(pages[idx++],
+                                                  page_off, len, to);
+                       off += copied;
+                       left -= copied;
+                       if (copied < len) {
+                               ret = -EFAULT;
+                               break;
                        }
-                       ceph_release_page_vector(pages, num_pages);
                }
+               ceph_release_page_vector(pages, num_pages);
 
                if (ret < 0) {
-                       if (ret == -EBLACKLISTED)
-                               fsc->blacklisted = true;
+                       if (ret == -EBLOCKLISTED)
+                               fsc->blocklisted = true;
                        break;
                }
 
@@ -1052,8 +1026,7 @@ static void ceph_aio_complete_req(struct ceph_osd_request *req)
        struct inode *inode = req->r_inode;
        struct ceph_aio_request *aio_req = req->r_priv;
        struct ceph_osd_data *osd_data = osd_req_op_extent_osd_data(req, 0);
-       struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
-       struct ceph_client_metric *metric = &fsc->mdsc->metric;
+       struct ceph_client_metric *metric = &ceph_sb_to_mdsc(inode->i_sb)->metric;
 
        BUG_ON(osd_data->type != CEPH_OSD_DATA_TYPE_BVECS);
        BUG_ON(!osd_data->num_bvecs);