md/raid5: Replace deprecated CPU-hotplug functions.
[linux-2.6-microblaze.git] / fs / ext4 / mmp.c
index 6cb598b..cebea42 100644 (file)
@@ -138,7 +138,7 @@ static int kmmpd(void *data)
        unsigned mmp_check_interval;
        unsigned long last_update_time;
        unsigned long diff;
-       int retval;
+       int retval = 0;
 
        mmp_block = le64_to_cpu(es->s_mmp_block);
        mmp = (struct mmp_struct *)(bh->b_data);
@@ -156,7 +156,12 @@ static int kmmpd(void *data)
        memcpy(mmp->mmp_nodename, init_utsname()->nodename,
               sizeof(mmp->mmp_nodename));
 
-       while (!kthread_should_stop()) {
+       while (!kthread_should_stop() && !sb_rdonly(sb)) {
+               if (!ext4_has_feature_mmp(sb)) {
+                       ext4_warning(sb, "kmmpd being stopped since MMP feature"
+                                    " has been disabled.");
+                       goto wait_to_exit;
+               }
                if (++seq > EXT4_MMP_SEQ_MAX)
                        seq = 1;
 
@@ -177,16 +182,6 @@ static int kmmpd(void *data)
                        failed_writes++;
                }
 
-               if (!(le32_to_cpu(es->s_feature_incompat) &
-                   EXT4_FEATURE_INCOMPAT_MMP)) {
-                       ext4_warning(sb, "kmmpd being stopped since MMP feature"
-                                    " has been disabled.");
-                       goto exit_thread;
-               }
-
-               if (sb_rdonly(sb))
-                       break;
-
                diff = jiffies - last_update_time;
                if (diff < mmp_update_interval * HZ)
                        schedule_timeout_interruptible(mmp_update_interval *
@@ -207,7 +202,7 @@ static int kmmpd(void *data)
                                ext4_error_err(sb, -retval,
                                               "error reading MMP data: %d",
                                               retval);
-                               goto exit_thread;
+                               goto wait_to_exit;
                        }
 
                        mmp_check = (struct mmp_struct *)(bh_check->b_data);
@@ -221,7 +216,7 @@ static int kmmpd(void *data)
                                ext4_error_err(sb, EBUSY, "abort");
                                put_bh(bh_check);
                                retval = -EBUSY;
-                               goto exit_thread;
+                               goto wait_to_exit;
                        }
                        put_bh(bh_check);
                }
@@ -244,7 +239,13 @@ static int kmmpd(void *data)
 
        retval = write_mmp_block(sb, bh);
 
-exit_thread:
+wait_to_exit:
+       while (!kthread_should_stop()) {
+               set_current_state(TASK_INTERRUPTIBLE);
+               if (!kthread_should_stop())
+                       schedule();
+       }
+       set_current_state(TASK_RUNNING);
        return retval;
 }
 
@@ -391,5 +392,3 @@ failed:
        brelse(bh);
        return 1;
 }
-
-