Skip to content

Commit a5cd74a

Browse files
ukernelidryomov
authored andcommitted
ceph: fix -EOLDSNAPC handling
Need to drop cap reference before retry. Besides, it's better to redo file write checks for each retry because we re-lock inode. Signed-off-by: "Yan, Zheng" <[email protected]> Signed-off-by: Ilya Dryomov <[email protected]>
1 parent 5d37ca1 commit a5cd74a

File tree

1 file changed

+7
-10
lines changed

1 file changed

+7
-10
lines changed

fs/ceph/file.c

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1309,6 +1309,7 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
13091309
if (!prealloc_cf)
13101310
return -ENOMEM;
13111311

1312+
retry_snap:
13121313
inode_lock(inode);
13131314

13141315
/* We can write back this queue in page reclaim */
@@ -1340,7 +1341,6 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
13401341
goto out;
13411342
}
13421343

1343-
retry_snap:
13441344
/* FIXME: not complete since it doesn't account for being at quota */
13451345
if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL)) {
13461346
err = -ENOSPC;
@@ -1389,14 +1389,6 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
13891389
&prealloc_cf);
13901390
else
13911391
written = ceph_sync_write(iocb, &data, pos, snapc);
1392-
if (written == -EOLDSNAPC) {
1393-
dout("aio_write %p %llx.%llx %llu~%u"
1394-
"got EOLDSNAPC, retrying\n",
1395-
inode, ceph_vinop(inode),
1396-
pos, (unsigned)count);
1397-
inode_lock(inode);
1398-
goto retry_snap;
1399-
}
14001392
if (written > 0)
14011393
iov_iter_advance(from, written);
14021394
ceph_put_snap_context(snapc);
@@ -1430,10 +1422,15 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
14301422
ceph_cap_string(got));
14311423
ceph_put_cap_refs(ci, got);
14321424

1425+
if (written == -EOLDSNAPC) {
1426+
dout("aio_write %p %llx.%llx %llu~%u" "got EOLDSNAPC, retrying\n",
1427+
inode, ceph_vinop(inode), pos, (unsigned)count);
1428+
goto retry_snap;
1429+
}
1430+
14331431
if (written >= 0) {
14341432
if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_NEARFULL))
14351433
iocb->ki_flags |= IOCB_DSYNC;
1436-
14371434
written = generic_write_sync(iocb, written);
14381435
}
14391436

0 commit comments

Comments
 (0)