Fix direct bitops to use set_bit/clear_bit which
are atomic - this is required since there are
some places in code that do not use locking when
operating on that bits. this is also a preparation
to relax locking.

https://virtuozzo.atlassian.net/browse/VSTOR-91820
Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com>
---
 drivers/md/dm-ploop-cmd.c |  2 +-
 drivers/md/dm-ploop-map.c | 32 +++++++++++++++-----------------
 drivers/md/dm-ploop.h     |  2 +-
 3 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/drivers/md/dm-ploop-cmd.c b/drivers/md/dm-ploop-cmd.c
index 13a56d702fc3..8bbb1680c579 100644
--- a/drivers/md/dm-ploop-cmd.c
+++ b/drivers/md/dm-ploop-cmd.c
@@ -274,7 +274,7 @@ static int ploop_write_zero_cluster_sync(struct ploop 
*ploop,
 static void ploop_make_md_wb(struct ploop *ploop, struct md_page *md)
 {
        write_lock_irq(&ploop->bat_rwlock);
-       md->status |= MD_WRITEBACK;
+       set_bit(MD_WRITEBACK, &md->status);
        write_unlock_irq(&ploop->bat_rwlock);
 }
 
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c
index 0036df692689..4f31000a8c1e 100644
--- a/drivers/md/dm-ploop-map.c
+++ b/drivers/md/dm-ploop-map.c
@@ -384,7 +384,7 @@ static bool ploop_delay_if_md_busy(struct ploop *ploop, 
struct md_page *md,
 
        write_lock_irqsave(&ploop->bat_rwlock, flags);
        piwb = md->piwb;
-       if (piwb && (piwb->type != type || (md->status & MD_WRITEBACK))) {
+       if (piwb && (piwb->type != type || test_bit(MD_WRITEBACK, 
&md->status))) {
                list_add_tail(&pio->list, &md->wait_list);
                busy = true;
        }
@@ -551,9 +551,8 @@ static bool ploop_md_make_dirty(struct ploop *ploop, struct 
md_page *md)
        bool new = false;
 
        write_lock_irqsave(&ploop->bat_rwlock, flags);
-       WARN_ON_ONCE((md->status & MD_WRITEBACK));
-       if (!(md->status & MD_DIRTY)) {
-               md->status |= MD_DIRTY;
+       WARN_ON_ONCE(test_bit(MD_WRITEBACK, &md->status));
+       if (!test_and_set_bit(MD_DIRTY, &md->status)) {
                list_add_tail(&md->wb_link, &ploop->wb_batch_list);
                new = true;
        }
@@ -801,8 +800,8 @@ static void ploop_advance_local_after_bat_wb(struct ploop 
*ploop,
                }
        }
 
-       WARN_ON_ONCE(!(md->status & MD_WRITEBACK));
-       md->status &= ~MD_WRITEBACK;
+       WARN_ON_ONCE(!test_bit(MD_WRITEBACK, &md->status));
+       clear_bit(MD_WRITEBACK, &md->status);
        md->piwb = NULL;
        list_splice_tail_init(&md->wait_list, &list);
        write_unlock_irqrestore(&ploop->bat_rwlock, flags);
@@ -1373,8 +1372,8 @@ static void ploop_submit_cow_index_wb(struct ploop_cow 
*cow)
        if (ploop_delay_if_md_busy(ploop, md, PIWB_TYPE_ALLOC, cow->aux_pio))
                goto out;
 
-       if (!(md->status & MD_DIRTY)) {
-               /* Unlocked, since MD_DIRTY is set and cleared from this work */
+       if (!test_bit(MD_DIRTY, &md->status)) {
+               /* MD_DIRTY is set and cleared from this work */
                if (ploop_prepare_bat_update(ploop, md, PIWB_TYPE_ALLOC) < 0)
                        goto err_resource;
                ploop_md_make_dirty(ploop, md);
@@ -1460,7 +1459,7 @@ static bool 
ploop_locate_new_cluster_and_attach_pio(struct ploop *ploop,
        if (ploop_delay_if_md_busy(ploop, md, PIWB_TYPE_ALLOC, pio))
                goto out;
 
-       if (!(md->status & MD_DIRTY)) {
+       if (!test_bit(MD_DIRTY, &md->status)) {
                 /* Unlocked since MD_DIRTY is set and cleared from this work */
                page_id = ploop_bat_clu_to_page_nr(clu);
                if (ploop_prepare_bat_update(ploop, md, PIWB_TYPE_ALLOC) < 0) {
@@ -1703,7 +1702,7 @@ static void ploop_process_one_discard_pio(struct ploop 
*ploop, struct pio *pio)
        if (ploop_delay_if_md_busy(ploop, md, PIWB_TYPE_DISCARD, pio))
                goto out;
 
-       if (!(md->status & MD_DIRTY)) {
+       if (!test_bit(MD_DIRTY, &md->status)) {
                 /* Unlocked since MD_DIRTY is set and cleared from this work */
                if (ploop_prepare_bat_update(ploop, md, PIWB_TYPE_DISCARD) < 0) 
{
                        pio->bi_status = BLK_STS_RESOURCE;
@@ -1759,7 +1758,6 @@ static void ploop_process_resubmit_pios(struct ploop 
*ploop,
 static void ploop_submit_metadata_writeback(struct ploop *ploop)
 {
        struct md_page *md;
-
        while (1) {
                write_lock_irq(&ploop->bat_rwlock);
                md = list_first_entry_or_null(&ploop->wb_batch_list,
@@ -1770,10 +1768,10 @@ static void ploop_submit_metadata_writeback(struct 
ploop *ploop)
                }
                list_del_init(&md->wb_link);
                /* L1L2 mustn't be redirtyed, when wb in-flight! */
-               WARN_ON_ONCE(!(md->status & MD_DIRTY) ||
-                            (md->status & MD_WRITEBACK));
-               md->status |= MD_WRITEBACK;
-               md->status &= ~MD_DIRTY;
+               WARN_ON_ONCE(!test_bit(MD_DIRTY, &md->status));
+               WARN_ON_ONCE(test_bit(MD_WRITEBACK, &md->status));
+               set_bit(MD_WRITEBACK, &md->status);
+               clear_bit(MD_DIRTY, &md->status);
                write_unlock_irq(&ploop->bat_rwlock);
 
                ploop_index_wb_submit(ploop, md->piwb);
@@ -1950,8 +1948,8 @@ int ploop_prepare_reloc_index_wb(struct ploop *ploop,
                type = PIWB_TYPE_RELOC;
 
        err = -EIO;
-       if ((md->status & (MD_DIRTY|MD_WRITEBACK))) {
-               PL_ERR("Unexpected md status: %x", md->status);
+       if (test_bit(MD_DIRTY, &md->status) || test_bit(MD_WRITEBACK, 
&md->status)) {
+               PL_ERR("Unexpected md status: %lx", md->status);
                goto out_error;
        }
        err = ploop_prepare_bat_update(ploop, md, type);
diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h
index 90c80954c198..5fa176affc4e 100644
--- a/drivers/md/dm-ploop.h
+++ b/drivers/md/dm-ploop.h
@@ -117,7 +117,7 @@ struct md_page {
        u32 id; /* Number of this page starting from hdr */
 #define MD_DIRTY       (1U << 1) /* Page contains changes and wants writeback 
*/
 #define MD_WRITEBACK   (1U << 2) /* Writeback was submitted */
-       unsigned int status;
+       unsigned long status;
        struct page *page;
        void *kmpage;
        u8 *bat_levels;
-- 
2.43.0

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to