示例#1
0
static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
	struct file *file = iocb->ki_filp;
	struct inode *inode = file_inode(file);
	ssize_t ret;

	if (f2fs_encrypted_inode(inode) &&
				!fscrypt_has_encryption_key(inode) &&
				fscrypt_get_encryption_info(inode))
		return -EACCES;

	inode_lock(inode);
	ret = generic_write_checks(iocb, from);
	if (ret > 0) {
		ret = f2fs_preallocate_blocks(iocb, from);
		if (!ret)
			ret = __generic_file_write_iter(iocb, from);
	}
	inode_unlock(inode);

	if (ret > 0) {
		ssize_t err;

		err = generic_write_sync(file, iocb->ki_pos - ret, ret);
		if (err < 0)
			ret = err;
	}
	return ret;
}
示例#2
0
文件: file.c 项目: infidel/linux
static ssize_t udf_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
    ssize_t retval;
    struct file *file = iocb->ki_filp;
    struct inode *inode = file_inode(file);
    struct udf_inode_info *iinfo = UDF_I(inode);
    int err;

    mutex_lock(&inode->i_mutex);

    retval = generic_write_checks(iocb, from);
    if (retval <= 0)
        goto out;

    down_write(&iinfo->i_data_sem);
    if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_IN_ICB) {
        loff_t end = iocb->ki_pos + iov_iter_count(from);

        if (inode->i_sb->s_blocksize <
                (udf_file_entry_alloc_offset(inode) + end)) {
            err = udf_expand_file_adinicb(inode);
            if (err) {
                mutex_unlock(&inode->i_mutex);
                udf_debug("udf_expand_adinicb: err=%d\n", err);
                return err;
            }
        } else {
            iinfo->i_lenAlloc = max(end, inode->i_size);
            up_write(&iinfo->i_data_sem);
        }
    } else
        up_write(&iinfo->i_data_sem);

    retval = __generic_file_write_iter(iocb, from);
out:
    mutex_unlock(&inode->i_mutex);

    if (retval > 0) {
        mark_inode_dirty(inode);
        err = generic_write_sync(file, iocb->ki_pos - retval, retval);
        if (err < 0)
            retval = err;
    }

    return retval;
}