goto fail_sysfs;
        }
 
-       if (!sb_rdonly(sb) && !btrfs_check_rw_degradable(fs_info)) {
+       if (!sb_rdonly(sb) && !btrfs_check_rw_degradable(fs_info, NULL)) {
                btrfs_warn(fs_info,
                "writeable mount is not allowed due to too many missing devices");
                goto fail_sysfs;
 
 static int check_barrier_error(struct btrfs_fs_info *fs_info)
 {
-       if (!btrfs_check_rw_degradable(fs_info))
+       if (!btrfs_check_rw_degradable(fs_info, NULL))
                return -EIO;
        return 0;
 }
 
                        goto restore;
                }
 
-               if (!btrfs_check_rw_degradable(fs_info)) {
+               if (!btrfs_check_rw_degradable(fs_info, NULL)) {
                        btrfs_warn(fs_info,
                                "too many missing devices, writeable remount is not allowed");
                        ret = -EACCES;
 
 /*
  * Check if all chunks in the fs are OK for read-write degraded mount
  *
+ * If the @failing_dev is specified, it's accounted as missing.
+ *
  * Return true if all chunks meet the minimal RW mount requirements.
  * Return false if any chunk doesn't meet the minimal RW mount requirements.
  */
-bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info)
+bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info,
+                                       struct btrfs_device *failing_dev)
 {
        struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree;
        struct extent_map *em;
                            test_bit(BTRFS_DEV_STATE_MISSING, &dev->dev_state) ||
                            dev->last_flush_error)
                                missing++;
+                       else if (failing_dev && failing_dev == dev)
+                               missing++;
                }
                if (missing > max_tolerated) {
-                       btrfs_warn(fs_info,
+                       if (!failing_dev)
+                               btrfs_warn(fs_info,
        "chunk %llu missing %d devices, max tolerance is %d for writeable mount",
                                   em->start, missing, max_tolerated);
                        free_extent_map(em);
 
 struct list_head *btrfs_get_fs_uuids(void);
 void btrfs_set_fs_info_ptr(struct btrfs_fs_info *fs_info);
 void btrfs_reset_fs_info_ptr(struct btrfs_fs_info *fs_info);
-
-bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info);
+bool btrfs_check_rw_degradable(struct btrfs_fs_info *fs_info,
+                                       struct btrfs_device *failing_dev);
 
 #endif