]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - fs/ceph/file.c
ceph_sync_{,direct_}write: fix an oops on ceph_osdc_new_request() failure
[mirror_ubuntu-zesty-kernel.git] / fs / ceph / file.c
index 09c7afe32e496c7dfe20d527106c7a184248c3ca..359805b671b92c2732150e9eb39c69b1e5c356e1 100644 (file)
@@ -600,7 +600,7 @@ ceph_sync_direct_write(struct kiocb *iocb, const struct iovec *iov,
                                            false);
                if (IS_ERR(req)) {
                        ret = PTR_ERR(req);
-                       goto out;
+                       break;
                }
 
                num_pages = calc_pages_for(page_align, len);
@@ -718,7 +718,7 @@ static ssize_t ceph_sync_write(struct kiocb *iocb, const struct iovec *iov,
                                            false);
                if (IS_ERR(req)) {
                        ret = PTR_ERR(req);
-                       goto out;
+                       break;
                }
 
                /*
@@ -970,6 +970,7 @@ retry_snap:
                        goto retry_snap;
                }
        } else {
+               struct iov_iter from;
                /*
                 * No need to acquire the i_truncate_mutex. Because
                 * the MDS revokes Fwb caps before sending truncate
@@ -977,9 +978,10 @@ retry_snap:
                 * are pending vmtruncate. So write and vmtruncate
                 * can not run at the same time
                 */
-               written = generic_file_buffered_write(iocb, iov, nr_segs,
-                                                     pos, &iocb->ki_pos,
-                                                     count, 0);
+               iov_iter_init(&from, iov, nr_segs, count, 0);
+               written = generic_perform_write(file, &from, pos);
+               if (likely(written >= 0))
+                       iocb->ki_pos = pos + written;
                mutex_unlock(&inode->i_mutex);
        }