#include <linux/ratelimit.h>
 #include <linux/page-isolation.h>
 #include <linux/pagewalk.h>
-#include <linux/shmem_fs.h>
 #include "internal.h"
 #include "ras/ras_event.h"
 
 {
        int ret;
        struct address_space *mapping;
-       bool extra_pins;
 
        delete_from_lru_cache(p);
 
                goto out;
        }
 
-       /*
-        * The shmem page is kept in page cache instead of truncating
-        * so is expected to have an extra refcount after error-handling.
-        */
-       extra_pins = shmem_mapping(mapping);
-
        /*
         * Truncation is a bit tricky. Enable it per file system for now.
         *
         * Open: to take i_rwsem or not for this? Right now we don't.
         */
        ret = truncate_error_page(p, page_to_pfn(p), mapping);
-       if (has_extra_refcount(ps, p, extra_pins))
-               ret = MF_FAILED;
-
 out:
        unlock_page(p);
 
+       if (has_extra_refcount(ps, p, false))
+               ret = MF_FAILED;
+
        return ret;
 }
 
 
        struct inode *inode = mapping->host;
        struct shmem_inode_info *info = SHMEM_I(inode);
        pgoff_t index = pos >> PAGE_SHIFT;
-       int ret = 0;
 
        /* i_rwsem is held by caller */
        if (unlikely(info->seals & (F_SEAL_GROW |
                        return -EPERM;
        }
 
-       ret = shmem_getpage(inode, index, pagep, SGP_WRITE);
-
-       if (*pagep && PageHWPoison(*pagep)) {
-               unlock_page(*pagep);
-               put_page(*pagep);
-               ret = -EIO;
-       }
-
-       return ret;
+       return shmem_getpage(inode, index, pagep, SGP_WRITE);
 }
 
 static int
                        if (sgp == SGP_CACHE)
                                set_page_dirty(page);
                        unlock_page(page);
-
-                       if (PageHWPoison(page)) {
-                               put_page(page);
-                               error = -EIO;
-                               break;
-                       }
                }
 
                /*
                page = find_get_page(inode->i_mapping, 0);
                if (!page)
                        return ERR_PTR(-ECHILD);
-               if (PageHWPoison(page) ||
-                   !PageUptodate(page)) {
+               if (!PageUptodate(page)) {
                        put_page(page);
                        return ERR_PTR(-ECHILD);
                }
                error = shmem_getpage(inode, 0, &page, SGP_READ);
                if (error)
                        return ERR_PTR(error);
-               if (page && PageHWPoison(page)) {
-                       unlock_page(page);
-                       put_page(page);
-                       return ERR_PTR(-ECHILD);
-               }
                unlock_page(page);
        }
        set_delayed_call(done, shmem_put_link, page);
        kmem_cache_destroy(shmem_inode_cachep);
 }
 
-/* Keep the page in page cache instead of truncating it */
-static int shmem_error_remove_page(struct address_space *mapping,
-                                  struct page *page)
-{
-       return 0;
-}
-
 const struct address_space_operations shmem_aops = {
        .writepage      = shmem_writepage,
        .set_page_dirty = __set_page_dirty_no_writeback,
 #ifdef CONFIG_MIGRATION
        .migratepage    = migrate_page,
 #endif
-       .error_remove_page = shmem_error_remove_page,
+       .error_remove_page = generic_error_remove_page,
 };
 EXPORT_SYMBOL(shmem_aops);
 
                page = ERR_PTR(error);
        else
                unlock_page(page);
-
-       if (PageHWPoison(page))
-               page = ERR_PTR(-EIO);
-
        return page;
 #else
        /*