Whamcloud - gitweb
LU-14277 lod: statfs should not block a create 97/41497/4
authorAlexey Lyashkov <alexey.lyashkov@hpe.com>
Fri, 29 Jan 2021 09:29:27 +0000 (12:29 +0300)
committerOleg Drokin <green@whamcloud.com>
Wed, 26 Jan 2022 05:12:13 +0000 (05:12 +0000)
lod_qos_statfs_update() need a guarantee that targets
isn't changed, so it doesn't need to take a QoS mutex.

HPE-bug-id: LUS-2106
Signed-off-by: Alexander Boyko <alexander.boyko@hpe.com>
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: Id9f0ea2fa006bee601d05e14b2e515fcf8248249
Reviewed-on: https://review.whamcloud.com/41497
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/lu_object.h
lustre/lod/lod_qos.c

index 809afe1..5e55af8 100644 (file)
@@ -1548,6 +1548,7 @@ enum lq_flag {
        LQ_SAME_SPACE,       /* the OSTs all have approx.
                              * the same space avail */
        LQ_RESET,            /* zero current penalties */
+       LQ_SF_PROGRESS,      /* statfs op in progress */
 };
 
 #ifdef HAVE_SERVER_SUPPORT
index f6571f3..4a46796 100644 (file)
@@ -210,11 +210,15 @@ void lod_qos_statfs_update(const struct lu_env *env, struct lod_device *lod,
                /* statfs data are quite recent, don't need to refresh it */
                RETURN_EXIT;
 
-       down_write(&ltd->ltd_qos.lq_rw_sem);
-
-       if (obd->obd_osfs_age > max_age)
-               goto out;
+       if (test_and_set_bit(LQ_SF_PROGRESS, &ltd->ltd_qos.lq_flags))
+               RETURN_EXIT;
 
+       if (obd->obd_osfs_age > max_age) {
+               /* statfs data are quite recent, don't need to refresh it */
+               clear_bit(LQ_SF_PROGRESS, &ltd->ltd_qos.lq_flags);
+               RETURN_EXIT;
+       }
+       lod_getref(ltd);
        ltd_foreach_tgt(ltd, tgt) {
                avail = tgt->ltd_statfs.os_bavail;
                if (lod_statfs_and_check(env, lod, ltd, tgt, 0))
@@ -224,10 +228,10 @@ void lod_qos_statfs_update(const struct lu_env *env, struct lod_device *lod,
                        /* recalculate weigths */
                        set_bit(LQ_DIRTY, &ltd->ltd_qos.lq_flags);
        }
+       lod_putref(lod, ltd);
        obd->obd_osfs_age = ktime_get_seconds();
 
-out:
-       up_write(&ltd->ltd_qos.lq_rw_sem);
+       clear_bit(LQ_SF_PROGRESS, &ltd->ltd_qos.lq_flags);
        EXIT;
 }