if (obd->obd_osfs_age < max_age ||
((obd->obd_osfs.os_state & OS_STATE_SUM) &&
!(flags & OBD_STATFS_SUM))) {
- bool update_age = false;
/* the RPC will block anyway, so avoid sending many at once */
rc = mutex_lock_interruptible(&obd->obd_dev_mutex);
if (rc)
((obd->obd_osfs.os_state & OS_STATE_SUM) &&
!(flags & OBD_STATFS_SUM))) {
rc = OBP(obd, statfs)(env, exp, osfs, max_age, flags);
- update_age = true;
} else {
- CDEBUG(D_SUPER,
- "%s: new %p cache blocks %llu/%llu objects %llu/%llu\n",
- obd->obd_name, &obd->obd_osfs,
- obd->obd_osfs.os_bavail, obd->obd_osfs.os_blocks,
- obd->obd_osfs.os_ffree, obd->obd_osfs.os_files);
+ mutex_unlock(&obd->obd_dev_mutex);
+ GOTO(cached, rc = 0);
}
if (rc == 0) {
+ CDEBUG(D_SUPER,
+ "%s: update %p cache blocks %llu/%llu objects %llu/%llu\n",
+ obd->obd_name, &obd->obd_osfs,
+ osfs->os_bavail, osfs->os_blocks,
+ osfs->os_ffree, osfs->os_files);
+
spin_lock(&obd->obd_osfs_lock);
memcpy(&obd->obd_osfs, osfs, sizeof(obd->obd_osfs));
- if (update_age)
- obd->obd_osfs_age = ktime_get_seconds();
+ obd->obd_osfs_age = ktime_get_seconds();
spin_unlock(&obd->obd_osfs_lock);
}
mutex_unlock(&obd->obd_dev_mutex);
} else {
+cached:
CDEBUG(D_SUPER,
"%s: use %p cache blocks %llu/%llu objects %llu/%llu\n",
obd->obd_name, &obd->obd_osfs,
}
run_test 422 "kill a process with RPC in progress"
+stat_test() {
+ df -h $MOUNT &
+ df -h $MOUNT &
+ df -h $MOUNT &
+ df -h $MOUNT &
+ df -h $MOUNT &
+ df -h $MOUNT &
+}
+
+test_423() {
+ local _stats
+ # ensure statfs cache is expired
+ sleep 2;
+
+ _stats=$(stat_test | grep $MOUNT | sort -u | wc -l)
+ [[ ${_stats} -ne 1 ]] && error "statfs wrong"
+
+ return 0
+}
+run_test 423 "statfs should return a right data"
+
prep_801() {
[[ $MDS1_VERSION -lt $(version_code 2.9.55) ]] ||
[[ $OST1_VERSION -lt $(version_code 2.9.55) ]] &&