diff --git a/lustre/ChangeLog b/lustre/ChangeLog index f3bc113951272eeaa2408d258606b9703da81d24..5f188352d5c74141a177c5d619c39582965887d7 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -31,6 +31,11 @@ Description: llapi_file_create() does not allow some changes 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> diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 47f4cdf733a09c73ccfd93ac93124937c2e5dcda..39990cd8dc54e4304c9f707aef7ef6df0523e86a 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -1418,6 +1418,7 @@ int ll_statfs_internal(struct super_block *sb, struct obd_statfs *osfs, 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; diff --git a/lustre/lov/lov_request.c b/lustre/lov/lov_request.c index 439d34b56ec5120307fd9dedc9923c7a8076186f..a8e43dcc858ed45ee11a833535ac9cda12fdd691 100644 --- a/lustre/lov/lov_request.c +++ b/lustre/lov/lov_request.c @@ -1485,6 +1485,8 @@ int lov_fini_statfs_set(struct lov_request_set *set) 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(); @@ -1493,6 +1495,33 @@ void lov_update_statfs(struct obd_device *obd, struct obd_statfs *osfs, 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