mm: rework calculation of bdi_min_ratio in bdi_set_min_ratio
[sfrench/cifs-2.6.git] / mm / page-writeback.c
index 7e2da284e427188aafefe15b0d6b0f0c6ec80544..9f459f7f8f8312b762cf2222927f39f10e023de6 100644 (file)
@@ -650,18 +650,25 @@ static unsigned int bdi_min_ratio;
 
 int bdi_set_min_ratio(struct backing_dev_info *bdi, unsigned int min_ratio)
 {
+       unsigned int delta;
        int ret = 0;
 
        spin_lock_bh(&bdi_lock);
        if (min_ratio > bdi->max_ratio) {
                ret = -EINVAL;
        } else {
-               min_ratio -= bdi->min_ratio;
-               if (bdi_min_ratio + min_ratio < 100) {
-                       bdi_min_ratio += min_ratio;
-                       bdi->min_ratio += min_ratio;
+               if (min_ratio < bdi->min_ratio) {
+                       delta = bdi->min_ratio - min_ratio;
+                       bdi_min_ratio -= delta;
+                       bdi->min_ratio = min_ratio;
                } else {
-                       ret = -EINVAL;
+                       delta = min_ratio - bdi->min_ratio;
+                       if (bdi_min_ratio + delta < 100) {
+                               bdi_min_ratio += delta;
+                               bdi->min_ratio = min_ratio;
+                       } else {
+                               ret = -EINVAL;
+                       }
                }
        }
        spin_unlock_bh(&bdi_lock);