From b314a90d8f3f1d16ec45744e5e2141ea6e14e034 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 27 Aug 2013 12:15:16 -0700 Subject: [PATCH] ceph: fix fallocate division We need to use do_div to divide by a 64-bit value. Signed-off-by: Sage Weil Reviewed-by: Josh Durgin --- fs/ceph/file.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/fs/ceph/file.c b/fs/ceph/file.c index 68af489..d5e12f5 100644 --- a/fs/ceph/file.c +++ b/fs/ceph/file.c @@ -960,13 +960,17 @@ static int ceph_zero_objects(struct inode *inode, loff_t offset, loff_t length) { int ret = 0; struct ceph_inode_info *ci = ceph_inode(inode); - __s32 stripe_unit = ceph_file_layout_su(ci->i_layout); - __s32 stripe_count = ceph_file_layout_stripe_count(ci->i_layout); - __s32 object_size = ceph_file_layout_object_size(ci->i_layout); - loff_t object_set_size = (loff_t)object_size * stripe_count; + s32 stripe_unit = ceph_file_layout_su(ci->i_layout); + s32 stripe_count = ceph_file_layout_stripe_count(ci->i_layout); + s32 object_size = ceph_file_layout_object_size(ci->i_layout); + u64 object_set_size = object_size * stripe_count; + u64 nearly, t; + + /* round offset up to next period boundary */ + nearly = offset + object_set_size - 1; + t = nearly; + nearly -= do_div(t, object_set_size); - loff_t nearly = (offset + object_set_size - 1) - / object_set_size * object_set_size; while (length && offset < nearly) { loff_t size = length; ret = ceph_zero_partial_object(inode, offset, &size); -- 2.7.4