This patch replaces to use cp_error flag instead of RDONLY for quota off.
Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
 
 int f2fs_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
+               return -EIO;
+
        return __f2fs_set_acl(inode, type, acl, NULL);
 }
 
 
 void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io)
 {
        set_ckpt_flags(sbi, CP_ERROR_FLAG);
-       sbi->sb->s_flags |= MS_RDONLY;
        if (!end_io)
                f2fs_flush_merged_writes(sbi);
 }
 
        struct dnode_of_data dn;
        int err;
 
+       if (unlikely(f2fs_cp_error(sbi))) {
+               err = -EIO;
+               goto err;
+       }
+
        sb_start_pagefault(inode->i_sb);
 
        f2fs_bug_on(sbi, f2fs_has_inline_data(inode));
 out:
        sb_end_pagefault(inode->i_sb);
        f2fs_update_time(sbi, REQ_TIME);
+err:
        return block_page_mkwrite_return(err);
 }
 
 
 int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
 {
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(file)))))
+               return -EIO;
        return f2fs_do_sync_file(file, start, end, datasync, false);
 }
 
        struct inode *inode = file_inode(file);
        int err;
 
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
+               return -EIO;
+
        /* we don't need to use inline_data strictly */
        err = f2fs_convert_inline_inode(inode);
        if (err)
 {
        int err;
 
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
+               return -EIO;
+
        if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) ||
                                S_ISLNK(inode->i_mode)))
                return 0;
        int err;
        bool size_changed = false;
 
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
+               return -EIO;
+
        err = setattr_prepare(dentry, attr);
        if (err)
                return err;
        struct inode *inode = file_inode(file);
        long ret = 0;
 
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
+               return -EIO;
+
        /* f2fs only support ->fallocate for regular file */
        if (!S_ISREG(inode->i_mode))
                return -EINVAL;
 
 long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
 {
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(file_inode(filp)))))
+               return -EIO;
+
        switch (cmd) {
        case F2FS_IOC_GETFLAGS:
                return f2fs_ioc_getflags(filp, arg);
        struct blk_plug plug;
        ssize_t ret;
 
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(inode))))
+               return -EIO;
+
        inode_lock(inode);
        ret = generic_write_checks(iocb, from);
        if (ret > 0) {
 
        nid_t ino = 0;
        int err;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        err = dquot_initialize(dir);
        if (err)
                return err;
        struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
        int err;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        if (f2fs_encrypted_inode(dir) &&
                        !fscrypt_has_permitted_context(dir, inode))
                return -EPERM;
 
        trace_f2fs_unlink_enter(dir, dentry);
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        err = dquot_initialize(dir);
        if (err)
                return err;
        struct fscrypt_symlink_data *sd = NULL;
        int err;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        if (f2fs_encrypted_inode(dir)) {
                err = fscrypt_get_encryption_info(dir);
                if (err)
        struct inode *inode;
        int err;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        err = dquot_initialize(dir);
        if (err)
                return err;
        struct inode *inode;
        int err = 0;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        err = dquot_initialize(dir);
        if (err)
                return err;
 
 static int f2fs_tmpfile(struct inode *dir, struct dentry *dentry, umode_t mode)
 {
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
+               return -EIO;
+
        if (f2fs_encrypted_inode(dir)) {
                int err = fscrypt_get_encryption_info(dir);
                if (err)
 
 static int f2fs_create_whiteout(struct inode *dir, struct inode **whiteout)
 {
+       if (unlikely(f2fs_cp_error(F2FS_I_SB(dir))))
+               return -EIO;
+
        return __f2fs_tmpfile(dir, NULL, S_IFCHR | WHITEOUT_MODE, whiteout);
 }
 
        bool is_old_inline = f2fs_has_inline_dentry(old_dir);
        int err = -ENOENT;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        if ((f2fs_encrypted_inode(old_dir) &&
                        !fscrypt_has_encryption_key(old_dir)) ||
                        (f2fs_encrypted_inode(new_dir) &&
        int old_nlink = 0, new_nlink = 0;
        int err = -ENOENT;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return -EIO;
+
        if ((f2fs_encrypted_inode(old_dir) &&
                        !fscrypt_has_encryption_key(old_dir)) ||
                        (f2fs_encrypted_inode(new_dir) &&
 
        struct f2fs_sb_info *sbi = F2FS_SB(sb);
        int err = 0;
 
+       if (unlikely(f2fs_cp_error(sbi)))
+               return 0;
+
        trace_f2fs_sync_fs(sb, sync);
 
        if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))