From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757377AbdKGPts (ORCPT ); Tue, 7 Nov 2017 10:49:48 -0500 Received: from mail-eopbgr30113.outbound.protection.outlook.com ([40.107.3.113]:4670 "EHLO EUR03-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1757340AbdKGPtk (ORCPT ); Tue, 7 Nov 2017 10:49:40 -0500 Subject: Re: [PATCH v5] pid_ns: Introduce ioctl to set vector of ns_last_pid's on ns hierarhy To: ebiederm@xmission.com References: <149371848646.24418.16693733830230366252.stgit@localhost.localdomain> Cc: serge@hallyn.com, agruenba@redhat.com, gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org, oleg@redhat.com, paul@paul-moore.com, viro@zeniv.linux.org.uk, avagin@openvz.org, linux-api@vger.kernel.org, linux-fsdevel@vger.kernel.org, mtk.manpages@gmail.com, akpm@linux-foundation.org, luto@amacapital.net, gorcunov@openvz.org, mingo@kernel.org, keescook@chromium.org From: Kirill Tkhai Message-ID: <1a69d160-ac93-a8ef-478e-78888f344d92@virtuozzo.com> Date: Tue, 7 Nov 2017 18:49:32 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 In-Reply-To: <149371848646.24418.16693733830230366252.stgit@localhost.localdomain> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR0202CA0003.eurprd02.prod.outlook.com (2603:10a6:3:8c::13) To HE1PR0801MB1340.eurprd08.prod.outlook.com (2603:10a6:3:3a::8) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4de374a5-fbe1-424a-6fd3-08d525f725e5 X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(2017052603249);SRVR:HE1PR0801MB1340; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1340;3:a1ABT1YdYfmMLEJDRqc4Kl5CwZjFGIq17yK4hh2bYJ4vLgY4v1UfB+2+EQkcTcwfijpvjJnPH42/3EZEhPaFsxXR6PgHyq50boy5NKIVOQg/ScqaZ3XkzbEE62ylbktQujhtKuYgXGuo9Dgwp43hpIgy0l39pZT1BAU+UCTAJ7d7U13ZYLs/FIkiFOBuoRZbx+KfQZOGJcdMFNSMyUBxntlxWYYQeJFWIajilx+cWLH8TOmXbzc4C4fPazdXYH1j;25:A8IqyzkJPXUfcJkHmEQwe+4b86SKi/ZB7dTPC+3HlQvWOEvm47bdzqkJh5gmskrDPk79bOBOpHmnrUZ6PWr6tOdhTSPzXcDANPYZpEob5G8saKWsyL4FzJuX4ifao4yUNpRjVgDi/yrGrXKMFntqcrWj5kd9oRhsj2WuLaD+6cXQlfgYAsT7J1fOMrFFZJ8ik9bIOrUYH42zRoBfRmBxTkI2Y50QMojgDNmcPNW4ocZOzMKGnEnWRh77EAsl7XHC3aB0rqFfGuI0YVCVHexeQAgkUX/S8O4CZvNQskPnDqIGgVR8SnD1KNqMB34l+/6jSZKzkwSSZsxO+FHmjSnSZQ==;31:MLPUMoURmRfc/DGOtPqW/1dG1A8aSTzBEZJ+M/2BCurvaYhYYUPtkw85/HGNVBPbczT08tDcKNj7KwXkonahpWh07cEMZ5nRzIUEL8PFJdlDFofGxhpdCvSGVWRRBqHcZ302TXQwVSD7qhFGTJNkS08C5F8KdpM9vKfQTsKlBlozPvzLUYlxZPWOoLBrIfkE9AnyCvhxEQoHiGpG50JlIpPJG3XUjbbsvsGIbljkydU= X-MS-TrafficTypeDiagnostic: HE1PR0801MB1340: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1340;20:ww4ZWvYkCrNn2ZnnZ1hDsWGseY74/3JfJsJZGJz4yT/7l9nmyo+bIackvusVaVlcfmX5g7Q+8cz4TqwMGBB3VIJ/UbytZTF91Tp6MBNo+U54PPaiOT9671Tt46EE0KXEr/wOt1Njm6tY2CU/tioYxQ9h8N/2DD8KrBchoaosTjSYstUcsCPoXF4S2cC3GUIE3knNh1YzwXqVoZxOD2zjLo7PTHEV9q5CFKf16tG3wtsihjUqN7QLTdbLrvzvrJTPWfLbxUTCW/DBEZcrFMRrt70TZ7s2wAwRk4YkEb807Nl2/SlDLyB4/Iy5xLMreOZOMZKCvIGbqJ/3zqgMb5ZHg7GBCbE5C7cQAmZMnNnNbhGi9AtRXW4ScrHCxZ5il6YrEBwA4NY0STSC933NwHW9G/xiH5LlP+w1MVp+YLQCqD8=;4:r3s5VZAGu6Jo+grjzX/g3lr3ZLL1WDccn/F/WpZkpkwU3DVjdgAcLtA4/eqBiuHLuYmk6JrDWABXCw79K2KCTWJw1wNUiY7Y5iqy8sNDF/Z9MsMQIycJeQhvRE5Xgh5APvoqV99EEGj7tQWPetmSyZqBlOM+kP7AG5M7MZ5WJYRhlQoFtu7xg/fXG6p/YoYLaMo/WoPpvv9x9C/CEvRoGn26uZP9ueCm/+E9ZJ1uxEfZ3GUh6WtmfD0wh2Y6ZN08bvQj9P30CXwS8ilWaVTZ+g== X-Exchange-Antispam-Report-Test: UriScan:; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(93006095)(93001095)(3002001)(3231021)(10201501046)(6041248)(20161123555025)(20161123564025)(20161123560025)(20161123562025)(20161123558100)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095);SRVR:HE1PR0801MB1340;BCL:0;PCL:0;RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095);SRVR:HE1PR0801MB1340; X-Forefront-PRVS: 0484063412 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(6049001)(6009001)(376002)(346002)(199003)(24454002)(189002)(83506002)(6666003)(86362001)(8676002)(189998001)(575784001)(50466002)(6916009)(478600001)(65956001)(65806001)(31696002)(39060400002)(47776003)(97736004)(33646002)(2361001)(66066001)(53936002)(25786009)(50986999)(6486002)(77096006)(2950100002)(81156014)(7736002)(54356999)(36756003)(229853002)(7416002)(305945005)(76176999)(8936002)(5660300001)(106356001)(64126003)(2906002)(101416001)(81166006)(68736007)(230700001)(2351001)(53546010)(58126008)(16576012)(4326008)(16526018)(6246003)(23676003)(6116002)(31686004)(105586002)(316002)(65826007)(3846002);DIR:OUT;SFP:1102;SCL:1;SRVR:HE1PR0801MB1340;H:[172.16.25.196];FPR:;SPF:None;PTR:InfoNoRecords;A:1;MX:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtIRTFQUjA4MDFNQjEzNDA7MjM6aE9kdzhRWHE0VXJOUjQ0ZVBVdkQrSUd4?= =?utf-8?B?YmxreS9xNnBsVXlWenBaWkhjSmdYOEhQb09nUDIzemJpd1VyVWd4MkpTMWhj?= =?utf-8?B?RDByWENjSHhqUTFCRVRYdVBrdjJPUm9GTDJwNVZHK1RWWjFCTjBrb0RDL0hm?= =?utf-8?B?TFl3NENqTnZhaVo5dUUzUmFPVDF1ZUNUeVBrL2UyVVlIYmV1QkR5dXpRSnFB?= =?utf-8?B?VXdjTE5RTUxYbTJsSFdqMlQra3g4cnlJSlVNQzAvcFRuaVJacEV2QzFKY0hx?= =?utf-8?B?aXZxc0Jpd0FHVW9mYjRRMkMyR3hzWENJMlU1Y1BhVUVhc1ZOTnFBMHlVSXR6?= =?utf-8?B?RmVrbXF0cDVhbm44VUM0MEpDdkQwdDNHejRrOXY3YTVYMWpQVSs5czgyR1R3?= =?utf-8?B?bTQ5MGZwY3plLzYwSFRtd2U1M0hmVlJpVFBpVEhpekxTM0h0MTJWRGxYV3R6?= =?utf-8?B?U2dLOUZ0SGpXcVAwYTN5aU0xakloQlN2NmhoUURNeHdXMHR6QytCZlFPbktv?= =?utf-8?B?UkhId084eDN6aGJ5SlJSN2N2Vk5tbUNxaHRva3gvUUlJOXF3eDdiMVNMTWVu?= =?utf-8?B?cHo1WnlDdXA3cDZreWsvZ3lHNWRhV0pNRFRQR3hGN1RzQjJHb1hnMHAweERE?= =?utf-8?B?TzRwVDlFWU5Dd0hnTm01Ni9MSkd0OU9jRXkrRFJuakh0bVN1RUgyUEZkdWhi?= =?utf-8?B?M1pRb0V6L1FpMjRMaFNYSXNZWkZBcXkzK2hvUFRLa1dyVmpEejBLOFN4MmJj?= =?utf-8?B?T3pjYmMvY0hVU3NCZndqYldtVWg3SDkzayswYUlnc1VyUFRiU3BRMGNYS2Z5?= =?utf-8?B?NGp1T2lhSU1iRWVZSjJrSUk0MkNkZ2FoOVFOM05lTTlCalZqTnNKQ1NnZkpQ?= =?utf-8?B?ZXZIWDdBYkM4VW1oUC9YQUwxQU10V1hIMnNCZWRtNEdlYXN2Q2NjMWhrK0xr?= =?utf-8?B?Z0I3V3kvcmVkdFdvUSs1SWR1Vjh0SG1RNTd6Z3BXcVJJcWRIOTZ0Uk0vUHlp?= =?utf-8?B?cmJyUVIxMnVkY0ZEd2RCZjZWN20yR3V5QS96eDBwVjhVTWcveFFOUXdJMFZz?= =?utf-8?B?NUlMWEhtazlwNFVlN3ZyeGhkeUNLbytkU1ZzSHgrUVFLVE1qUXBmVmkySzRm?= =?utf-8?B?RnVkNjRDVFpMVDJOQ0wrTE83MHFwaG1UYVhTRGo4blYrSlNtM2RyRmEzZHpq?= =?utf-8?B?Q0lqZzRNdUs1UDRrbTV2MGpHTXg5MzZOSFZpRUMxTXR1TmMwOHBrLzRidXM4?= =?utf-8?B?TzFGY3BBazlXekZGWlRtV2hSeC9ySGlKdCswS2YxcG5TU2VKeCtZcEZiN0Zm?= =?utf-8?B?NkhCZWNOOElTZm1HWlo3NFlsNnQ0YThIT1hPZGRyNmVmT29RN1RzVU5NVjFI?= =?utf-8?B?bDZGSkpGNjVqOG9jeWdFMms4R1lTMW9qVnlxRlFoaXlMU0ZtakJwK1hWQW43?= =?utf-8?B?NXRnbGNLclJHWFo0WFZ6Uk9WSmNhYTJueDlXa0tBWU5EalNvLys3am1leGhv?= =?utf-8?B?M3VjS2hJdTAvU3d1TlJPMzIzOWROdS91SXJ3RGJpOE93NEl0dWdOZktRcGlp?= =?utf-8?B?RWdhN1NrOHFpVmhVQjVlc0c2cGF1ME9GeGJzNmthMytTZXZNNXozVnFqaFY1?= =?utf-8?B?Z1haVkVTQmFabzV4TEFWYUVxbjBwUmpXMm12bmlSdTRTUkl1YURXaTlhU0pF?= =?utf-8?B?Rk9VZEJxRkJMejJSTHBxNVhMazRqNVZPMXh1WXRIcGRwME9MOE4wcUVwZzU4?= =?utf-8?B?OHFnL3poSmJDYmRQQlc0dUlKNFI0OTIxRzVJSmdRWXBZc08xdGJHTkQ1Z0J3?= =?utf-8?B?bFRiT1orcyswTXNUWHFZdVJaTmxiOGwyaVNtUmN2OTNnSWpBZDUraS9vR2ov?= =?utf-8?B?aVQyU1VDdUY3NndteWM5L3dlSUM3V1IwYmwxdldPME5KQ20vemxUcmorNHZ5?= =?utf-8?B?ckJ0bzgrbzdPMEE9PQ==?= X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1340;6:vNn6FpSJGPwYNzJ0BkVvxbTA12WQBqMmlgha7X9juTkpNqMKmL7mAwpOP8L4hg0h+991yP6NpdT0c9FMFPLps3kbA+5R73Di1fyp7/u4Ju9QLu5/OL3yPofcWDM5CoyJXSSTy4i456T3X2KH9oNOFD5OIMBy+p9+fCJ02D1EdD5Lr8Ew4tZS8ffzgan6O2r+offrrkrFQYNnOQgopYXsDC2bHiasEYJhmxKErgpe1SJh70Tg7sksh+pzvVAWXuWLe98OM1Fqi8s5YjwSm43lysoaLuIcOVA6hI0v4sj6FcX6PsEt+QBDPbsoWKa1tsbmE3bv4HoJLyha2GoTVnTdUHp98XEwQ00arrWoG5AzoWo=;5:85f34gWMjhoGHateVQst3gXJxefaUMwXEDbccpKBJ4B9Z6qL6qqsMZW/LpYtirbN72k4jkioy20V7+AKodrhZrR0GoWLQCF6X/B8LV+8g/IatyIYGDrpqDff0lvvs5aEnnTcPOqgO3EjipNYtFhvGlu+flJ7XsG8XTMdgNREoQs=;24:UrrxQjoSRx0IdkX8Q3cFEl/gV34k0t0Mm3E9GRnf0Jaa/SSF+55EfaFOHjJIySqFz7lb2E8APIECEdxgRKeFxiqamLeOiBhwchc31oT+QyI=;7:rR7VT9w4PkdI+M53AaDc9nyRnLMhxffQWU7KOd9ZYdr44bUILiMVECAUDDn94nJxT4MReqe1DmDnJTALHN2JD/FLW9q3/ybn0+UBOsq5invTV95sMBrFUiHNT8WoQJARBf0A1IcDOsfPPKP6ulaO9Rl4nOL0EY4UQ4T5ML9t2tQc3Wgi/spufJltPZwYWej47q3LAaopKlcb/Sv7px830tz7xo/VCObRlL8ilO0dIoV9OjkNKUAWeKYaiwnc7BG5 SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;HE1PR0801MB1340;20:ULfbqwMZkbOrEttXAkWr3K/UxECuEqJm7jHMnXkfdJniyZnynNBuCxYvO2UJn7ApGfkN8stKilkunyQt71yYlRL1BO8SsSadD1BKigXXpC006i7FLi6uugmPn6bDsHYpHImgP2LH326n8pEW/OClAevojTf9y88O3JVf/oWDacM= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Nov 2017 15:49:35.5423 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4de374a5-fbe1-424a-6fd3-08d525f725e5 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 0bc7f26d-0264-416e-a6fc-8352af79c58f X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1340 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Eric, could you give comments about this? On 02.05.2017 12:48, Kirill Tkhai wrote: > On implementing of nested pid namespaces support in CRIU > (checkpoint-restore in userspace tool) we run into > the situation, that it's impossible to create a task with > specific NSpid effectively. After commit 49f4d8b93ccf > "pidns: Capture the user namespace and filter ns_last_pid" > it is impossible to set ns_last_pid on any pid namespace, > except task's active pid_ns (before the commit it was possible > to write to pid_ns_for_children). Thus, if a restored task > in a container has more than one pid_ns levels, the restorer > code must have a task helper for every pid namespace > of the task's pid_ns hierarhy. > > This is a big problem, because of communication with > a helper for every pid_ns in the hierarchy is not cheap. > It's not performance-good as it implies many helpers wakeups > to create a single task (independently, how you communicate > with the helpers). This patch tries to decide the problem. > > It introduces a new pid_ns ioctl(NS_SET_LAST_PID_VEC), > which allows to write a vector of last pids on pid_ns hierarchy. > The vector is passed as array of pids in struct ns_ioc_pid_vec, > written in reverse order. The first number corresponds to > the opened namespace ns_last_pid, the second is to its parent, etc. > So, if you have the pid namespaces hierarchy like: > > pid_ns1 (grand father) > | > v > pid_ns2 (father) > | > v > pid_ns3 (child) > > and the pid_ns3 is open, then the corresponding vector will be > {last_ns_pid3, last_ns_pid2, last_ns_pid1}. This vector may be > short and it may contain less levels. For example, > {last_ns_pid3, last_ns_pid2} or even {last_ns_pid3}, in dependence > of which levels you want to populate. > > v5: Move pid_max up for !CONFIG_CHECKPOINT_RESTORE builds > (found by kbuild test robot). > > v4: Declare struct ns_ioc_pid_vec directly instead of include uapi file. > Make the interface independent of CONFIG_CHECKPOINT_RESTORE. > Include linux/types.h in nsfs.h for pid_t. > Get all vectors at once. > Make checks atomical. > > v3: Use __u32 in uapi instead of unsigned int. > > v2: Kill pid_ns->child_reaper check as it's impossible to have > such a pid namespace file open. > Use generic namespaces ioctl() number. > Pass pids as array, not as a string. > > Signed-off-by: Kirill Tkhai > --- > fs/nsfs.c | 5 +++++ > include/linux/pid_namespace.h | 9 ++++++++- > include/uapi/linux/nsfs.h | 8 ++++++++ > kernel/pid_namespace.c | 38 +++++++++++++++++++++++++++++++++++++- > 4 files changed, 58 insertions(+), 2 deletions(-) > > diff --git a/fs/nsfs.c b/fs/nsfs.c > index 323f492e0822..f669a1552003 100644 > --- a/fs/nsfs.c > +++ b/fs/nsfs.c > @@ -6,6 +6,7 @@ > #include > #include > #include > +#include > #include > #include > > @@ -186,6 +187,10 @@ static long ns_ioctl(struct file *filp, unsigned int ioctl, > argp = (uid_t __user *) arg; > uid = from_kuid_munged(current_user_ns(), user_ns->owner); > return put_user(uid, argp); > + case NS_SET_LAST_PID_VEC: > + if (ns->ops->type != CLONE_NEWPID) > + return -EINVAL; > + return pidns_set_last_pid_vec(ns, (void *)arg); > default: > return -ENOTTY; > } > diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h > index c2a989dee876..661fad08bf8c 100644 > --- a/include/linux/pid_namespace.h > +++ b/include/linux/pid_namespace.h > @@ -54,6 +54,7 @@ struct pid_namespace { > struct ns_common ns; > }; > > +struct ns_ioc_pid_vec; > extern struct pid_namespace init_pid_ns; > > #define PIDNS_HASH_ADDING (1U << 31) > @@ -71,7 +72,8 @@ extern struct pid_namespace *copy_pid_ns(unsigned long flags, > extern void zap_pid_ns_processes(struct pid_namespace *pid_ns); > extern int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd); > extern void put_pid_ns(struct pid_namespace *ns); > - > +extern long pidns_set_last_pid_vec(struct ns_common *ns, > + struct ns_ioc_pid_vec __user *vec); > #else /* !CONFIG_PID_NS */ > #include > > @@ -101,6 +103,11 @@ static inline int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd) > { > return 0; > } > +static inline long pidns_set_last_pid_vec(struct ns_common *ns, > + struct ns_ioc_pid_vec __user *vec) > +{ > + return -ENOTTY; > +} > #endif /* CONFIG_PID_NS */ > > extern struct pid_namespace *task_active_pid_ns(struct task_struct *tsk); > diff --git a/include/uapi/linux/nsfs.h b/include/uapi/linux/nsfs.h > index 1a3ca79f466b..9d320276eafe 100644 > --- a/include/uapi/linux/nsfs.h > +++ b/include/uapi/linux/nsfs.h > @@ -2,6 +2,7 @@ > #define __LINUX_NSFS_H > > #include > +#include > > #define NSIO 0xb7 > > @@ -14,5 +15,12 @@ > #define NS_GET_NSTYPE _IO(NSIO, 0x3) > /* Get owner UID (in the caller's user namespace) for a user namespace */ > #define NS_GET_OWNER_UID _IO(NSIO, 0x4) > +/* Set a vector of ns_last_pid for a pid namespace stack */ > +#define NS_SET_LAST_PID_VEC _IO(NSIO, 0x5) > + > +struct ns_ioc_pid_vec { > + __u32 nr; > + pid_t pid[0]; > +}; > > #endif /* __LINUX_NSFS_H */ > diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c > index de461aa0bf9a..d675b4d22dfe 100644 > --- a/kernel/pid_namespace.c > +++ b/kernel/pid_namespace.c > @@ -21,6 +21,7 @@ > #include > #include > #include > +#include > > struct pid_cache { > int nr_ids; > @@ -32,6 +33,7 @@ struct pid_cache { > static LIST_HEAD(pid_caches_lh); > static DEFINE_MUTEX(pid_caches_mutex); > static struct kmem_cache *pid_ns_cachep; > +extern int pid_max; > > /* > * creates the kmem cache to allocate pids from. > @@ -311,7 +313,6 @@ static int pid_ns_ctl_handler(struct ctl_table *table, int write, > return proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos); > } > > -extern int pid_max; > static int zero = 0; > static struct ctl_table pid_ns_ctl_table[] = { > { > @@ -428,6 +429,41 @@ static struct ns_common *pidns_get_parent(struct ns_common *ns) > return &get_pid_ns(pid_ns)->ns; > } > > +long pidns_set_last_pid_vec(struct ns_common *ns, > + struct ns_ioc_pid_vec __user *vec) > +{ > + struct pid_namespace *pid_ns = to_pid_ns(ns), *top; > + pid_t pid[MAX_PID_NS_LEVEL]; > + u32 i, nr; > + > + BUILD_BUG_ON(sizeof(pid_t) * MAX_PID_NS_LEVEL > 128); > + if (get_user(nr, &vec->nr)) > + return -EFAULT; > + if (nr > MAX_PID_NS_LEVEL || nr < 1) > + return -EINVAL; > + if (copy_from_user(pid, &vec->pid[0], nr * sizeof(pid_t)) != 0) > + return -EFAULT; > + > + top = pid_ns; > + for (i = 0; i < nr-1; i++) { > + top = top->parent; > + if (!top || pid[i] < 0 || pid[i] > pid_max) > + return -EINVAL; > + } > + if (!ns_capable(top->user_ns, CAP_SYS_ADMIN)) > + return -EPERM; > + if (pid[nr-1] < 0 || pid[nr-1] > pid_max) > + return -EINVAL; > + > + for (i = 0; i < nr; i++) { > + /* Write directly: see the comment in pid_ns_ctl_handler() */ > + pid_ns->last_pid = pid[i]; > + pid_ns = pid_ns->parent; > + } > + > + return 0; > +} > + > static struct user_namespace *pidns_owner(struct ns_common *ns) > { > return to_pid_ns(ns)->user_ns; >