file.c (eb5bc2a213f96bd43b5f00a625acb0c669613645) | file.c (66ee59af630fd8d5f4f56fb28162857e629aa0ab) |
---|---|
1#include <linux/ceph/ceph_debug.h> 2 3#include <linux/module.h> 4#include <linux/sched.h> 5#include <linux/slab.h> 6#include <linux/file.h> 7#include <linux/mount.h> 8#include <linux/namei.h> --- 261 unchanged lines hidden (view full) --- 270 req->r_pagelist = acls.pagelist; 271 acls.pagelist = NULL; 272 } 273 } 274 req->r_locked_dir = dir; /* caller holds dir->i_mutex */ 275 err = ceph_mdsc_do_request(mdsc, 276 (flags & (O_CREAT|O_TRUNC)) ? dir : NULL, 277 req); | 1#include <linux/ceph/ceph_debug.h> 2 3#include <linux/module.h> 4#include <linux/sched.h> 5#include <linux/slab.h> 6#include <linux/file.h> 7#include <linux/mount.h> 8#include <linux/namei.h> --- 261 unchanged lines hidden (view full) --- 270 req->r_pagelist = acls.pagelist; 271 acls.pagelist = NULL; 272 } 273 } 274 req->r_locked_dir = dir; /* caller holds dir->i_mutex */ 275 err = ceph_mdsc_do_request(mdsc, 276 (flags & (O_CREAT|O_TRUNC)) ? dir : NULL, 277 req); |
278 err = ceph_handle_snapdir(req, dentry, err); | |
279 if (err) 280 goto out_req; 281 | 278 if (err) 279 goto out_req; 280 |
281 err = ceph_handle_snapdir(req, dentry, err); |
|
282 if (err == 0 && (flags & O_CREAT) && !req->r_reply_info.head->is_dentry) 283 err = ceph_handle_notrace_create(dir, dentry); 284 285 if (d_unhashed(dentry)) { 286 dn = ceph_finish_lookup(req, dentry, err); 287 if (IS_ERR(dn)) 288 err = PTR_ERR(dn); 289 } else { 290 /* we were given a hashed negative dentry */ 291 dn = NULL; 292 } 293 if (err) 294 goto out_req; | 282 if (err == 0 && (flags & O_CREAT) && !req->r_reply_info.head->is_dentry) 283 err = ceph_handle_notrace_create(dir, dentry); 284 285 if (d_unhashed(dentry)) { 286 dn = ceph_finish_lookup(req, dentry, err); 287 if (IS_ERR(dn)) 288 err = PTR_ERR(dn); 289 } else { 290 /* we were given a hashed negative dentry */ 291 dn = NULL; 292 } 293 if (err) 294 goto out_req; |
295 if (dn || dentry->d_inode == NULL || d_is_symlink(dentry)) { | 295 if (dn || dentry->d_inode == NULL || S_ISLNK(dentry->d_inode->i_mode)) { |
296 /* make vfs retry on splice, ENOENT, or symlink */ 297 dout("atomic_open finish_no_open on dn %p\n", dn); 298 err = finish_no_open(file, dn); 299 } else { 300 dout("atomic_open finish_open on dn %p\n", dn); 301 if (req->r_op == CEPH_MDS_OP_CREATE && req->r_reply_info.has_create_ino) { 302 ceph_init_inode_acls(dentry->d_inode, &acls); 303 *opened |= FILE_CREATED; --- 83 unchanged lines hidden (view full) --- 387 hit_stripe = this_len < left; 388 was_short = ret >= 0 && ret < this_len; 389 dout("striped_read %llu~%llu (read %u) got %d%s%s\n", pos, left, read, 390 ret, hit_stripe ? " HITSTRIPE" : "", was_short ? " SHORT" : ""); 391 392 if (ret >= 0) { 393 int didpages; 394 if (was_short && (pos + ret < inode->i_size)) { | 296 /* make vfs retry on splice, ENOENT, or symlink */ 297 dout("atomic_open finish_no_open on dn %p\n", dn); 298 err = finish_no_open(file, dn); 299 } else { 300 dout("atomic_open finish_open on dn %p\n", dn); 301 if (req->r_op == CEPH_MDS_OP_CREATE && req->r_reply_info.has_create_ino) { 302 ceph_init_inode_acls(dentry->d_inode, &acls); 303 *opened |= FILE_CREATED; --- 83 unchanged lines hidden (view full) --- 387 hit_stripe = this_len < left; 388 was_short = ret >= 0 && ret < this_len; 389 dout("striped_read %llu~%llu (read %u) got %d%s%s\n", pos, left, read, 390 ret, hit_stripe ? " HITSTRIPE" : "", was_short ? " SHORT" : ""); 391 392 if (ret >= 0) { 393 int didpages; 394 if (was_short && (pos + ret < inode->i_size)) { |
395 int zlen = min(this_len - ret, 396 inode->i_size - pos - ret); 397 int zoff = (o_direct ? buf_align : io_align) + 398 read + ret; | 395 u64 tmp = min(this_len - ret, 396 inode->i_size - pos - ret); |
399 dout(" zero gap %llu to %llu\n", | 397 dout(" zero gap %llu to %llu\n", |
400 pos + ret, pos + ret + zlen); 401 ceph_zero_page_vector_range(zoff, zlen, pages); 402 ret += zlen; | 398 pos + ret, pos + ret + tmp); 399 ceph_zero_page_vector_range(page_align + read + ret, 400 tmp, pages); 401 ret += tmp; |
403 } 404 405 didpages = (page_align + ret) >> PAGE_CACHE_SHIFT; 406 pos += ret; 407 read = pos - off; 408 left -= ret; 409 page_pos += didpages; 410 pages_left -= didpages; --- 392 unchanged lines hidden (view full) --- 803 * back to the MDS mid-read. 804 * 805 * Hmm, the sync read case isn't actually async... should it be? 806 */ 807static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to) 808{ 809 struct file *filp = iocb->ki_filp; 810 struct ceph_file_info *fi = filp->private_data; | 402 } 403 404 didpages = (page_align + ret) >> PAGE_CACHE_SHIFT; 405 pos += ret; 406 read = pos - off; 407 left -= ret; 408 page_pos += didpages; 409 pages_left -= didpages; --- 392 unchanged lines hidden (view full) --- 802 * back to the MDS mid-read. 803 * 804 * Hmm, the sync read case isn't actually async... should it be? 805 */ 806static ssize_t ceph_read_iter(struct kiocb *iocb, struct iov_iter *to) 807{ 808 struct file *filp = iocb->ki_filp; 809 struct ceph_file_info *fi = filp->private_data; |
811 size_t len = iocb->ki_nbytes; | 810 size_t len = iov_iter_count(to); |
812 struct inode *inode = file_inode(filp); 813 struct ceph_inode_info *ci = ceph_inode(inode); 814 struct page *pinned_page = NULL; 815 ssize_t ret; 816 int want, got = 0; 817 int retry_op = 0, read = 0; 818 819again: --- 54 unchanged lines hidden (view full) --- 874 BUG_ON(retry_op != READ_INLINE); 875 goto again; 876 } 877 return statret; 878 } 879 880 i_size = i_size_read(inode); 881 if (retry_op == READ_INLINE) { | 811 struct inode *inode = file_inode(filp); 812 struct ceph_inode_info *ci = ceph_inode(inode); 813 struct page *pinned_page = NULL; 814 ssize_t ret; 815 int want, got = 0; 816 int retry_op = 0, read = 0; 817 818again: --- 54 unchanged lines hidden (view full) --- 873 BUG_ON(retry_op != READ_INLINE); 874 goto again; 875 } 876 return statret; 877 } 878 879 i_size = i_size_read(inode); 880 if (retry_op == READ_INLINE) { |
882 BUG_ON(ret > 0 || read > 0); 883 if (iocb->ki_pos < i_size && 884 iocb->ki_pos < PAGE_CACHE_SIZE) { | 881 /* does not support inline data > PAGE_SIZE */ 882 if (i_size > PAGE_CACHE_SIZE) { 883 ret = -EIO; 884 } else if (iocb->ki_pos < i_size) { |
885 loff_t end = min_t(loff_t, i_size, 886 iocb->ki_pos + len); | 885 loff_t end = min_t(loff_t, i_size, 886 iocb->ki_pos + len); |
887 end = min_t(loff_t, end, PAGE_CACHE_SIZE); | |
888 if (statret < end) 889 zero_user_segment(page, statret, end); 890 ret = copy_page_to_iter(page, 891 iocb->ki_pos & ~PAGE_MASK, 892 end - iocb->ki_pos, to); 893 iocb->ki_pos += ret; | 887 if (statret < end) 888 zero_user_segment(page, statret, end); 889 ret = copy_page_to_iter(page, 890 iocb->ki_pos & ~PAGE_MASK, 891 end - iocb->ki_pos, to); 892 iocb->ki_pos += ret; |
894 read += ret; | 893 } else { 894 ret = 0; |
895 } | 895 } |
896 if (iocb->ki_pos < i_size && read < len) { 897 size_t zlen = min_t(size_t, len - read, 898 i_size - iocb->ki_pos); 899 ret = iov_iter_zero(zlen, to); 900 iocb->ki_pos += ret; 901 read += ret; 902 } | |
903 __free_pages(page, 0); | 896 __free_pages(page, 0); |
904 return read; | 897 return ret; |
905 } 906 907 /* hit EOF or hole? */ 908 if (retry_op == CHECK_EOF && iocb->ki_pos < i_size && | 898 } 899 900 /* hit EOF or hole? */ 901 if (retry_op == CHECK_EOF && iocb->ki_pos < i_size && |
909 ret < len) { | 902 ret < len) { |
910 dout("sync_read hit hole, ppos %lld < size %lld" 911 ", reading more\n", iocb->ki_pos, 912 inode->i_size); 913 914 read += ret; 915 len -= ret; 916 retry_op = 0; 917 goto again; --- 432 unchanged lines hidden --- | 903 dout("sync_read hit hole, ppos %lld < size %lld" 904 ", reading more\n", iocb->ki_pos, 905 inode->i_size); 906 907 read += ret; 908 len -= ret; 909 retry_op = 0; 910 goto again; --- 432 unchanged lines hidden --- |