diff --git a/config/boards/nanopineo.conf b/config/boards/nanopineo.conf index 4b0c134d0..0ce3669ac 100644 --- a/config/boards/nanopineo.conf +++ b/config/boards/nanopineo.conf @@ -13,5 +13,4 @@ BUILD_DESKTOP="no" # KERNEL_TARGET="default,next,dev" CLI_TARGET="stretch,bionic:next" -# -CLI_BETA_TARGET="stretch,bionic:dev" +CLI_BETA_TARGET="" diff --git a/patch/kernel/mvebu-default/04-patch-4.4.152-153.patch b/patch/kernel/mvebu-default/04-patch-4.4.152-153.patch new file mode 100644 index 000000000..bcec2ae2f --- /dev/null +++ b/patch/kernel/mvebu-default/04-patch-4.4.152-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;