Merge tag 'ceph-for-5.15-rc1' of git://github.com/ceph/ceph-client
[linux-2.6-microblaze.git] / fs / ceph / file.c
index e1d605a..d16fd2d 100644 (file)
@@ -1722,32 +1722,26 @@ retry_snap:
                goto out;
        }
 
-       err = file_remove_privs(file);
-       if (err)
+       down_read(&osdc->lock);
+       map_flags = osdc->osdmap->flags;
+       pool_flags = ceph_pg_pool_flags(osdc->osdmap, ci->i_layout.pool_id);
+       up_read(&osdc->lock);
+       if ((map_flags & CEPH_OSDMAP_FULL) ||
+           (pool_flags & CEPH_POOL_FLAG_FULL)) {
+               err = -ENOSPC;
                goto out;
+       }
 
-       err = file_update_time(file);
+       err = file_remove_privs(file);
        if (err)
                goto out;
 
-       inode_inc_iversion_raw(inode);
-
        if (ci->i_inline_version != CEPH_INLINE_NONE) {
                err = ceph_uninline_data(file, NULL);
                if (err < 0)
                        goto out;
        }
 
-       down_read(&osdc->lock);
-       map_flags = osdc->osdmap->flags;
-       pool_flags = ceph_pg_pool_flags(osdc->osdmap, ci->i_layout.pool_id);
-       up_read(&osdc->lock);
-       if ((map_flags & CEPH_OSDMAP_FULL) ||
-           (pool_flags & CEPH_POOL_FLAG_FULL)) {
-               err = -ENOSPC;
-               goto out;
-       }
-
        dout("aio_write %p %llx.%llx %llu~%zd getting caps. i_size %llu\n",
             inode, ceph_vinop(inode), pos, count, i_size_read(inode));
        if (fi->fmode & CEPH_FILE_MODE_LAZY)
@@ -1759,6 +1753,12 @@ retry_snap:
        if (err < 0)
                goto out;
 
+       err = file_update_time(file);
+       if (err)
+               goto out_caps;
+
+       inode_inc_iversion_raw(inode);
+
        dout("aio_write %p %llx.%llx %llu~%zd got cap refs on %s\n",
             inode, ceph_vinop(inode), pos, count, ceph_cap_string(got));
 
@@ -1842,6 +1842,8 @@ retry_snap:
        }
 
        goto out_unlocked;
+out_caps:
+       ceph_put_cap_refs(ci, got);
 out:
        if (direct_lock)
                ceph_end_io_direct(inode);