commit:     e068fdfc2b6f09d2629d079ab7ad91d710573778
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Tue Aug 28 22:32:32 2018 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Nov 21 15:01:24 2018 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=e068fdfc

Linux patch 4.4.153

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README              |   4 ++
 1152_linux-4.4.153.patch | 134 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 138 insertions(+)

diff --git a/0000_README b/0000_README
index ebf1b99..e62afd1 100644
--- a/0000_README
+++ b/0000_README
@@ -651,6 +651,10 @@ Patch:  1151_linux-4.4.152.patch
 From:   http://www.kernel.org
 Desc:   Linux 4.4.152
 
+Patch:  1152_linux-4.4.153.patch
+From:   http://www.kernel.org
+Desc:   Linux 4.4.153
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1152_linux-4.4.153.patch b/1152_linux-4.4.153.patch
new file mode 100644
index 0000000..bcec2ae
--- /dev/null
+++ b/1152_linux-4.4.153.patch
@@ -0,0 +1,134 @@
+diff --git a/Makefile b/Makefile
+index 523b0d4354fb..208a813be615 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 4
+ PATCHLEVEL = 4
+-SUBLEVEL = 152
++SUBLEVEL = 153
+ EXTRAVERSION =
+ NAME = Blurry Fish Butt
+ 
+diff --git a/arch/x86/include/asm/mmu_context.h 
b/arch/x86/include/asm/mmu_context.h
+index effc12767cbf..d8d19fe99e45 100644
+--- a/arch/x86/include/asm/mmu_context.h
++++ b/arch/x86/include/asm/mmu_context.h
+@@ -109,8 +109,7 @@ static inline int init_new_context(struct task_struct *tsk,
+                                  struct mm_struct *mm)
+ {
+       mm->context.ctx_id = atomic64_inc_return(&last_mm_ctx_id);
+-      init_new_context_ldt(tsk, mm);
+-      return 0;
++      return init_new_context_ldt(tsk, mm);
+ }
+ static inline void destroy_context(struct mm_struct *mm)
+ {
+diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
+index 27610c2d1821..1007fa80f5a6 100644
+--- a/arch/x86/mm/pageattr.c
++++ b/arch/x86/mm/pageattr.c
+@@ -1006,7 +1006,7 @@ static int populate_pmd(struct cpa_data *cpa,
+ 
+               pmd = pmd_offset(pud, start);
+ 
+-              set_pmd(pmd, pmd_mkhuge(pfn_pmd(cpa->pfn,
++              set_pmd(pmd, pmd_mkhuge(pfn_pmd(cpa->pfn >> PAGE_SHIFT,
+                                       canon_pgprot(pmd_pgprot))));
+ 
+               start     += PMD_SIZE;
+diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
+index c319d5eaabcf..28316b292b8a 100644
+--- a/fs/overlayfs/overlayfs.h
++++ b/fs/overlayfs/overlayfs.h
+@@ -163,6 +163,7 @@ extern const struct file_operations ovl_dir_operations;
+ int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list);
+ void ovl_cleanup_whiteouts(struct dentry *upper, struct list_head *list);
+ void ovl_cache_free(struct list_head *list);
++int ovl_check_d_type_supported(struct path *realpath);
+ 
+ /* inode.c */
+ int ovl_setattr(struct dentry *dentry, struct iattr *attr);
+diff --git a/fs/overlayfs/readdir.c b/fs/overlayfs/readdir.c
+index 299a6e1d6b77..0c59955c4653 100644
+--- a/fs/overlayfs/readdir.c
++++ b/fs/overlayfs/readdir.c
+@@ -43,6 +43,7 @@ struct ovl_readdir_data {
+       struct ovl_cache_entry *first_maybe_whiteout;
+       int count;
+       int err;
++      bool d_type_supported;
+ };
+ 
+ struct ovl_dir_file {
+@@ -581,3 +582,39 @@ void ovl_cleanup_whiteouts(struct dentry *upper, struct 
list_head *list)
+       }
+       mutex_unlock(&upper->d_inode->i_mutex);
+ }
++
++static int ovl_check_d_type(struct dir_context *ctx, const char *name,
++                        int namelen, loff_t offset, u64 ino,
++                        unsigned int d_type)
++{
++      struct ovl_readdir_data *rdd =
++              container_of(ctx, struct ovl_readdir_data, ctx);
++
++      /* Even if d_type is not supported, DT_DIR is returned for . and .. */
++      if (!strncmp(name, ".", namelen) || !strncmp(name, "..", namelen))
++              return 0;
++
++      if (d_type != DT_UNKNOWN)
++              rdd->d_type_supported = true;
++
++      return 0;
++}
++
++/*
++ * Returns 1 if d_type is supported, 0 not supported/unknown. Negative values
++ * if error is encountered.
++ */
++int ovl_check_d_type_supported(struct path *realpath)
++{
++      int err;
++      struct ovl_readdir_data rdd = {
++              .ctx.actor = ovl_check_d_type,
++              .d_type_supported = false,
++      };
++
++      err = ovl_dir_read(realpath, &rdd);
++      if (err)
++              return err;
++
++      return rdd.d_type_supported;
++}
+diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
+index d70208c0de84..0035cb80ecd1 100644
+--- a/fs/overlayfs/super.c
++++ b/fs/overlayfs/super.c
+@@ -1054,6 +1054,26 @@ static int ovl_fill_super(struct super_block *sb, void 
*data, int silent)
+                       sb->s_flags |= MS_RDONLY;
+                       ufs->workdir = NULL;
+               }
++
++              /*
++               * Upper should support d_type, else whiteouts are visible.
++               * Given workdir and upper are on same fs, we can do
++               * iterate_dir() on workdir. This check requires successful
++               * creation of workdir in previous step.
++               */
++              if (ufs->workdir) {
++                      err = ovl_check_d_type_supported(&workpath);
++                      if (err < 0)
++                              goto out_put_workdir;
++
++                      /*
++                       * We allowed this configuration and don't want to
++                       * break users over kernel upgrade. So warn instead
++                       * of erroring out.
++                       */
++                      if (!err)
++                              pr_warn("overlayfs: upper fs needs to support 
d_type.\n");
++              }
+       }
+ 
+       err = -ENOMEM;

Reply via email to