Loading fs/overlayfs/readdir.c +14 −21 Original line number Diff line number Diff line Loading @@ -274,11 +274,11 @@ static int ovl_dir_mark_whiteouts(struct dentry *dir, return 0; } static inline int ovl_dir_read_merged(struct path *upperpath, struct path *lowerpath, struct list_head *list) static int ovl_dir_read_merged(struct dentry *dentry, struct list_head *list) { int err; struct path lowerpath; struct path upperpath; struct ovl_readdir_data rdd = { .ctx.actor = ovl_fill_merge, .list = list, Loading @@ -286,25 +286,28 @@ static inline int ovl_dir_read_merged(struct path *upperpath, .is_merge = false, }; if (upperpath->dentry) { err = ovl_dir_read(upperpath, &rdd); ovl_path_lower(dentry, &lowerpath); ovl_path_upper(dentry, &upperpath); if (upperpath.dentry) { err = ovl_dir_read(&upperpath, &rdd); if (err) goto out; if (lowerpath->dentry) { err = ovl_dir_mark_whiteouts(upperpath->dentry, &rdd); if (lowerpath.dentry) { err = ovl_dir_mark_whiteouts(upperpath.dentry, &rdd); if (err) goto out; } } if (lowerpath->dentry) { if (lowerpath.dentry) { /* * Insert lowerpath entries before upperpath ones, this allows * offsets to be reasonably constant */ list_add(&rdd.middle, rdd.list); rdd.is_merge = true; err = ovl_dir_read(lowerpath, &rdd); err = ovl_dir_read(&lowerpath, &rdd); list_del(&rdd.middle); } out: Loading @@ -329,8 +332,6 @@ static void ovl_seek_cursor(struct ovl_dir_file *od, loff_t pos) static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry) { int res; struct path lowerpath; struct path upperpath; struct ovl_dir_cache *cache; cache = ovl_dir_cache(dentry); Loading @@ -347,10 +348,7 @@ static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry) cache->refcount = 1; INIT_LIST_HEAD(&cache->entries); ovl_path_lower(dentry, &lowerpath); ovl_path_upper(dentry, &upperpath); res = ovl_dir_read_merged(&upperpath, &lowerpath, &cache->entries); res = ovl_dir_read_merged(dentry, &cache->entries); if (res) { ovl_cache_free(&cache->entries); kfree(cache); Loading Loading @@ -538,14 +536,9 @@ const struct file_operations ovl_dir_operations = { int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list) { int err; struct path lowerpath; struct path upperpath; struct ovl_cache_entry *p; ovl_path_upper(dentry, &upperpath); ovl_path_lower(dentry, &lowerpath); err = ovl_dir_read_merged(&upperpath, &lowerpath, list); err = ovl_dir_read_merged(dentry, list); if (err) return err; Loading Loading
fs/overlayfs/readdir.c +14 −21 Original line number Diff line number Diff line Loading @@ -274,11 +274,11 @@ static int ovl_dir_mark_whiteouts(struct dentry *dir, return 0; } static inline int ovl_dir_read_merged(struct path *upperpath, struct path *lowerpath, struct list_head *list) static int ovl_dir_read_merged(struct dentry *dentry, struct list_head *list) { int err; struct path lowerpath; struct path upperpath; struct ovl_readdir_data rdd = { .ctx.actor = ovl_fill_merge, .list = list, Loading @@ -286,25 +286,28 @@ static inline int ovl_dir_read_merged(struct path *upperpath, .is_merge = false, }; if (upperpath->dentry) { err = ovl_dir_read(upperpath, &rdd); ovl_path_lower(dentry, &lowerpath); ovl_path_upper(dentry, &upperpath); if (upperpath.dentry) { err = ovl_dir_read(&upperpath, &rdd); if (err) goto out; if (lowerpath->dentry) { err = ovl_dir_mark_whiteouts(upperpath->dentry, &rdd); if (lowerpath.dentry) { err = ovl_dir_mark_whiteouts(upperpath.dentry, &rdd); if (err) goto out; } } if (lowerpath->dentry) { if (lowerpath.dentry) { /* * Insert lowerpath entries before upperpath ones, this allows * offsets to be reasonably constant */ list_add(&rdd.middle, rdd.list); rdd.is_merge = true; err = ovl_dir_read(lowerpath, &rdd); err = ovl_dir_read(&lowerpath, &rdd); list_del(&rdd.middle); } out: Loading @@ -329,8 +332,6 @@ static void ovl_seek_cursor(struct ovl_dir_file *od, loff_t pos) static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry) { int res; struct path lowerpath; struct path upperpath; struct ovl_dir_cache *cache; cache = ovl_dir_cache(dentry); Loading @@ -347,10 +348,7 @@ static struct ovl_dir_cache *ovl_cache_get(struct dentry *dentry) cache->refcount = 1; INIT_LIST_HEAD(&cache->entries); ovl_path_lower(dentry, &lowerpath); ovl_path_upper(dentry, &upperpath); res = ovl_dir_read_merged(&upperpath, &lowerpath, &cache->entries); res = ovl_dir_read_merged(dentry, &cache->entries); if (res) { ovl_cache_free(&cache->entries); kfree(cache); Loading Loading @@ -538,14 +536,9 @@ const struct file_operations ovl_dir_operations = { int ovl_check_empty_dir(struct dentry *dentry, struct list_head *list) { int err; struct path lowerpath; struct path upperpath; struct ovl_cache_entry *p; ovl_path_upper(dentry, &upperpath); ovl_path_lower(dentry, &lowerpath); err = ovl_dir_read_merged(&upperpath, &lowerpath, list); err = ovl_dir_read_merged(dentry, list); if (err) return err; Loading