shmem.c (7ad0414bded6e8678840368be5cc72b9957a4478) shmem.c (e4b57722d0e6be8820039a7d506378640aee5073)
1/*
2 * Resizable virtual memory filesystem for Linux.
3 *
4 * Copyright (C) 2000 Linus Torvalds.
5 * 2000 Transmeta Corp.
6 * 2000-2001 Christoph Rohland
7 * 2000-2001 SAP AG
8 * 2002 Red Hat Inc.

--- 3129 unchanged lines hidden (view full) ---

3138 dir->i_ctime = dir->i_mtime = current_time(dir);
3139 d_instantiate(dentry, inode);
3140 dget(dentry);
3141 return 0;
3142}
3143
3144static void shmem_put_link(void *arg)
3145{
1/*
2 * Resizable virtual memory filesystem for Linux.
3 *
4 * Copyright (C) 2000 Linus Torvalds.
5 * 2000 Transmeta Corp.
6 * 2000-2001 Christoph Rohland
7 * 2000-2001 SAP AG
8 * 2002 Red Hat Inc.

--- 3129 unchanged lines hidden (view full) ---

3138 dir->i_ctime = dir->i_mtime = current_time(dir);
3139 d_instantiate(dentry, inode);
3140 dget(dentry);
3141 return 0;
3142}
3143
3144static void shmem_put_link(void *arg)
3145{
3146 mark_page_accessed(arg);
3147 put_page(arg);
3146 folio_mark_accessed(arg);
3147 folio_put(arg);
3148}
3149
3150static const char *shmem_get_link(struct dentry *dentry,
3151 struct inode *inode,
3152 struct delayed_call *done)
3153{
3148}
3149
3150static const char *shmem_get_link(struct dentry *dentry,
3151 struct inode *inode,
3152 struct delayed_call *done)
3153{
3154 struct page *page = NULL;
3154 struct folio *folio = NULL;
3155 int error;
3155 int error;
3156
3156 if (!dentry) {
3157 if (!dentry) {
3157 page = find_get_page(inode->i_mapping, 0);
3158 if (!page)
3158 folio = filemap_get_folio(inode->i_mapping, 0);
3159 if (!folio)
3159 return ERR_PTR(-ECHILD);
3160 return ERR_PTR(-ECHILD);
3160 if (PageHWPoison(page) ||
3161 !PageUptodate(page)) {
3162 put_page(page);
3161 if (PageHWPoison(&folio->page) ||
3162 !folio_test_uptodate(folio)) {
3163 folio_put(folio);
3163 return ERR_PTR(-ECHILD);
3164 }
3165 } else {
3164 return ERR_PTR(-ECHILD);
3165 }
3166 } else {
3166 error = shmem_getpage(inode, 0, &page, SGP_READ);
3167 error = shmem_get_folio(inode, 0, &folio, SGP_READ);
3167 if (error)
3168 return ERR_PTR(error);
3168 if (error)
3169 return ERR_PTR(error);
3169 if (!page)
3170 if (!folio)
3170 return ERR_PTR(-ECHILD);
3171 return ERR_PTR(-ECHILD);
3171 if (PageHWPoison(page)) {
3172 unlock_page(page);
3173 put_page(page);
3172 if (PageHWPoison(&folio->page)) {
3173 folio_unlock(folio);
3174 folio_put(folio);
3174 return ERR_PTR(-ECHILD);
3175 }
3175 return ERR_PTR(-ECHILD);
3176 }
3176 unlock_page(page);
3177 folio_unlock(folio);
3177 }
3178 }
3178 set_delayed_call(done, shmem_put_link, page);
3179 return page_address(page);
3179 set_delayed_call(done, shmem_put_link, folio);
3180 return folio_address(folio);
3180}
3181
3182#ifdef CONFIG_TMPFS_XATTR
3183
3184static int shmem_fileattr_get(struct dentry *dentry, struct fileattr *fa)
3185{
3186 struct shmem_inode_info *info = SHMEM_I(d_inode(dentry));
3187

--- 1109 unchanged lines hidden ---
3181}
3182
3183#ifdef CONFIG_TMPFS_XATTR
3184
3185static int shmem_fileattr_get(struct dentry *dentry, struct fileattr *fa)
3186{
3187 struct shmem_inode_info *info = SHMEM_I(d_inode(dentry));
3188

--- 1109 unchanged lines hidden ---