CACHEFILES_ONDEMAND_OBJSTATE_CLOSE, /* Anonymous fd closed by daemon or initial state */
        CACHEFILES_ONDEMAND_OBJSTATE_OPEN, /* Anonymous fd associated with object is available */
        CACHEFILES_ONDEMAND_OBJSTATE_REOPENING, /* Object that was closed and is being reopened. */
+       CACHEFILES_ONDEMAND_OBJSTATE_DROPPING, /* Object is being dropped. */
 };
 
 struct cachefiles_ondemand_info {
 CACHEFILES_OBJECT_STATE_FUNCS(open, OPEN);
 CACHEFILES_OBJECT_STATE_FUNCS(close, CLOSE);
 CACHEFILES_OBJECT_STATE_FUNCS(reopening, REOPENING);
+CACHEFILES_OBJECT_STATE_FUNCS(dropping, DROPPING);
 
 static inline bool cachefiles_ondemand_is_reopening_read(struct cachefiles_req *req)
 {
 
                 */
                xas_lock(&xas);
 
-               if (test_bit(CACHEFILES_DEAD, &cache->flags)) {
+               if (test_bit(CACHEFILES_DEAD, &cache->flags) ||
+                   cachefiles_ondemand_object_is_dropping(object)) {
                        xas_unlock(&xas);
                        ret = -EIO;
                        goto out;
         * If error occurs after creating the anonymous fd,
         * cachefiles_ondemand_fd_release() will set object to close.
         */
-       if (opcode == CACHEFILES_OP_OPEN)
+       if (opcode == CACHEFILES_OP_OPEN &&
+           !cachefiles_ondemand_object_is_dropping(object))
                cachefiles_ondemand_set_object_close(object);
        kfree(req);
        return ret;
 
 void cachefiles_ondemand_clean_object(struct cachefiles_object *object)
 {
+       if (!object->ondemand)
+               return;
+
        cachefiles_ondemand_send_req(object, CACHEFILES_OP_CLOSE, 0,
                        cachefiles_ondemand_init_close_req, NULL);
+       cachefiles_ondemand_set_object_dropping(object);
 }
 
 int cachefiles_ondemand_init_obj_info(struct cachefiles_object *object,