}
        ksmbd_revert_fsids(work);
 err_out1:
-       if (!rc)
+       if (!rc) {
+               ksmbd_update_fstate(&work->sess->file_table, fp, FP_INITED);
                rc = ksmbd_iov_pin_rsp(work, (void *)rsp, iov_len);
+       }
        if (rc) {
                if (rc == -EINVAL)
                        rsp->hdr.Status = STATUS_INVALID_PARAMETER;
 
 
 static struct ksmbd_file *ksmbd_fp_get(struct ksmbd_file *fp)
 {
+       if (fp->f_state != FP_INITED)
+               return NULL;
+
        if (!atomic_inc_not_zero(&fp->refcount))
                return NULL;
        return fp;
                return 0;
 
        ft = &work->sess->file_table;
-       read_lock(&ft->lock);
+       write_lock(&ft->lock);
        fp = idr_find(ft->idr, id);
        if (fp) {
                set_close_state_blocked_works(fp);
 
-               if (!atomic_dec_and_test(&fp->refcount))
+               if (fp->f_state != FP_INITED)
                        fp = NULL;
+               else {
+                       fp->f_state = FP_CLOSED;
+                       if (!atomic_dec_and_test(&fp->refcount))
+                               fp = NULL;
+               }
        }
-       read_unlock(&ft->lock);
+       write_unlock(&ft->lock);
 
        if (!fp)
                return -EINVAL;
        fp->tcon                = work->tcon;
        fp->volatile_id         = KSMBD_NO_FID;
        fp->persistent_id       = KSMBD_NO_FID;
+       fp->f_state             = FP_NEW;
        fp->f_ci                = ksmbd_inode_get(fp);
 
        if (!fp->f_ci) {
        return ERR_PTR(ret);
 }
 
+void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp,
+                        unsigned int state)
+{
+       write_lock(&ft->lock);
+       fp->f_state = state;
+       write_unlock(&ft->lock);
+}
+
 static int
 __close_file_table_ids(struct ksmbd_file_table *ft,
                       struct ksmbd_tree_connect *tcon,
 
        __le32                          m_fattr;
 };
 
+enum {
+       FP_NEW = 0,
+       FP_INITED,
+       FP_CLOSED
+};
+
 struct ksmbd_file {
        struct file                     *filp;
        u64                             persistent_id;
        /* if ls is happening on directory, below is valid*/
        struct ksmbd_readdir_data       readdir_data;
        int                             dot_dotdot[2];
+       unsigned int                    f_state;
 };
 
 static inline void set_ctx_actor(struct dir_context *ctx,
 int ksmbd_init_global_file_table(void);
 void ksmbd_free_global_file_table(void);
 void ksmbd_set_fd_limit(unsigned long limit);
+void ksmbd_update_fstate(struct ksmbd_file_table *ft, struct ksmbd_file *fp,
+                        unsigned int state);
 
 /*
  * INODE hash