ceph: wait for async creating inode before requesting new max size
authorYan, Zheng <zyan@redhat.com>
Tue, 10 Mar 2020 11:34:21 +0000 (19:34 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 30 Mar 2020 10:42:43 +0000 (12:42 +0200)
ceph_check_caps() can't request new max size for async creating inode.
This may make ceph_get_caps() loop busily until getting reply of the
async create. Also, wait for async creating reply before calling
ceph_renew_caps().

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/caps.c

index be1ae4b..185db76 100644 (file)
@@ -2833,6 +2833,11 @@ int ceph_get_caps(struct file *filp, int need, int want,
                }
 
                if (ret < 0) {
+                       if (ret == -EFBIG || ret == -ESTALE) {
+                               int ret2 = ceph_wait_on_async_create(inode);
+                               if (ret2 < 0)
+                                       return ret2;
+                       }
                        if (ret == -EFBIG) {
                                check_max_size(inode, endoff);
                                continue;