fs/iomap: Fix buffered write page prefaulting
[linux-2.6-microblaze.git] / mm / shmem.c
index 23c91a8..dc038ce 100644 (file)
@@ -2456,7 +2456,6 @@ shmem_write_begin(struct file *file, struct address_space *mapping,
        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 |
@@ -2467,15 +2466,7 @@ shmem_write_begin(struct file *file, struct address_space *mapping,
                        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
@@ -2562,12 +2553,6 @@ static ssize_t shmem_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
                        if (sgp == SGP_CACHE)
                                set_page_dirty(page);
                        unlock_page(page);
-
-                       if (PageHWPoison(page)) {
-                               put_page(page);
-                               error = -EIO;
-                               break;
-                       }
                }
 
                /*
@@ -2960,28 +2945,6 @@ static int shmem_rmdir(struct inode *dir, struct dentry *dentry)
        return shmem_unlink(dir, dentry);
 }
 
-static int shmem_exchange(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry)
-{
-       bool old_is_dir = d_is_dir(old_dentry);
-       bool new_is_dir = d_is_dir(new_dentry);
-
-       if (old_dir != new_dir && old_is_dir != new_is_dir) {
-               if (old_is_dir) {
-                       drop_nlink(old_dir);
-                       inc_nlink(new_dir);
-               } else {
-                       drop_nlink(new_dir);
-                       inc_nlink(old_dir);
-               }
-       }
-       old_dir->i_ctime = old_dir->i_mtime =
-       new_dir->i_ctime = new_dir->i_mtime =
-       d_inode(old_dentry)->i_ctime =
-       d_inode(new_dentry)->i_ctime = current_time(old_dir);
-
-       return 0;
-}
-
 static int shmem_whiteout(struct user_namespace *mnt_userns,
                          struct inode *old_dir, struct dentry *old_dentry)
 {
@@ -3027,7 +2990,7 @@ static int shmem_rename2(struct user_namespace *mnt_userns,
                return -EINVAL;
 
        if (flags & RENAME_EXCHANGE)
-               return shmem_exchange(old_dir, old_dentry, new_dir, new_dentry);
+               return simple_rename_exchange(old_dir, old_dentry, new_dir, new_dentry);
 
        if (!simple_empty(new_dentry))
                return -ENOTEMPTY;
@@ -3129,8 +3092,7 @@ static const char *shmem_get_link(struct dentry *dentry,
                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);
                }
@@ -3138,11 +3100,6 @@ static const char *shmem_get_link(struct dentry *dentry,
                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);
@@ -3793,13 +3750,6 @@ static void shmem_destroy_inodecache(void)
        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,
@@ -3810,7 +3760,7 @@ const struct address_space_operations shmem_aops = {
 #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);
 
@@ -4221,10 +4171,6 @@ struct page *shmem_read_mapping_page_gfp(struct address_space *mapping,
                page = ERR_PTR(error);
        else
                unlock_page(page);
-
-       if (PageHWPoison(page))
-               page = ERR_PTR(-EIO);
-
        return page;
 #else
        /*