From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 435421F708D for ; Tue, 7 Jan 2025 18:48:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736275695; cv=none; b=kvHQNXo4zOztksu5VM4GPmzyoS7o6/cqqh8UCHDiWLmE6WJLdtJWt8ZJTINxVvrHvxOjgX4ZkwBseTDdRx33W3/HVBBuch24gPDQ8LwCR4D2weVHmFQ7Z3ZGuh47WOGKvemM+tQbM+niGlygwTVcJHDfC1cTFnUOjYkAtPlyX58= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736275695; c=relaxed/simple; bh=nC4nqWe7t+XRFx7qTiwJJrpOdJ9AmrRRImYh9QZrbZY=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Cc:Content-Type; b=dCk9UZw4IpsyWuPX4f2GnpS7HYergz+IGPK3/ylut0VzhqkrATUQrNCR6IWVtphB8v7L5owQ8YCS3UaVd/mnYhEQtG4wdJUxd/ojeJSJPAo1AkmC/tCv7nhWSPBfIBB+PpHynIAPEMChrLYhLJ/RXYimGbtnswT7uGTwe0oeK6o= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--isaacmanjarres.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=kBymD0Ll; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--isaacmanjarres.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="kBymD0Ll" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2166464e236so395691035ad.1 for ; Tue, 07 Jan 2025 10:48:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1736275693; x=1736880493; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=rk8gGRBUBzYGA/wGbzmWKmNsJkZ0zUQC1Vm7cFkzsUg=; b=kBymD0LljJ1Xv94jDXOKwSjiQoIF0GMoZP4aeh5TFPk2I2BjOXbrnM8+3QI+LbWwvl KnQcCztYwvDfW8Pjp7v3jTwc8Ii1Gqx3bfOftX52XZKOSKPHA5URTGTHE/1nf48kiXlh A9g++pUnJVTi6DvnNd/k5N2H2B5BTExcOHy2NaISbfxuF3yvWWz5drEHExqt26jgY/5H jZ8S3Y8Kcy46q6ZkQBde+BMu0fTR7v+OVwAoLhF72dryc7B4k5z6Ytt4gU6OQGqnFG6Q RaqIQzrkNrUMRBms8KZ623Yku5MqNT3lNSvRrnLEG4237C+DcL+m3CuHOztHgZBhy22a I8FA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736275693; x=1736880493; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=rk8gGRBUBzYGA/wGbzmWKmNsJkZ0zUQC1Vm7cFkzsUg=; b=akyEJ9IS5pUomz6R2YZbBTefbQb0W1ZSmZuiYS0bXtaKd31iYTMdmpeYKAzs0Ac3m0 ZNfJKwUd1YkaM+3d/C5vn9Dg0aXIIHD4hNstUX/bgez9xilbuThTYTZbsoUNJHR2Tu3J 23MQu/tsG5H+PZVRRvrKkw1Iic9o94MPM6PJy9c76kCFb6DDX8PDfxIzeSFSmCJ02YAw mATme2qjX6vNHdb94MZQjx5ySpCTA2/SmqOBr2PW39zisansIDXsLyz+G6m5QtAhUmOS D/VvT9GjCa3QKgJNwIqIa9Ju6fv9/mmG1hJd1a3dmyulHc5xoSueG+0ETs3siFhnb27Q OIjw== X-Forwarded-Encrypted: i=1; AJvYcCX0QCqBWSXtEIcrfHf3gn6+Xo51bvF7+IXRuWqQWoFCiqIgDKbnNbnl7vE2VMqrzMZ4mGs9APskmEBoOsg=@vger.kernel.org X-Gm-Message-State: AOJu0YyTGfzE+UBhv7Xtojk2fVot8CEqUvNTQPL0x6UPJ0DXJhw72BdO OVsMAXTSPgvvwYFaWVojcdJb0GwhG4ORHbRbPdWQ55ePLGv04ALtUyzRjMnfQ9z/IZrw8UZkYER vGO9DJdn1r5uMn7jq7fd+cFtaHoLq/b/nWw== X-Google-Smtp-Source: AGHT+IFdAzLXbO2JkFr6H9h5q7HlYAi/wupYUCRA9P6KEwg4AV1/VAJRWO1ih6khzEfbAr8w3y0I1JH1Peh32phJwTXDJQ== X-Received: from pfxa5.prod.google.com ([2002:a05:6a00:1d05:b0:724:e19a:dfd1]) (user=isaacmanjarres job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a21:8cc4:b0:1e2:5c9:65e0 with SMTP id adf61e73a8af0-1e88d2ec106mr351161637.32.1736275693607; Tue, 07 Jan 2025 10:48:13 -0800 (PST) Date: Tue, 7 Jan 2025 10:48:01 -0800 In-Reply-To: <20250107184804.4074147-1-isaacmanjarres@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250107184804.4074147-1-isaacmanjarres@google.com> X-Mailer: git-send-email 2.47.1.613.gc27f4b7a9f-goog Message-ID: <20250107184804.4074147-2-isaacmanjarres@google.com> Subject: [PATCH v2 1/2] mm/memfd: Refactor and cleanup the logic in memfd_create() From: "Isaac J. Manjarres" To: lorenzo.stoakes@oracle.com, Andrew Morton Cc: kaleshsingh@google.com, jstultz@google.com, aliceryhl@google.com, surenb@google.com, "Isaac J. Manjarres" , kernel-team@android.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" memfd_create() is a pretty busy function that could be easier to read if some of the logic was split out into helper functions. Therefore, split the flags check, name creation, and file creation into their own helper functions, and create the file structure before creating the memfd. This allows for simplifying the error handling path in memfd_create(). No functional change. Signed-off-by: Isaac J. Manjarres --- mm/memfd.c | 87 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 31 deletions(-) diff --git a/mm/memfd.c b/mm/memfd.c index 5f5a23c9051d..a9430090bb20 100644 --- a/mm/memfd.c +++ b/mm/memfd.c @@ -369,16 +369,8 @@ int memfd_check_seals_mmap(struct file *file, unsigned long *vm_flags_ptr) return err; } -SYSCALL_DEFINE2(memfd_create, - const char __user *, uname, - unsigned int, flags) +static int memfd_validate_flags(unsigned int flags) { - unsigned int *file_seals; - struct file *file; - int fd, error; - char *name; - long len; - if (!(flags & MFD_HUGETLB)) { if (flags & ~(unsigned int)MFD_ALL_FLAGS) return -EINVAL; @@ -393,20 +385,25 @@ SYSCALL_DEFINE2(memfd_create, if ((flags & MFD_EXEC) && (flags & MFD_NOEXEC_SEAL)) return -EINVAL; - error = check_sysctl_memfd_noexec(&flags); - if (error < 0) - return error; + return check_sysctl_memfd_noexec(&flags); +} + +static char *memfd_create_name(const char __user *uname) +{ + int error; + char *name; + long len; /* length includes terminating zero */ len = strnlen_user(uname, MFD_NAME_MAX_LEN + 1); if (len <= 0) - return -EFAULT; + return ERR_PTR(-EFAULT); if (len > MFD_NAME_MAX_LEN + 1) - return -EINVAL; + return ERR_PTR(-EINVAL); name = kmalloc(len + MFD_NAME_PREFIX_LEN, GFP_KERNEL); if (!name) - return -ENOMEM; + return ERR_PTR(-ENOMEM); strcpy(name, MFD_NAME_PREFIX); if (copy_from_user(&name[MFD_NAME_PREFIX_LEN], uname, len)) { @@ -420,11 +417,22 @@ SYSCALL_DEFINE2(memfd_create, goto err_name; } - fd = get_unused_fd_flags((flags & MFD_CLOEXEC) ? O_CLOEXEC : 0); - if (fd < 0) { - error = fd; - goto err_name; - } + return name; + +err_name: + kfree(name); + return ERR_PTR(error); +} + +static struct file *memfd_file_create(const char *name, unsigned int flags) +{ + unsigned int *file_seals; + struct file *file; + int error; + + error = memfd_validate_flags(flags); + if (error < 0) + return ERR_PTR(error); if (flags & MFD_HUGETLB) { file = hugetlb_file_setup(name, 0, VM_NORESERVE, @@ -433,10 +441,8 @@ SYSCALL_DEFINE2(memfd_create, MFD_HUGE_MASK); } else file = shmem_file_setup(name, 0, VM_NORESERVE); - if (IS_ERR(file)) { - error = PTR_ERR(file); - goto err_fd; - } + if (IS_ERR(file)) + return file; file->f_mode |= FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE; file->f_flags |= O_LARGEFILE; @@ -456,13 +462,32 @@ SYSCALL_DEFINE2(memfd_create, *file_seals &= ~F_SEAL_SEAL; } - fd_install(fd, file); - kfree(name); - return fd; + return file; +} -err_fd: - put_unused_fd(fd); -err_name: +SYSCALL_DEFINE2(memfd_create, + const char __user *, uname, + unsigned int, flags) +{ + struct file *file; + int fd; + char *name; + + name = memfd_create_name(uname); + if (IS_ERR(name)) + return PTR_ERR(name); + + file = memfd_file_create(name, flags); + /* name is not needed beyond this point. */ kfree(name); - return error; + if (IS_ERR(file)) + return PTR_ERR(file); + + fd = get_unused_fd_flags((flags & MFD_CLOEXEC) ? O_CLOEXEC : 0); + if (fd >= 0) + fd_install(fd, file); + else + fput(file); + + return fd; } -- 2.47.1.613.gc27f4b7a9f-goog