|
@@ -1089,19 +1089,22 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
|
|
|
|
|
|
out:
|
|
|
ceph_osdc_put_request(req);
|
|
|
- if (ret == 0) {
|
|
|
- pos += len;
|
|
|
- written += len;
|
|
|
-
|
|
|
- if (pos > i_size_read(inode)) {
|
|
|
- check_caps = ceph_inode_set_size(inode, pos);
|
|
|
- if (check_caps)
|
|
|
- ceph_check_caps(ceph_inode(inode),
|
|
|
- CHECK_CAPS_AUTHONLY,
|
|
|
- NULL);
|
|
|
- }
|
|
|
- } else
|
|
|
+ if (ret != 0) {
|
|
|
+ ceph_set_error_write(ci);
|
|
|
break;
|
|
|
+ }
|
|
|
+
|
|
|
+ ceph_clear_error_write(ci);
|
|
|
+ pos += len;
|
|
|
+ written += len;
|
|
|
+ if (pos > i_size_read(inode)) {
|
|
|
+ check_caps = ceph_inode_set_size(inode, pos);
|
|
|
+ if (check_caps)
|
|
|
+ ceph_check_caps(ceph_inode(inode),
|
|
|
+ CHECK_CAPS_AUTHONLY,
|
|
|
+ NULL);
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
if (ret != -EOLDSNAPC && written > 0) {
|
|
@@ -1307,6 +1310,7 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
|
|
|
}
|
|
|
|
|
|
retry_snap:
|
|
|
+ /* FIXME: not complete since it doesn't account for being at quota */
|
|
|
if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL)) {
|
|
|
err = -ENOSPC;
|
|
|
goto out;
|
|
@@ -1328,7 +1332,8 @@ retry_snap:
|
|
|
inode, ceph_vinop(inode), pos, count, ceph_cap_string(got));
|
|
|
|
|
|
if ((got & (CEPH_CAP_FILE_BUFFER|CEPH_CAP_FILE_LAZYIO)) == 0 ||
|
|
|
- (iocb->ki_flags & IOCB_DIRECT) || (fi->flags & CEPH_F_SYNC)) {
|
|
|
+ (iocb->ki_flags & IOCB_DIRECT) || (fi->flags & CEPH_F_SYNC) ||
|
|
|
+ (ci->i_ceph_flags & CEPH_I_ERROR_WRITE)) {
|
|
|
struct ceph_snap_context *snapc;
|
|
|
struct iov_iter data;
|
|
|
inode_unlock(inode);
|