From: Sage Weil Date: Thu, 30 Apr 2009 14:12:07 +0000 (-0700) Subject: kclient: fix page_mkwrite for 2.6.30 X-Git-Tag: v0.7.3~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9b39a6310940887bdc336d55d0ce377f81af29ab;p=ceph.git kclient: fix page_mkwrite for 2.6.30 This will change again soon when Nick's other fix gets merged. Also, we probably need to stop doing write_begin/end due to some differences in behavior (e.g., no extending file size? see btrfs as a reference). --- diff --git a/src/kernel/addr.c b/src/kernel/addr.c index 3f6358e4866d..0b42eec3bd07 100644 --- a/src/kernel/addr.c +++ b/src/kernel/addr.c @@ -1060,8 +1060,15 @@ const struct address_space_operations ceph_aops = { /* * Reuse write_{begin,end} here for simplicity. */ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30) +static int ceph_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) +#else static int ceph_page_mkwrite(struct vm_area_struct *vma, struct page *page) +#endif { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30) + struct page *page = vmf->page; +#endif struct inode *inode = vma->vm_file->f_dentry->d_inode; loff_t off = page->index << PAGE_CACHE_SHIFT; loff_t size, len; @@ -1084,6 +1091,15 @@ static int ceph_page_mkwrite(struct vm_area_struct *vma, struct page *page) ceph_write_end(vma->vm_file, inode->i_mapping, off, len, len, locked_page, fsdata); dout(10, "page_mkwrite %p %llu~%llu = %d\n", inode, off, len, ret); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 30) + if (unlikely(ret)) { + if (ret == -ENOMEM) + ret = VM_FAULT_OOM; + else /* -ENOSPC, -EIO, etc */ + ret = VM_FAULT_SIGBUS; + } +#endif return ret; }