From 08ed044595b404fa626f71c9b1c1fbc599ad7587 Mon Sep 17 00:00:00 2001 From: Gabor Juhos Date: Sat, 12 May 2012 12:05:19 +0000 Subject: linux/2.6.37: R.I.P. SVN-Revision: 31687 --- ...103-overlayfs_fix_readdir_unlink_deadlock.patch | 76 ---------------------- 1 file changed, 76 deletions(-) delete mode 100644 target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch (limited to 'target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch') diff --git a/target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch b/target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch deleted file mode 100644 index 6042b2968f..0000000000 --- a/target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch +++ /dev/null @@ -1,76 +0,0 @@ ---- a/fs/overlayfs/overlayfs.c -+++ b/fs/overlayfs/overlayfs.c -@@ -1686,37 +1686,56 @@ static int ovl_check_empty_dir(struct de - return err; - } - --static int ovl_unlink_whiteout(void *buf, const char *name, int namelen, -- loff_t offset, u64 ino, unsigned int d_type) -+static int ovl_fill_links(void *buf, const char *name, int namelen, -+ loff_t offset, u64 ino, unsigned int d_type) - { - struct ovl_readdir_data *rdd = buf; -+ struct ovl_cache_entry *p; - -- rdd->count++; -- /* check d_type to filter out "." and ".." */ -- if (d_type == DT_LNK) { -- struct dentry *dentry; -+ if (d_type != DT_LNK) -+ return 0; - -- dentry = lookup_one_len(name, rdd->dir, namelen); -- if (IS_ERR(dentry)) { -- rdd->err = PTR_ERR(dentry); -- } else { -- rdd->err = vfs_unlink(rdd->dir->d_inode, dentry); -- dput(dentry); -- } -- } -+ p = ovl_cache_entry_new(name, namelen, ino, d_type); -+ if (!p) -+ return -ENOMEM; - -- return rdd->err; -+ list_add(&p->l_node, rdd->list); -+ return 0; - } - - static int ovl_remove_whiteouts(struct dentry *dentry) - { - struct path upperpath; -- struct ovl_readdir_data rdd = { .list = NULL }; -+ LIST_HEAD(list); -+ struct ovl_readdir_data rdd = { .list = &list }; -+ struct ovl_cache_entry *p, *t; -+ int ret; - - ovl_path_upper(dentry, &upperpath); - rdd.dir = upperpath.dentry; - -- return ovl_dir_read(&upperpath, &rdd, ovl_unlink_whiteout); -+ ret = ovl_dir_read(&upperpath, &rdd, ovl_fill_links); -+ -+ mutex_lock(&rdd.dir->d_inode->i_mutex); -+ list_for_each_entry_safe(p, t, &list, l_node) { -+ struct dentry *dentry; -+ -+ if (!ret) { -+ dentry = lookup_one_len(p->name, rdd.dir, p->len); -+ if (IS_ERR(dentry)) { -+ ret = PTR_ERR(dentry); -+ } else { -+ ret = vfs_unlink(rdd.dir->d_inode, dentry); -+ dput(dentry); -+ } -+ } -+ -+ list_del(&p->l_node); -+ kfree(p); -+ } -+ mutex_unlock(&rdd.dir->d_inode->i_mutex); -+ -+ return ret; - } - - static int ovl_rmdir(struct inode *dir, struct dentry *dentry) -- cgit v1.2.3