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>
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))
LASSERT(obj->oo_sa_hdl != NULL);
LASSERT(oh->ot_tx != NULL);
LASSERT(obj->oo_sa_hdl != NULL);
LASSERT(oh->ot_tx != NULL);
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
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 */
up_read(&obj->oo_guard);
RETURN(rc);
}
up_read(&obj->oo_guard);
RETURN(rc);
}