+ lov = &export->exp_obd->u.lov;
+
+ /* We only get block data from the OBD */
+ for (i = 0 ; i < lov->desc.ld_tgt_count; i++) {
+ int err;
+
+ err = obd_statfs(&lov->tgts[i].conn, &lov_sfs);
+ if (err) {
+ CERROR("Error statfs OSC %s on %d: err = %d\n",
+ lov->tgts[i].uuid, i, err);
+ if (!rc)
+ rc = err;
+ continue; /* XXX or break? - probably OK to continue */
+ }
+ if (!set) {
+ memcpy(sfs, &lov_sfs, sizeof(lov_sfs));
+ set = 1;
+ } else {
+ sfs->f_bfree += lov_sfs.f_bfree;
+ sfs->f_bavail += lov_sfs.f_bavail;
+ sfs->f_blocks += lov_sfs.f_blocks;
+ /* XXX not sure about this one - depends on policy.
+ * - could be minimum if we always stripe on all OBDs
+ * (but that would be wrong for any other policy,
+ * if one of the OBDs has no more objects left)
+ * - could be sum if we stripe whole objects
+ * - could be average, just to give a nice number
+ * - we just pick first OST and hope it is enough
+ sfs->f_ffree += lov_sfs.f_ffree;
+ */
+ }
+ }
+ RETURN(rc);
+}