ANDROID: PM: Fix suspend spinlock in IRQ context

Fix bug in abort of fs_sync during suspend feature, since a spinlock is
taken in IRQ context, we need to use spinlock_irqsave(). This feature is
not yet upstream, so fix needs to be made here.

Link: https://lore.kernel.org/all/20250911185314.2377124-1-wusamuel@google.com/
Bug: 452395562
Change-Id: I8652a579ebd6bb3a6d218f2dd8983712ba6a6578
Signed-off-by: Samuel Wu <wusamuel@google.com>
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
index f6b0ec6..5c8efcd 100644
--- a/kernel/power/suspend.c
+++ b/kernel/power/suspend.c
@@ -88,9 +88,11 @@ static DECLARE_COMPLETION(suspend_fs_sync_complete);
  */
 void suspend_abort_fs_sync(void)
 {
-	spin_lock(&suspend_fs_sync_lock);
+	unsigned long flags;
+
+	spin_lock_irqsave(&suspend_fs_sync_lock, flags);
 	complete(&suspend_fs_sync_complete);
-	spin_unlock(&suspend_fs_sync_lock);
+	spin_unlock_irqrestore(&suspend_fs_sync_lock, flags);
 }
 
 void s2idle_set_ops(const struct platform_s2idle_ops *ops)
@@ -425,12 +427,13 @@ MODULE_PARM_DESC(pm_fs_abort,
 
 static void sync_filesystems_fn(struct work_struct *work)
 {
+	unsigned long flags;
 	ksys_sync_helper();
 
-	spin_lock(&suspend_fs_sync_lock);
+	spin_lock_irqsave(&suspend_fs_sync_lock, flags);
 	suspend_fs_sync_queued = false;
 	complete(&suspend_fs_sync_complete);
-	spin_unlock(&suspend_fs_sync_lock);
+	spin_unlock_irqrestore(&suspend_fs_sync_lock, flags);
 }
 static DECLARE_WORK(sync_filesystems, sync_filesystems_fn);
 
@@ -447,9 +450,10 @@ static int suspend_fs_sync_with_abort(void)
 		return 0;
 	}
 	bool need_suspend_fs_sync_requeue;
+	unsigned long flags;
 
 Start_fs_sync:
-	spin_lock(&suspend_fs_sync_lock);
+	spin_lock_irqsave(&suspend_fs_sync_lock, flags);
 	reinit_completion(&suspend_fs_sync_complete);
 	/*
 	 * Handle the case where a suspend immediately follows a previous
@@ -464,7 +468,7 @@ static int suspend_fs_sync_with_abort(void)
 		suspend_fs_sync_queued = true;
 		schedule_work(&sync_filesystems);
 	}
-	spin_unlock(&suspend_fs_sync_lock);
+	spin_unlock_irqrestore(&suspend_fs_sync_lock, flags);
 
 	/*
 	 * Completion is triggered by fs_sync finishing or a suspend abort