From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id ED3E4C0218D for ; Tue, 28 Jan 2025 15:23:31 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 7E4DD280235; Tue, 28 Jan 2025 10:23:31 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 793E828022B; Tue, 28 Jan 2025 10:23:31 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 634A9280235; Tue, 28 Jan 2025 10:23:31 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 44DFF28022B for ; Tue, 28 Jan 2025 10:23:31 -0500 (EST) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 91770121505 for ; Tue, 28 Jan 2025 15:23:30 +0000 (UTC) X-FDA: 83057229780.23.973BF98 Received: from mout.perfora.net (mout.perfora.net [74.208.4.196]) by imf22.hostedemail.com (Postfix) with ESMTP id 371ACC0010 for ; Tue, 28 Jan 2025 15:23:28 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=jordanrome.com header.s=s1-ionos header.b=sH7bBCvC; spf=pass (imf22.hostedemail.com: domain of linux@jordanrome.com designates 74.208.4.196 as permitted sender) smtp.mailfrom=linux@jordanrome.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1738077808; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=dviztsrN6r3+sJz8wDFyEpqNs703txYKEZgvVUo9trw=; b=tHrplS3rGGCbkxcrsAMLPiElItqccLTkne5woCiY6cdD7GkTggn7eh9mHL+qLGWOe2EV2a fbiLXOzTxa0xircd6gH6YxQENvxGMOe5r0Yj6DFUmr/X6OqvW8gsFsq1IZxpyJPWxdAWX0 XMwemIXSOlX9vUUEJqx0mfuhgxcC/Xo= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1738077808; a=rsa-sha256; cv=none; b=jdUsbvZE77L0fOM1Cn6tr5FoxCpOY/ZEyg/tdIQsaFOnd970wzZ3YNqsuSS/CvccR2JzNJ /53eJb3UaMR+ziBVkcZVY+lHzkFLxKGLnQT5iRTPfcXbnDTeeaNnWZVzHw5nDeE0ZqF3PJ HMpnra0CfxKiQnmSXjKgtzfbMZeyA40= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=jordanrome.com header.s=s1-ionos header.b=sH7bBCvC; spf=pass (imf22.hostedemail.com: domain of linux@jordanrome.com designates 74.208.4.196 as permitted sender) smtp.mailfrom=linux@jordanrome.com; dmarc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jordanrome.com; s=s1-ionos; t=1738077807; x=1738682607; i=linux@jordanrome.com; bh=dviztsrN6r3+sJz8wDFyEpqNs703txYKEZgvVUo9trw=; h=X-UI-Sender-Class:MIME-Version:References:In-Reply-To:From:Date: Message-ID:Subject:To:Cc:Content-Type:Content-Transfer-Encoding: cc:content-transfer-encoding:content-type:date:from:message-id: mime-version:reply-to:subject:to; b=sH7bBCvCnL1XOuCqcWAH/H3jY4gT0bNdp4KHBCXJgQ7OYHA7XOq23Gbh4OAxg3c1 +lFLQ7i7s0FsfKEqoePPi6+TTC90B6hdrjxQECHoUPGnzPQkghx3cE7plpNd0/9b4 98U49sowVSq6YiJ4vZzOsnr6aV3nKplg8tzz8Hac2xguT0g7iV9vHhGj88vfUdQcw li2LpAaUSWi9uDbelP3NoXk7L8+BBfyFjfqAxPovpPrkC9WVizQGnpZdWLYqM5XXf IZKCmFIxD3/NdJBZQCZVRyoSz+Walr1ijFyhuYXbvXZeT87NTJTfDKkCEpTWRukvh eJiPjwEaHa7ZFz0f1w== X-UI-Sender-Class: 55c96926-9e95-11ee-ae09-1f7a4046a0f6 Received: from mail-il1-f171.google.com ([209.85.166.171]) by mrelay.perfora.net (mreueus003 [74.208.5.2]) with ESMTPSA (Nemesis) id 0M2bMR-1tMMZu0Qgn-00t3yU for ; Tue, 28 Jan 2025 16:23:27 +0100 Received: by mail-il1-f171.google.com with SMTP id e9e14a558f8ab-3a9628d20f0so40042385ab.2 for ; Tue, 28 Jan 2025 07:23:26 -0800 (PST) X-Forwarded-Encrypted: i=1; AJvYcCXlkKixMLtuggPv35s0qL136RoJoc67omdrA0oVxWfYtRPiMizJ8cJIoiTTaiPKMdrVNXaQhAa5zg==@kvack.org X-Gm-Message-State: AOJu0YzDbdAYVxJdm7fzGhYxGk7/bA9W8cdSGFKYLPyctIqmLWlFHdXq wBwBS5xAjKfq8XHgfKb6m8hcuHClcj1aQ5FL8ZAn0Z0j3JaW2vXMT0i3tpjqq1wgzDAdR3/45Qz t/icsj5kgKmfu2OdK9CMNGKir6eQ= X-Google-Smtp-Source: AGHT+IFA7V3WZTORdWHz9Ixoi8Wx6BJeLy8NoBN4lsjAoP2lDCzQQBZApCt9YdDDjzp2PcLRhpIc6gXFIF1LpSHzAEQ= X-Received: by 2002:a92:ca0a:0:b0:3cf:c8bf:3b87 with SMTP id e9e14a558f8ab-3cfc8bf3cb0mr140284785ab.1.1738077806421; Tue, 28 Jan 2025 07:23:26 -0800 (PST) MIME-Version: 1.0 References: <20250126163857.410463-1-linux@jordanrome.com> In-Reply-To: From: Jordan Rome Date: Tue, 28 Jan 2025 10:23:15 -0500 X-Gmail-Original-Message-ID: X-Gm-Features: AWEUYZmD5R9qgG6wb5qN2aJde3RCAr02FoQFbl4F5NzEp9wPPikB6YRRSr_EPnc Message-ID: Subject: Re: [bpf-next v5 1/3] mm: add copy_remote_vm_str To: Andrii Nakryiko Cc: bpf@vger.kernel.org, linux-mm@kvack.org, Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Kernel Team , Andrew Morton , Shakeel Butt , Alexander Potapenko Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Provags-ID: V03:K1:pGjLuZfazUwsE5oxzuX5/yRTcqf7kvW3sqSjTqPN5Z6maQ8CNaw xypLpb0sgHRQobz3lB/fthvmq66f0j5s0Jnfi2NL4HS/P83s+nsPSv4AlUclGi98Luxzj7P m682YD9bThSLlsJGkZCwKw454NY+9Ch/3LWfCjuTUacnPJEnmk4a11qy7AeiNe9rFgAVP4i NMuaV20gj/9NkYpn464aw== UI-OutboundReport: notjunk:1;M01:P0:lZqM4dgFIzk=;+Li+OnGx8LGY3KShDcj8tYuklK3 nH7RZwj9QY4mM0PfAsok17DxpaSs12g55H38HMktqKi+/jov3O/IOtKPlbNhq0M3IQuL0KLb4 pGWbMiSLBgvX7/c+LHtNsLYykosVko3WzZ+pEWWP79eswWM46nGFwpx/iHD8UNQATu6tLYPKJ l+LEtgdJvmtDr//9k8o+JftSm5I0hKRjNA1wT2fcdxfCVe7ycuB8NPSu4hO6o0eUClKI1+2wV vrSndQzkvMZgKzRF8X/KJ48lMcO5RnTRp6h/XNGu7+rQ+kZGRnAElS37F0GKNelYGwoOufrpp 899NHYSdrhvA8P359it3DaskM/WL/LQyuCIjtLP6/7Iehp5/yKkbggS1V1uQ8hja/aKak1dXK fnCK8B0lao1WwJ/fkR7nC8vqeQoysVKRHGi0gi1Lx1XdUL/PX3zjQ6qd6TbhWyLZ+sDOzda2G NoXkHKuiq1SAqiFUkFEL5RFimyZ4nbFlGhiHyczCm6YiEZXPvK4WrM0IB9D55OJhv3XVaKe6H TzNDoxXPwLoRPdv5U/qgGWyquvuzdJLXswjXSf471Eru8idFI1sf539uLROWKKZ44Gdqw86Ax 40njBVhjl8kMr6Ac/KaQtjcu8M1tiw2vFwO2q17jXibeJ8o09awTegCGJS2H6Z3LKJWrhZtWP ncOaK5p8C4l1TtTmmcjALEEktdVkXxme2OuWon7YXnzljE6fHM6bGLY4zdygbfOfJPZE9mgrd zD7zOGLQj6J5WYWux1RDvm22klZLwEhac+hMli2e01jBOee+x5DKGF2mdEES2KC8PDDglC4vc uDjaJrBzW2c9uGU4M7S2fxa4DpLmkTn5evEoXkyVckan7h99EJshW96yvS9ANBDtSohk2uz45 ywgabhWK21DuNJZkGORzUoNVvNkB09ISqJG06t01mtgrkI/zacKPBNE/3PKTy/2y5ZoWrzK/z yfPmfXf5FwKSpST1GOk3c7A9IX3J38ZE1UuJ/UFygF1DAFzSjrGsjz8zCU/+7v5wGb7W8GbXP kggjPglrpHC2O4/g3Rz22e9m7S7EYyFCpHSDjWlJZtZZsxCPAi8UfL25Z+vteGX8+44MbKCdt 9ZMHixNq2XBljvXGpeogVrGM9DPbEPT0unUG0gW75s8iGZJ3vOGVg9Wg0fsitxceXnA4rITjw xE2SD2AeWh12rPgarb57/jp+3+8oegD6QIvtkRo3Ohwhi7oI20eE9IeWtb+JTyRjkeOPqHPH5 S54v2F+dwp5/rQbyXLNzc5uBIhJSGFP3JQ== X-Stat-Signature: 44th64zpbrbc6oxwif7w377n7k3f8ej8 X-Rspam-User: X-Rspamd-Queue-Id: 371ACC0010 X-Rspamd-Server: rspam03 X-HE-Tag: 1738077808-369843 X-HE-Meta: U2FsdGVkX1/rE8JtYb/p3VsAntBffB3Flz/WRCFNQWqArin79VVR2mUqsg5mwALgfChUJXIwfIFlh4/j+Qi4lXIIAjNM+t3CAdefr1hPcCE5rC+MzqDA713719gNRmjoTmdiKpKszGjyfsu3LgpXR3NFYLv8fF5Ts+EhvGhpoNjRkVS2dcP6KsnbNETiUBVbjcoQYUpXnc3wpXrsaBHIXvQqPdRG73XDm/wZbqSzAz/jVmvTmndUkCFNgZwkVPdWmutg5TeP0U++N+JudP44SNt+s4Ao4J/2VnYEBOnQ1juYpWkXIEXmhA4JpgWSZf4jRUo354fTfBXQ3VtemPN2TuP3BH4UmQK11z6FEBqXVxWgau+zLKyOgJnvrj67QTemJuWWMBuRGlD59W2lAlG3Y6LUDwihFSpMCCLm8V34ab21sO1qTHuvqMD5DwWmCiKUJFDIqfUMqo+bIe/s/u8yb43xS+44Pk6aJsEJC7JDNYc7064igGUoF3I7WUaYvd0lVr/0tHjafYmnl5cJl+6suGY2FsppviSsBWuOmhBHPV5AIKpK7bTmdyU5aqCKGuHj3juKoA1MeYPKXx3gBh0YB87SuprtIb8+ucqBl6ifYoPRuIH+dhGdmsA1TjRRleA4d7q+m8DiuXdf7ClNpuYCPGjCDi1Z2veMDk3/0MEzXBHsLmjhqlWMHAFRO+xG0nH8NUP0ZAl7TTGUjUGH89VYIsy3rAERnG2PKB3L0wZiJRZO0/wv+wK9DH+2+wbbz9HNYPyKnq03/kNps8laF3Trk1lr4HJqjkwWfhR6GjSNYm881v2cqUNY1CscT4amezu4uRpzhQAmk2/8aKw55iaGONPgbszhBwxbHNAF8orpDx5HRQwbKplaHf6VLTWztjqAKDPQc4Iehz/lV9iD4oleljIwYOWFcFiRCu6ju/rQYdaAiVkj2YxSBwcgNY7JuNohHS5NkIVkGR3uv/rQUpj 4/1oaUBK sSMSVZquKSSRak2EvUHCbTMwtzK+qi70JksIb7Ux6UCZZ/DtM6IJqn7ZT09AFe9fAbmbSWa2OI53jf3QluFvu/u+K+Z38q7Fq58yQgd+o9OjGFG8bQxSp7CTY6P1c+jnZ7OYdg/9gV2T1C4Uj2MzA9XIG4dDS4QhMz7VIIvetxaUhrMYkQBAE3GsA/ySJzKK8A/znXZa4918A2LE5c9j60Kojn7Y2uZW4ICNEx0Obu4CAcBQ6kiJe81eY5qWevqUNp18deZj+wiEOlwZDKXccEjhlrHXlLPeT0xF4PWFUqkXTNU8hoLlJnc2m1sqTidZhTy2NrOoV7Db7mvKEPrqs9cYvDrqLuQr5FwLt5IZ1+vwwG/Rv97El9nBF66Ks3jbjKakS9eoXEFpujNy+deVtP0Nz77jzdssGVX0c1NMixOy28aA= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Mon, Jan 27, 2025 at 6:49=E2=80=AFPM Andrii Nakryiko wrote: > > On Sun, Jan 26, 2025 at 8:39=E2=80=AFAM Jordan Rome wrote: > > > > Similar to `access_process_vm` but specific to strings. > > Also chunks reads by page and utilizes `strscpy` > > for handling null termination. > > > > Signed-off-by: Jordan Rome > > --- > > include/linux/mm.h | 3 ++ > > mm/memory.c | 118 +++++++++++++++++++++++++++++++++++++++++++++ > > mm/nommu.c | 67 +++++++++++++++++++++++++ > > 3 files changed, 188 insertions(+) > > > > diff --git a/include/linux/mm.h b/include/linux/mm.h > > index f02925447e59..f3a05b3eb2f2 100644 > > --- a/include/linux/mm.h > > +++ b/include/linux/mm.h > > @@ -2485,6 +2485,9 @@ extern int access_process_vm(struct task_struct *= tsk, unsigned long addr, > > extern int access_remote_vm(struct mm_struct *mm, unsigned long addr, > > void *buf, int len, unsigned int gup_flags); > > > > +extern int copy_remote_vm_str(struct task_struct *tsk, unsigned long a= ddr, > > + void *buf, int len, unsigned int gup_flags); > > + > > long get_user_pages_remote(struct mm_struct *mm, > > unsigned long start, unsigned long nr_pages, > > unsigned int gup_flags, struct page **pages, > > diff --git a/mm/memory.c b/mm/memory.c > > index 398c031be9ba..e1ed5095b258 100644 > > --- a/mm/memory.c > > +++ b/mm/memory.c > > @@ -6714,6 +6714,124 @@ int access_process_vm(struct task_struct *tsk, = unsigned long addr, > > } > > EXPORT_SYMBOL_GPL(access_process_vm); > > > > +/* > > + * Copy a string from another process's address space as given in mm. > > + * If there is any error return -EFAULT. > > + */ > > +static int __copy_remote_vm_str(struct mm_struct *mm, unsigned long ad= dr, > > + void *buf, int len, unsigned int gup_flag= s) > > +{ > > + void *old_buf =3D buf; > > + int err =3D 0; > > + > > + if (mmap_read_lock_killable(mm)) > > + return -EFAULT; > > + > > + /* Untag the address before looking up the VMA */ > > + addr =3D untagged_addr_remote(mm, addr); > > + > > + /* Avoid triggering the temporary warning in __get_user_pages *= / > > + if (!vma_lookup(mm, addr)) { > > + err =3D -EFAULT; > > + goto out; > > + } > > + > > + while (len) { > > + int bytes, offset, retval; > > + void *maddr; > > + struct page *page; > > + struct vm_area_struct *vma =3D NULL; > > + > > + page =3D get_user_page_vma_remote(mm, addr, gup_flags, = &vma); > > + > > + if (IS_ERR(page)) { > > + /* > > + * Treat as a total failure for now until we de= cide how > > + * to handle the CONFIG_HAVE_IOREMAP_PROT case = and > > + * stack expansion. > > + */ > > + err =3D -EFAULT; > > + goto out; > > + } > > + > > + bytes =3D len; > > + offset =3D addr & (PAGE_SIZE - 1); > > + if (bytes > PAGE_SIZE - offset) > > + bytes =3D PAGE_SIZE - offset; > > + > > + maddr =3D kmap_local_page(page); > > + retval =3D strscpy(buf, maddr + offset, bytes); > > + unmap_and_put_page(page, maddr); > > + > > + if (retval > -1) { > > nit: retval >=3D 0 is more conventional, -1 has no special meaning here > (it's -EPERM, if anything), zero does > Ack. > > + /* Found the end of the string */ > > + buf +=3D retval; > > + goto out; > > + } > > + > > + retval =3D bytes - 1; > > + buf +=3D retval; > > + > > + if (bytes =3D=3D len) > > + goto out; > > + > > + /* > > + * Because strscpy always NUL terminates we need to > > + * copy the last byte in the page if we are going to > > + * load more pages > > + */ > > + addr +=3D retval; > > + len -=3D retval; > > + copy_from_user_page(vma, > > + page, > > + addr, > > + buf, > > + maddr + (PAGE_SIZE - 1), > > + 1); > > just realized, you've already unmap_and_put_page(), and yet you are > trying to access it here again. Seems like you'll need to delay that > unmap_and_put > Good catch on the `unmap_and_put_page` - will fix. > also, stylistical nit: you have tons of short arguments, keep them on > smaller number of lines, it's taking way too much vertical space for > what it is > Ack. > Also, I was worried about non-zero terminated buf here. It still can > happen if subsequent get_user_page_vma_remote() fails and we exit > early, but we'll end up returning -EFAULT, so perhaps that's not a > problem. On the other hand, it's trivial to do buf[1] =3D '\0'; to keep > that buf always zero-terminated, so maybe I'd do that... And if we do > buf[0] =3D '\0'; at the very beginning, we can document that > copy_remote_vm_str() leaves valid zero-terminated buffer of whatever > it managed to read before EFAULT, which isn't a bad property that > basically comes for free, no? Sounds good. Will update to always nul terminate the buffer. It is a bit odd to me that users would read the buffer at all if an error is returned but, at the same time, this implementation is doing exactly that if strscopy returns E2BIG. > > pw-bot: cr > > > + len -=3D 1; > > + buf +=3D 1; > > + addr +=3D 1; > > + } > > + > > +out: > > + mmap_read_unlock(mm); > > + if (err) > > + return err; > > + > > + return buf - old_buf; > > +} > > + > > +/** > > + * copy_remote_vm_str - copy a string from another process's address s= pace. > > + * @tsk: the task of the target address space > > + * @addr: start address to read from > > + * @buf: destination buffer > > + * @len: number of bytes to copy > > + * @gup_flags: flags modifying lookup behaviour > > + * > > + * The caller must hold a reference on @mm. > > + * > > + * Return: number of bytes copied from @addr (source) to @buf (destina= tion); > > + * not including the trailing NUL. On any error, return -EFAULT. > > "On success, leaves a properly NUL-terminated buffer." (or if we do > adjustments I suggested above we can even say "Even on error will > leave properly NUL-terminated buffer with contents that was > successfully read before -EFAULT", or something along those lines). > Ack. > > + */ > > +int copy_remote_vm_str(struct task_struct *tsk, unsigned long addr, > > + void *buf, int len, unsigned int gup_flags) > > +{ > > + struct mm_struct *mm; > > + int ret; > > + > > + mm =3D get_task_mm(tsk); > > + if (!mm) > > + return -EFAULT; > > + > > + ret =3D __copy_remote_vm_str(mm, addr, buf, len, gup_flags); > > + > > + mmput(mm); > > + > > + return ret; > > +} > > +EXPORT_SYMBOL_GPL(copy_remote_vm_str); > > + > > /* > > * Print the name of a VMA. > > */ > > diff --git a/mm/nommu.c b/mm/nommu.c > > index 9cb6e99215e2..ce24ea829c73 100644 > > --- a/mm/nommu.c > > +++ b/mm/nommu.c > > @@ -1701,6 +1701,73 @@ int access_process_vm(struct task_struct *tsk, u= nsigned long addr, void *buf, in > > } > > EXPORT_SYMBOL_GPL(access_process_vm); > > > > +/* > > + * Copy a string from another process's address space as given in mm. > > + * If there is any error return -EFAULT. > > + */ > > +static int __copy_remote_vm_str(struct mm_struct *mm, unsigned long ad= dr, > > + void *buf, int len) > > +{ > > + int ret; > > + struct vm_area_struct *vma; > > + > > + if (mmap_read_lock_killable(mm)) > > + return -EFAULT; > > + > > + /* the access must start within one of the target process's map= pings */ > > + vma =3D find_vma(mm, addr); > > + if (vma) { > > + /* don't overrun this mapping */ > > + if (addr + len >=3D vma->vm_end) > > Should we worry about overflows here? check_add_overflow() maybe? Ack. > > > + len =3D vma->vm_end - addr; > > + > > + /* only read mappings where it is permitted */ > > + if (vma->vm_flags & VM_MAYREAD) { > > + ret =3D strscpy(buf, (char *)addr, len); > > + if (ret < 0) > > + ret =3D len - 1; > > + } else { > > + ret =3D -EFAULT; > > + } > > + } else { > > + ret =3D -EFAULT; > > + } > > + > > nit: might be cleaner to have `ret =3D -EFAULT;` before `if (vma)` and > only set ret on success/overflow? Ack. > > > + mmap_read_unlock(mm); > > + return ret; > > +} > > + > > +/** > > + * copy_remote_vm_str - copy a string from another process's address s= pace. > > + * @tsk: the task of the target address space > > + * @addr: start address to read from > > + * @buf: destination buffer > > + * @len: number of bytes to copy > > + * @gup_flags: flags modifying lookup behaviour (unused) > > + * > > + * The caller must hold a reference on @mm. > > + * > > + * Return: number of bytes copied from @addr (source) to @buf (destina= tion); > > + * not including the trailing NUL. On any error, return -EFAULT. > > + */ > > +int copy_remote_vm_str(struct task_struct *tsk, unsigned long addr, > > + void *buf, int len, unsigned int gup_flags) > > +{ > > + struct mm_struct *mm; > > + int ret; > > + > > + mm =3D get_task_mm(tsk); > > + if (!mm) > > + return -EFAULT; > > + > > + ret =3D __copy_remote_vm_str(mm, addr, buf, len); > > + > > + mmput(mm); > > + > > + return ret; > > +} > > +EXPORT_SYMBOL_GPL(copy_remote_vm_str); > > + > > /** > > * nommu_shrink_inode_mappings - Shrink the shared mappings on an inod= e > > * @inode: The inode to check > > -- > > 2.43.5 > > > >