Merge tag 'for-5.3/dm-changes-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / drivers / md / dm-zoned-metadata.c
index 4cdde7a02e94a868cc9beb0923b47bb10530bd7e..8545dcee9fd0498d1334656881a02fac426276f5 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/module.h>
 #include <linux/crc32.h>
+#include <linux/sched/mm.h>
 
 #define        DM_MSG_PREFIX           "zoned metadata"
 
@@ -1162,8 +1163,7 @@ static int dmz_init_zones(struct dmz_metadata *zmd)
        while (sector < dev->capacity) {
                /* Get zone information */
                nr_blkz = DMZ_REPORT_NR_ZONES;
-               ret = blkdev_report_zones(dev->bdev, sector, blkz,
-                                         &nr_blkz, GFP_KERNEL);
+               ret = blkdev_report_zones(dev->bdev, sector, blkz, &nr_blkz);
                if (ret) {
                        dmz_dev_err(dev, "Report zones failed %d", ret);
                        goto out;
@@ -1201,12 +1201,20 @@ out:
 static int dmz_update_zone(struct dmz_metadata *zmd, struct dm_zone *zone)
 {
        unsigned int nr_blkz = 1;
+       unsigned int noio_flag;
        struct blk_zone blkz;
        int ret;
 
-       /* Get zone information from disk */
+       /*
+        * Get zone information from disk. Since blkdev_report_zones() uses
+        * GFP_KERNEL by default for memory allocations, set the per-task
+        * PF_MEMALLOC_NOIO flag so that all allocations are done as if
+        * GFP_NOIO was specified.
+        */
+       noio_flag = memalloc_noio_save();
        ret = blkdev_report_zones(zmd->dev->bdev, dmz_start_sect(zmd, zone),
-                                 &blkz, &nr_blkz, GFP_NOIO);
+                                 &blkz, &nr_blkz);
+       memalloc_noio_restore(noio_flag);
        if (!nr_blkz)
                ret = -EIO;
        if (ret) {