|
@@ -296,13 +296,18 @@ static inline void unlock_cluster(struct swap_cluster_info *ci)
|
|
|
spin_unlock(&ci->lock);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Determine the locking method in use for this device. Return
|
|
|
+ * swap_cluster_info if SSD-style cluster-based locking is in place.
|
|
|
+ */
|
|
|
static inline struct swap_cluster_info *lock_cluster_or_swap_info(
|
|
|
- struct swap_info_struct *si,
|
|
|
- unsigned long offset)
|
|
|
+ struct swap_info_struct *si, unsigned long offset)
|
|
|
{
|
|
|
struct swap_cluster_info *ci;
|
|
|
|
|
|
+ /* Try to use fine-grained SSD-style locking if available: */
|
|
|
ci = lock_cluster(si, offset);
|
|
|
+ /* Otherwise, fall back to traditional, coarse locking: */
|
|
|
if (!ci)
|
|
|
spin_lock(&si->lock);
|
|
|
|