OSDN Git Service

Merge tag 'ceph-for-5.6-rc1' of https://github.com/ceph/ceph-client
[tomoyo/tomoyo-test1.git] / fs / read_write.c
index 7458fcc..59d819c 100644 (file)
@@ -939,6 +939,34 @@ out:
        return ret;
 }
 
+ssize_t vfs_iocb_iter_read(struct file *file, struct kiocb *iocb,
+                          struct iov_iter *iter)
+{
+       size_t tot_len;
+       ssize_t ret = 0;
+
+       if (!file->f_op->read_iter)
+               return -EINVAL;
+       if (!(file->f_mode & FMODE_READ))
+               return -EBADF;
+       if (!(file->f_mode & FMODE_CAN_READ))
+               return -EINVAL;
+
+       tot_len = iov_iter_count(iter);
+       if (!tot_len)
+               goto out;
+       ret = rw_verify_area(READ, file, &iocb->ki_pos, tot_len);
+       if (ret < 0)
+               return ret;
+
+       ret = call_read_iter(file, iocb, iter);
+out:
+       if (ret >= 0)
+               fsnotify_access(file);
+       return ret;
+}
+EXPORT_SYMBOL(vfs_iocb_iter_read);
+
 ssize_t vfs_iter_read(struct file *file, struct iov_iter *iter, loff_t *ppos,
                rwf_t flags)
 {
@@ -975,6 +1003,34 @@ static ssize_t do_iter_write(struct file *file, struct iov_iter *iter,
        return ret;
 }
 
+ssize_t vfs_iocb_iter_write(struct file *file, struct kiocb *iocb,
+                           struct iov_iter *iter)
+{
+       size_t tot_len;
+       ssize_t ret = 0;
+
+       if (!file->f_op->write_iter)
+               return -EINVAL;
+       if (!(file->f_mode & FMODE_WRITE))
+               return -EBADF;
+       if (!(file->f_mode & FMODE_CAN_WRITE))
+               return -EINVAL;
+
+       tot_len = iov_iter_count(iter);
+       if (!tot_len)
+               return 0;
+       ret = rw_verify_area(WRITE, file, &iocb->ki_pos, tot_len);
+       if (ret < 0)
+               return ret;
+
+       ret = call_write_iter(file, iocb, iter);
+       if (ret > 0)
+               fsnotify_modify(file);
+
+       return ret;
+}
+EXPORT_SYMBOL(vfs_iocb_iter_write);
+
 ssize_t vfs_iter_write(struct file *file, struct iov_iter *iter, loff_t *ppos,
                rwf_t flags)
 {