]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Oct 2016 08:10:01 +0000 (10:10 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Oct 2016 08:10:01 +0000 (10:10 +0200)
added patches:
ceph-fix-race-during-filling-readdir-cache.patch

queue-4.4/ceph-fix-race-during-filling-readdir-cache.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/ceph-fix-race-during-filling-readdir-cache.patch b/queue-4.4/ceph-fix-race-during-filling-readdir-cache.patch
new file mode 100644 (file)
index 0000000..daf801f
--- /dev/null
@@ -0,0 +1,47 @@
+From af5e5eb574776cdf1b756a27cc437bff257e22fe Mon Sep 17 00:00:00 2001
+From: "Yan, Zheng" <zyan@redhat.com>
+Date: Fri, 26 Feb 2016 16:27:13 +0800
+Subject: ceph: fix race during filling readdir cache
+
+From: Yan, Zheng <zyan@redhat.com>
+
+commit af5e5eb574776cdf1b756a27cc437bff257e22fe upstream.
+
+Readdir cache uses page cache to save dentry pointers. When adding
+dentry pointers to middle of a page, we need to make sure the page
+already exists. Otherwise the beginning part of the page will be
+invalid pointers.
+
+Signed-off-by: Yan, Zheng <zyan@redhat.com>
+Cc: Nikolay Borisov <kernel@kyup.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ceph/inode.c |    9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+--- a/fs/ceph/inode.c
++++ b/fs/ceph/inode.c
+@@ -1358,15 +1358,20 @@ static int fill_readdir_cache(struct ino
+       if (!ctl->page || pgoff != page_index(ctl->page)) {
+               ceph_readdir_cache_release(ctl);
+-              ctl->page  = grab_cache_page(&dir->i_data, pgoff);
++              if (idx == 0)
++                      ctl->page = grab_cache_page(&dir->i_data, pgoff);
++              else
++                      ctl->page = find_lock_page(&dir->i_data, pgoff);
+               if (!ctl->page) {
+                       ctl->index = -1;
+-                      return -ENOMEM;
++                      return idx == 0 ? -ENOMEM : 0;
+               }
+               /* reading/filling the cache are serialized by
+                * i_mutex, no need to use page lock */
+               unlock_page(ctl->page);
+               ctl->dentries = kmap(ctl->page);
++              if (idx == 0)
++                      memset(ctl->dentries, 0, PAGE_CACHE_SIZE);
+       }
+       if (req->r_dir_release_cnt == atomic64_read(&ci->i_release_count) &&
index a8020f2ae2f68b639a07dbebf2ebaecf0b971234..dd257df45916c3a2dbc72672f575dacbed0b364f 100644 (file)
@@ -24,3 +24,4 @@ hwmon-adt7411-set-bit-3-in-cfg1-register.patch
 spi-sh-msiof-avoid-invalid-clock-generator-parameters.patch
 iwlwifi-pcie-fix-access-to-scratch-buffer.patch
 iwlwifi-mvm-don-t-use-ret-when-not-initialised.patch
+ceph-fix-race-during-filling-readdir-cache.patch