From f655f46b06612254ec25e56cd6e86ed8e785f656 Mon Sep 17 00:00:00 2001 From: Daniel Hokka Zakrisson Date: Mon, 16 Jul 2007 23:24:15 +0000 Subject: [PATCH] fixes from 2.2.0.1, and various COW fixes --- fs/namei.c | 26 ++++++++++++++++++++++---- include/linux/vserver/tag.h | 2 +- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 5804ce3de..69adfd61d 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -2788,12 +2788,16 @@ retry: vxdprintk(VXD_CBIT(misc, 1), "temp copy »%s«", to); ret = path_lookup(to, LOOKUP_PARENT|LOOKUP_OPEN|LOOKUP_CREATE, &dir_nd); + vxdprintk(VXD_CBIT(misc, 2), + "path_lookup(new): %d", ret); + if (ret < 0) + goto retry; /* this puppy downs the inode sem */ new_dentry = lookup_create(&dir_nd, 0); vxdprintk(VXD_CBIT(misc, 2), "lookup_create(new): %p", new_dentry); - if (!new_dentry) { + if (!new_dentry || IS_ERR(new_dentry)) { path_release(&dir_nd); goto retry; } @@ -2820,8 +2824,10 @@ retry: old_file = dentry_open(old_dentry, old_mnt, O_RDONLY); vxdprintk(VXD_CBIT(misc, 2), "dentry_open(old): %p", old_file); - if (!old_file) + if (!old_file || IS_ERR(old_file)) { + res = IS_ERR(old_file) ? (void *) old_file : res; goto out_rel_both; + } dget(new_dentry); mntget(new_mnt); @@ -2829,15 +2835,23 @@ retry: new_file = dentry_open(new_dentry, new_mnt, O_WRONLY); vxdprintk(VXD_CBIT(misc, 2), "dentry_open(new): %p", new_file); - if (!new_file) + if (!new_file || IS_ERR(new_file)) { + res = IS_ERR(new_file) ? new_file : res; goto out_fput_old; + } size = i_size_read(old_file->f_dentry->d_inode); ret = vfs_sendfile(new_file, old_file, NULL, size, 0); vxdprintk(VXD_CBIT(misc, 2), "vfs_sendfile: %d", ret); - if (ret < 0) + if (ret < 0) { + res = ERR_PTR(ret); + goto out_fput_both; + } + else if (ret < size) { + res = ERR_PTR(-ENOSPC); goto out_fput_both; + } ret = vfs_rename(dir_nd.dentry->d_inode, new_dentry, old_nd.dentry->d_parent->d_inode, old_dentry); @@ -2846,6 +2860,8 @@ retry: res = new_dentry; dget(new_dentry); } + else + res = ERR_PTR(ret); out_fput_both: vxdprintk(VXD_CBIT(misc, 3), @@ -2861,6 +2877,8 @@ out_fput_old: out_rel_both: mutex_unlock(&dir_nd.dentry->d_inode->i_mutex); + if (IS_ERR(res)) + vfs_unlink(dir_nd.dentry->d_inode, new_dentry, &dir_nd); dput(new_dentry); path_release(&dir_nd); diff --git a/include/linux/vserver/tag.h b/include/linux/vserver/tag.h index f448070d2..462713852 100644 --- a/include/linux/vserver/tag.h +++ b/include/linux/vserver/tag.h @@ -5,7 +5,7 @@ #define DX_TAG(in) (IS_TAGGED(in)) -#ifdef CONFIG_DX_TAG_NFSD +#ifdef CONFIG_TAG_NFSD #define DX_TAG_NFSD 1 #else #define DX_TAG_NFSD 0 -- 2.43.0