/* Update time before taking page lock */
        file_update_time(vma->vm_file);
 
-       lock_page(page);
+       do {
+               lock_page(page);
 
-       if ((off > size) || (page->mapping != inode->i_mapping)) {
-               unlock_page(page);
-               ret = VM_FAULT_NOPAGE;
-               goto out;
-       }
+               if ((off > size) || (page->mapping != inode->i_mapping)) {
+                       unlock_page(page);
+                       ret = VM_FAULT_NOPAGE;
+                       break;
+               }
+
+               ret = ceph_update_writeable_page(vma->vm_file, off, len, page);
+               if (ret >= 0) {
+                       /* success.  we'll keep the page locked. */
+                       set_page_dirty(page);
+                       ret = VM_FAULT_LOCKED;
+               }
+       } while (ret == -EAGAIN);
 
-       ret = ceph_update_writeable_page(vma->vm_file, off, len, page);
-       if (ret >= 0) {
-               /* success.  we'll keep the page locked. */
-               set_page_dirty(page);
-               ret = VM_FAULT_LOCKED;
-       }
-out:
        if (ret == VM_FAULT_LOCKED ||
            ci->i_inline_version != CEPH_INLINE_NONE) {
                int dirty;