include/linux/pagemap.h: introduce attach/detach_page_private

Patch series "Introduce attach/detach_page_private to cleanup code".

    This patch (of 10):

    The logic in attach_page_buffers and __clear_page_buffers are quite
    paired, but

    1. they are located in different files.

    2. attach_page_buffers is implemented in buffer_head.h, so it could be
       used by other files. But __clear_page_buffers is static function in
       buffer.c and other potential users can't call the function, md-bitmap
       even copied the function.

    So, introduce the new attach/detach_page_private to replace them.  With
    the new pair of function, we will remove the usage of attach_page_buffers
    and __clear_page_buffers in next patches.  Thanks for suggestions about
    the function name from Alexander Viro, Andreas Grünbacher, Christoph
    Hellwig and Matthew Wilcox.

    Suggested-by: Matthew Wilcox <willy@infradead.org>
    Signed-off-by: Guoqing Jiang <guoqing.jiang@cloud.ionos.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Reviewed-by: Andrew Morton <akpm@linux-foundation.org>
    Cc: "Darrick J. Wong" <darrick.wong@oracle.com>
    Cc: William Kucharski <william.kucharski@oracle.com>
    Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
    Cc: Andreas Gruenbacher <agruenba@redhat.com>
    Cc: Yang Shi <yang.shi@linux.alibaba.com>
    Cc: Yafang Shao <laoar.shao@gmail.com>
    Cc: Song Liu <song@kernel.org>
    Cc: Chris Mason <clm@fb.com>
    Cc: Josef Bac(CR) <josef@toxicpanda.com>
    Cc: David Sterba <dsterba@suse.com>
    Cc: Alexander Viro <viro@zeniv.linux.org.uk>
    Cc: Jaegeuk Kim <jaegeuk@kernel.org>
    Cc: Chao Yu <chao@kernel.org>
    Cc: Christoph Hellwig <hch@infradead.org>
    Cc: Anton Altaparmakov <anton@tuxera.com>
    Cc: M(CR)e Marshall <hubcap@omnibond.com>
    Cc: Martin Brandenburg <martin@omnibond.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: Andreas Dilger <adilger@dilger.ca>
    Cc: Chao Yu <yuchao0@huawei.com>
    Cc: Dave Chinner <david@fromorbit.com>
    Link: http://lkml.kernel.org/r/20200517214718.468-1-guoqing.jiang@cloud.ionos.com
    Link: http://lkml.kernel.org/r/20200517214718.468-2-guoqing.jiang@cloud.ionos.com
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

    Moto-CRs-Fixed:(CR)

Change-Id: Id4bbb98c9a658b834988f37843d09f065e246668
Signed-off-by: William Liu <a17671@motorola.com>
Reviewed-on: https://gerrit.mot.com/2380691
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Xiangpo Zhao <zhaoxp3@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
Guoqing Jiang 2022-09-08 19:53:16 +08:00 • committed by Xiaojun Ji
commit be4fac7c66

View file

@ -207,6 +207,43 @@ static inline int page_cache_add_speculative(struct page *page, int count)
return __page_cache_add_speculative(page, count);
}
/**
* attach_page_private - Attach private data to a page.
* @page: Page to attach data to.
* @data: Data to attach to page.
*
* Attaching private data to a page increments the page's reference count.
* The data must be detached before the page will be freed.
*/
static inline void attach_page_private(struct page *page, void *data)
{
get_page(page);
set_page_private(page, (unsigned long)data);
SetPagePrivate(page);
}
/**
* detach_page_private - Detach private data from a page.
* @page: Page to detach data from.
*
* Removes the data that was previously attached to the page and decrements
* the refcount on the page.
*
* Return: Data that was attached to the page.
*/
static inline void *detach_page_private(struct page *page)
{
void *data = (void *)page_private(page);
if (!PagePrivate(page))
return NULL;
ClearPagePrivate(page);
set_page_private(page, 0);
put_page(page);
return data;
}
#ifdef CONFIG_NUMA
extern struct page *__page_cache_alloc(gfp_t gfp);
#else