From a1e774fcb543deaabb0dc59e0c626a7926990d1e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 31 Jan 2008 15:29:42 -0800 Subject: [PATCH] kernel: set inode blksize properly --- src/kernel/inode.c | 27 +++++++++++++++++---------- src/kernel/super.h | 2 -- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 9ccf478054566..ad69c815b47b6 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -4,7 +4,7 @@ #include #include #include - +#include #include int ceph_inode_debug = 50; @@ -44,6 +44,18 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) struct ceph_inode_info *ci = ceph_inode(inode); int i; int symlen; + u32 su = le32_to_cpu(info->layout.fl_stripe_unit); + int blkbits = fls(su)-1; + unsigned blksize = 1 << blkbits; + u64 size = le64_to_cpu(info->size); + u64 blocks = size + blksize - 1; + do_div(blocks, blksize); + + dout(30, "fill_inode %p ino %lu/%llx by %d.%d sz=%llu mode %o nlink %d\n", + inode, inode->i_ino, ceph_ino(inode), inode->i_uid, inode->i_gid, + inode->i_size, inode->i_mode, inode->i_nlink); + dout(30, " su %d, blkbits %d, blksize %u, blocks %llu\n", + su, blkbits, blksize, blocks); ceph_set_ino(inode, le64_to_cpu(info->ino)); inode->i_mode = le32_to_cpu(info->mode); @@ -52,8 +64,9 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) inode->i_nlink = le32_to_cpu(info->nlink); inode->i_rdev = le32_to_cpu(info->rdev); spin_lock(&inode->i_lock); - inode->i_size = le64_to_cpu(info->size); - inode->i_blocks = 1; + inode->i_size = size; + inode->i_blkbits = blkbits; + inode->i_blocks = blocks; spin_unlock(&inode->i_lock); if (ci->i_hashval != inode->i_ino) { @@ -61,10 +74,6 @@ int ceph_fill_inode(struct inode *inode, struct ceph_mds_reply_inode *info) ci->i_hashval = inode->i_ino; } - dout(30, "fill_inode %p ino %lu/%llx by %d.%d sz=%llu mode %o nlink %d\n", - inode, inode->i_ino, ceph_ino(inode), inode->i_uid, inode->i_gid, - inode->i_size, inode->i_mode, inode->i_nlink); - ceph_decode_timespec(&inode->i_atime, &info->atime); ceph_decode_timespec(&inode->i_mtime, &info->mtime); ceph_decode_timespec(&inode->i_ctime, &info->ctime); @@ -675,10 +684,8 @@ int ceph_inode_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat err = ceph_inode_revalidate(dentry); - if (!err) { + if (!err) generic_fillattr(dentry->d_inode, stat); - stat->blksize = CEPH_BLKSIZE; - } return err; } diff --git a/src/kernel/super.h b/src/kernel/super.h index ce609427d7bdb..289d08bc48524 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -31,8 +31,6 @@ extern int ceph_lookup_cache; #define CEPH_SUPER_MAGIC 0xc364c0de /* whatev */ -#define CEPH_BLKSIZE 4096 - #define CACHE_HZ (1*HZ) /* -- 2.39.5