} else if (discard_type == DPOLICY_FSTRIM) {
                dpolicy->io_aware = false;
        } else if (discard_type == DPOLICY_UMOUNT) {
-               dpolicy->max_requests = UINT_MAX;
                dpolicy->io_aware = false;
                /* we need to issue all to keep CP_TRIMMED_FLAG */
                dpolicy->granularity = 1;
 
        return issued;
 }
+static unsigned int __wait_all_discard_cmd(struct f2fs_sb_info *sbi,
+                                       struct discard_policy *dpolicy);
 
 static int __issue_discard_cmd(struct f2fs_sb_info *sbi,
                                        struct discard_policy *dpolicy)
        struct list_head *pend_list;
        struct discard_cmd *dc, *tmp;
        struct blk_plug plug;
-       int i, issued = 0;
+       int i, issued;
        bool io_interrupted = false;
 
        if (dpolicy->timeout)
                f2fs_update_time(sbi, UMOUNT_DISCARD_TIMEOUT);
 
+retry:
+       issued = 0;
        for (i = MAX_PLIST_NUM - 1; i >= 0; i--) {
                if (dpolicy->timeout &&
                                f2fs_time_over(sbi, UMOUNT_DISCARD_TIMEOUT))
                        break;
        }
 
+       if (dpolicy->type == DPOLICY_UMOUNT && issued) {
+               __wait_all_discard_cmd(sbi, dpolicy);
+               goto retry;
+       }
+
        if (!issued && io_interrupted)
                issued = -1;