diff options
author | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-05-12 12:05:19 +0000 |
---|---|---|
committer | juhosg <juhosg@3c298f89-4303-0410-b956-a3cf2f4a3e73> | 2012-05-12 12:05:19 +0000 |
commit | 4b6fa24c6303b83b289aca33a6844b422acc29ac (patch) | |
tree | dad0e4938ff5dfcc718aeaaaded8e2b6ec63840f /target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch | |
parent | faeed4ab57af4102ae3093e4c38f46b244d6bb93 (diff) |
linux/2.6.37: R.I.P.
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@31687 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch')
-rw-r--r-- | target/linux/generic/patches-2.6.37/103-overlayfs_fix_readdir_unlink_deadlock.patch | 76 |
1 files changed, 0 insertions, 76 deletions
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 6042b2968..000000000 --- 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) |