Details : add llapi_file_open() that allows specifying the mode and
open flags, and also returns an open file handle.
+Severity : normal
+Bugzilla : 12743
+Description: df doesn't work properly if diskfs blocksize != 4K
+Details : Choose biggest blocksize of OST's as the LOV's blocksize.
+
--------------------------------------------------------------------------------
2007-08-27 Cluster File Systems, Inc. <info@clusterfs.com>
obd_osfs.os_bavail, obd_osfs.os_blocks, obd_osfs.os_ffree,
obd_osfs.os_files);
+ osfs->os_bsize = obd_osfs.os_bsize;
osfs->os_blocks = obd_osfs.os_blocks;
osfs->os_bfree = obd_osfs.os_bfree;
osfs->os_bavail = obd_osfs.os_bavail;
void lov_update_statfs(struct obd_device *obd, struct obd_statfs *osfs,
struct obd_statfs *lov_sfs, int success)
{
+ int shift = 0, quit = 0;
+ __u64 tmp;
spin_lock(&obd->obd_osfs_lock);
memcpy(&obd->obd_osfs, lov_sfs, sizeof(*lov_sfs));
obd->obd_osfs_age = get_jiffies_64();
if (success == 0) {
memcpy(osfs, lov_sfs, sizeof(*lov_sfs));
} else {
+ if (osfs->os_bsize != lov_sfs->os_bsize) {
+ /* assume all block sizes are always powers of 2 */
+ /* get the bits difference */
+ tmp = osfs->os_bsize | lov_sfs->os_bsize;
+ for (shift = 0; shift <= 64; ++shift) {
+ if (tmp & 1) {
+ if (quit)
+ break;
+ else
+ quit = 1;
+ shift = 0;
+ }
+ tmp >>= 1;
+ }
+ }
+
+ if (osfs->os_bsize < lov_sfs->os_bsize) {
+ osfs->os_bsize = lov_sfs->os_bsize;
+
+ osfs->os_bfree >>= shift;
+ osfs->os_bavail >>= shift;
+ osfs->os_blocks >>= shift;
+ } else if (shift != 0) {
+ lov_sfs->os_bfree >>= shift;
+ lov_sfs->os_bavail >>= shift;
+ lov_sfs->os_blocks >>= shift;
+ }
#ifdef MIN_DF
/* Sandia requested that df (and so, statfs) only
returned minimal available space on