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 ---