Refactor in preparation for a second use of the logic.

Signed-off-by: Christopher Unkel <cun...@drivescale.com>
---
 drivers/md/md-bitmap.c | 72 +++++++++++++++++++++++-------------------
 1 file changed, 40 insertions(+), 32 deletions(-)

diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
index 200c5d0f08bf..600b89d5a3ad 100644
--- a/drivers/md/md-bitmap.c
+++ b/drivers/md/md-bitmap.c
@@ -209,6 +209,44 @@ static struct md_rdev *next_active_rdev(struct md_rdev 
*rdev, struct mddev *mdde
        return NULL;
 }
 
+static int sb_write_alignment_ok(struct mddev *mddev, struct md_rdev *rdev,
+                                struct page *page, int offset, int size)
+{
+       if (mddev->external) {
+               /* Bitmap could be anywhere. */
+               if (rdev->sb_start + offset + (page->index
+                                              * (PAGE_SIZE/512))
+                   > rdev->data_offset
+                   &&
+                   rdev->sb_start + offset
+                   < (rdev->data_offset + mddev->dev_sectors
+                    + (PAGE_SIZE/512)))
+                       return 0;
+       } else if (offset < 0) {
+               /* DATA  BITMAP METADATA  */
+               if (offset
+                   + (long)(page->index * (PAGE_SIZE/512))
+                   + size/512 > 0)
+                       /* bitmap runs in to metadata */
+                       return 0;
+               if (rdev->data_offset + mddev->dev_sectors
+                   > rdev->sb_start + offset)
+                       /* data runs in to bitmap */
+                       return 0;
+       } else if (rdev->sb_start < rdev->data_offset) {
+               /* METADATA BITMAP DATA */
+               if (rdev->sb_start
+                   + offset
+                   + page->index*(PAGE_SIZE/512) + size/512
+                   > rdev->data_offset)
+                       /* bitmap runs in to data */
+                       return 0;
+       } else {
+               /* DATA METADATA BITMAP - no problems */
+       }
+       return 1;
+}
+
 static int write_sb_page(struct bitmap *bitmap, struct page *page, int wait)
 {
        struct md_rdev *rdev;
@@ -234,38 +272,8 @@ static int write_sb_page(struct bitmap *bitmap, struct 
page *page, int wait)
                /* Just make sure we aren't corrupting data or
                 * metadata
                 */
-               if (mddev->external) {
-                       /* Bitmap could be anywhere. */
-                       if (rdev->sb_start + offset + (page->index
-                                                      * (PAGE_SIZE/512))
-                           > rdev->data_offset
-                           &&
-                           rdev->sb_start + offset
-                           < (rdev->data_offset + mddev->dev_sectors
-                            + (PAGE_SIZE/512)))
-                               goto bad_alignment;
-               } else if (offset < 0) {
-                       /* DATA  BITMAP METADATA  */
-                       if (offset
-                           + (long)(page->index * (PAGE_SIZE/512))
-                           + size/512 > 0)
-                               /* bitmap runs in to metadata */
-                               goto bad_alignment;
-                       if (rdev->data_offset + mddev->dev_sectors
-                           > rdev->sb_start + offset)
-                               /* data runs in to bitmap */
-                               goto bad_alignment;
-               } else if (rdev->sb_start < rdev->data_offset) {
-                       /* METADATA BITMAP DATA */
-                       if (rdev->sb_start
-                           + offset
-                           + page->index*(PAGE_SIZE/512) + size/512
-                           > rdev->data_offset)
-                               /* bitmap runs in to data */
-                               goto bad_alignment;
-               } else {
-                       /* DATA METADATA BITMAP - no problems */
-               }
+               if (!sb_write_alignment_ok(mddev, rdev, page, offset, size))
+                       goto bad_alignment;
                md_super_write(mddev, rdev,
                               rdev->sb_start + offset
                               + page->index * (PAGE_SIZE/512),
-- 
2.17.1

Reply via email to