summaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-09-11 10:55:25 -0700
committerSage Weil <sage@newdream.net>2010-09-11 10:55:25 -0700
commita77d9f7dce7600058d56f0670ed29d77abffcde2 (patch)
tree60c0b90d2f3af86e9d65641f61ceca075ed61fdf /fs/ceph
parent3612abbd5df6baa9ca3e0777c6c8646e202d3f66 (diff)
downloadlinux-a77d9f7dce7600058d56f0670ed29d77abffcde2.tar.gz
linux-a77d9f7dce7600058d56f0670ed29d77abffcde2.tar.bz2
linux-a77d9f7dce7600058d56f0670ed29d77abffcde2.zip
ceph: fix file offset wrapping at 4GB on 32-bit archs
Cast the value before shifting so that we don't run out of bits with a 32-bit unsigned long. This fixes wrapping of high file offsets into the low 4GB of a file on disk, and the subsequent data corruption for large files. Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/addr.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/ceph/addr.c b/fs/ceph/addr.c
index 4cfce1ee31fa..50461b8c23a4 100644
--- a/fs/ceph/addr.c
+++ b/fs/ceph/addr.c
@@ -766,7 +766,8 @@ get_more_pages:
/* ok */
if (locked_pages == 0) {
/* prepare async write request */
- offset = page->index << PAGE_CACHE_SHIFT;
+ offset = (unsigned long long)page->index
+ << PAGE_CACHE_SHIFT;
len = wsize;
req = ceph_osdc_new_request(&client->osdc,
&ci->i_layout,