From: Sage Weil Date: Mon, 28 Apr 2008 20:41:13 +0000 (-0700) Subject: kclient: fix up write endoff vs max_size logic X-Git-Tag: v0.2~93 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=aec4cb6c2e4b99423b66876335a9665cb89d5d3d;p=ceph.git kclient: fix up write endoff vs max_size logic --- diff --git a/src/kernel/file.c b/src/kernel/file.c index 95b0f86716c..a40342cd976 100644 --- a/src/kernel/file.c +++ b/src/kernel/file.c @@ -283,15 +283,16 @@ ssize_t ceph_write(struct file *filp, const char __user *buf, ssize_t ret; int got = 0; int check = 0; + loff_t endoff = *ppos + len; /* do we need to explicitly request a larger max_size? */ spin_lock(&inode->i_lock); - if (*ppos > ci->i_max_size && - *ppos > (inode->i_size << 1) && - *ppos > ci->i_wanted_max_size) { - dout(10, "write %p at large offset %llu, requesting max_size\n", - inode, *ppos); - ci->i_wanted_max_size = *ppos+len; + if (endoff >= ci->i_max_size && + endoff > (inode->i_size << 1) && + endoff > ci->i_wanted_max_size) { + dout(10, "write %p at large endoff %llu, req max_size\n", + inode, endoff); + ci->i_wanted_max_size = endoff; check = 1; } spin_unlock(&inode->i_lock); diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 841e730b122..3bf903ddca0 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -1163,7 +1163,7 @@ void ceph_take_cap_refs(struct ceph_inode_info *ci, int got) } int ceph_get_cap_refs(struct ceph_inode_info *ci, int need, int want, int *got, - loff_t offset) + loff_t endoff) { int ret = 0; int have; @@ -1171,9 +1171,9 @@ int ceph_get_cap_refs(struct ceph_inode_info *ci, int need, int want, int *got, dout(30, "get_cap_refs on %p need %d want %d\n", &ci->vfs_inode, need, want); spin_lock(&ci->vfs_inode.i_lock); - if (offset >= 0 && offset >= (loff_t)ci->i_max_size) { - dout(20, "get_cap_refs offset %llu >= max_size %llu\n", - offset, ci->i_max_size); + if (endoff >= 0 && endoff > (loff_t)ci->i_max_size) { + dout(20, "get_cap_refs endoff %llu > max_size %llu\n", + endoff, ci->i_max_size); goto sorry; } have = __ceph_caps_issued(ci);