Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932214Ab0DOXKR (ORCPT ); Thu, 15 Apr 2010 19:10:17 -0400 Received: from mx1.redhat.com ([209.132.183.28]:15074 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757955Ab0DOXHU (ORCPT ); Thu, 15 Apr 2010 19:07:20 -0400 From: Valerie Aurora To: Alexander Viro Cc: linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, Valerie Aurora Subject: [PATCH 28/35] union-mount: Implement union-aware link() Date: Thu, 15 Apr 2010 16:04:35 -0700 Message-Id: <1271372682-21225-29-git-send-email-vaurora@redhat.com> In-Reply-To: <1271372682-21225-28-git-send-email-vaurora@redhat.com> References: <1271372682-21225-1-git-send-email-vaurora@redhat.com> <1271372682-21225-2-git-send-email-vaurora@redhat.com> <1271372682-21225-3-git-send-email-vaurora@redhat.com> <1271372682-21225-4-git-send-email-vaurora@redhat.com> <1271372682-21225-5-git-send-email-vaurora@redhat.com> <1271372682-21225-6-git-send-email-vaurora@redhat.com> <1271372682-21225-7-git-send-email-vaurora@redhat.com> <1271372682-21225-8-git-send-email-vaurora@redhat.com> <1271372682-21225-9-git-send-email-vaurora@redhat.com> <1271372682-21225-10-git-send-email-vaurora@redhat.com> <1271372682-21225-11-git-send-email-vaurora@redhat.com> <1271372682-21225-12-git-send-email-vaurora@redhat.com> <1271372682-21225-13-git-send-email-vaurora@redhat.com> <1271372682-21225-14-git-send-email-vaurora@redhat.com> <1271372682-21225-15-git-send-email-vaurora@redhat.com> <1271372682-21225-16-git-send-email-vaurora@redhat.com> <1271372682-21225-17-git-send-email-vaurora@redhat.com> <1271372682-21225-18-git-send-email-vaurora@redhat.com> <1271372682-21225-19-git-send-email-vaurora@redhat.com> <1271372682-21225-20-git-send-email-vaurora@redhat.com> <1271372682-21225-21-git-send-email-vaurora@redhat.com> <1271372682-21225-22-git-send-email-vaurora@redhat.com> <1271372682-21225-23-git-send-email-vaurora@redhat.com> <1271372682-21225-24-git-send-email-vaurora@redhat.com> <1271372682-21225-25-git-send-email-vaurora@redhat.com> <1271372682-21225-26-git-send-email-vaurora@redhat.com> <1271372682-21225-27-git-send-email-vaurora@redhat.com> <1271372682-21225-28-git-send-email-vaurora@redhat.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1779 Lines: 69 --- fs/namei.c | 24 ++++++++++++++++++++---- 1 files changed, 20 insertions(+), 4 deletions(-) diff --git a/fs/namei.c b/fs/namei.c index 68aa8ab..5f6dcd4 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -3019,16 +3019,18 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, { struct dentry *new_dentry; struct nameidata nd; + struct nameidata old_nd; struct path old_path; int error; char *to; + char *from; if ((flags & ~AT_SYMLINK_FOLLOW) != 0) return -EINVAL; - error = user_path_at(olddfd, oldname, + error = user_path_nd(olddfd, oldname, flags & AT_SYMLINK_FOLLOW ? LOOKUP_FOLLOW : 0, - &old_path); + &old_nd, &old_path, &from); if (error) return error; @@ -3036,8 +3038,20 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, if (error) goto out; error = -EXDEV; - if (old_path.mnt != nd.path.mnt) - goto out_release; + if (old_path.mnt != nd.path.mnt) { + if (IS_UNIONED_DIR(&old_nd.path) && + (old_nd.path.mnt == nd.path.mnt)) { + error = mnt_want_write(old_nd.path.mnt); + if (error) + goto out_release; + error = union_copyup(&old_nd, &old_path); + mnt_drop_write(old_nd.path.mnt); + if (error) + goto out_release; + } else { + goto out_release; + } + } new_dentry = lookup_create(&nd, 0); error = PTR_ERR(new_dentry); if (IS_ERR(new_dentry)) @@ -3060,6 +3074,8 @@ out_release: putname(to); out: path_put(&old_path); + path_put(&old_nd.path); + putname(from); return error; } -- 1.6.3.3 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/