Whamcloud - gitweb
LU-14513 osd: release o_guard before quota acquisition 18/42018/11
authorAlex Zhuravlev <bzzz@whamcloud.com>
Fri, 12 Mar 2021 06:17:11 +0000 (09:17 +0300)
committerOleg Drokin <green@whamcloud.com>
Mon, 21 Jun 2021 22:16:29 +0000 (22:16 +0000)
to avoid deadlocks as regular transactions (like write) start
a transaction, then grab o_guard.

Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: I2678677ed6c213e4bed30cc1218e48b8f2900dc4
Reviewed-on: https://review.whamcloud.com/42018
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Wang Shilong <wshilong@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osd-zfs/osd_object.c

index 49f887e..464e0d6 100644 (file)
@@ -1131,7 +1131,7 @@ static int osd_declare_attr_set(const struct lu_env *env,
 
        down_read(&obj->oo_guard);
        if (unlikely(!dt_object_exists(dt) || obj->oo_destroyed))
 
        down_read(&obj->oo_guard);
        if (unlikely(!dt_object_exists(dt) || obj->oo_destroyed))
-               GOTO(out, rc = 0);
+               GOTO(out_sem, rc = 0);
 
        LASSERT(obj->oo_sa_hdl != NULL);
        LASSERT(oh->ot_tx != NULL);
 
        LASSERT(obj->oo_sa_hdl != NULL);
        LASSERT(oh->ot_tx != NULL);
@@ -1153,7 +1153,7 @@ static int osd_declare_attr_set(const struct lu_env *env,
        if (!found)
                dmu_tx_hold_bonus(oh->ot_tx, obj->oo_dn->dn_object);
        if (oh->ot_tx->tx_err != 0)
        if (!found)
                dmu_tx_hold_bonus(oh->ot_tx, obj->oo_dn->dn_object);
        if (oh->ot_tx->tx_err != 0)
-               GOTO(out, rc = -oh->ot_tx->tx_err);
+               GOTO(out_sem, rc = -oh->ot_tx->tx_err);
 
        if (attr && attr->la_valid & LA_FLAGS) {
                /* LMA is usually a part of bonus, no need to declare
 
        if (attr && attr->la_valid & LA_FLAGS) {
                /* LMA is usually a part of bonus, no need to declare
@@ -1169,6 +1169,9 @@ static int osd_declare_attr_set(const struct lu_env *env,
                       osd->od_svname,
                       attr->la_uid, attr->la_gid, bspace, blksize);
        }
                       osd->od_svname,
                       attr->la_uid, attr->la_gid, bspace, blksize);
        }
+       /* to preserve locking order - qsd_transfer() may need to flush
+        * currently running transaction when we're out of quota. */
+       up_read(&obj->oo_guard);
 
        if (attr && attr->la_valid & LA_UID) {
                /* quota enforcement for user */
 
        if (attr && attr->la_valid & LA_UID) {
                /* quota enforcement for user */
@@ -1229,6 +1232,8 @@ static int osd_declare_attr_set(const struct lu_env *env,
        }
 #endif
 out:
        }
 #endif
 out:
+       RETURN(rc);
+out_sem:
        up_read(&obj->oo_guard);
        RETURN(rc);
 }
        up_read(&obj->oo_guard);
        RETURN(rc);
 }