/* We're going to need a bounce buffer if what we transmit is going to *bedifferentinsomewaytothesourcebuffer,e.g.becauseitgets *encrypted/compressedorbecauseitneedsexpandingtoablocksize.
*/ // TODO
{ /* If this is an async op and we're not using a bounce buffer, *wehavetosavethesourcebufferastheiteratorisonly *gooduntilwereturn.Insuchacase,extractaniterator *torepresentasmuchofthetheoutputbufferaswecan *manage.Notethattheextractionmightnotbeableto *allocateasufficientlylargebvecarrayandmayshortenthe *request.
*/ if (user_backed_iter(iter)) {
n = netfs_extract_user_iter(iter, len, &wreq->buffer.iter, 0); if (n < 0) {
ret = n; goto error_put;
}
wreq->direct_bv = (struct bio_vec *)wreq->buffer.iter.bvec;
wreq->direct_bv_count = n;
wreq->direct_bv_unpin = iov_iter_extract_will_pin(iter);
} else { /* If this is a kernel-generated async DIO request, *assumethatanyresourcestheiteratorpointsto *(eg.abio_vecarray)willpersisttilltheendof *theop.
*/
wreq->buffer.iter = *iter;
}
}
__set_bit(NETFS_RREQ_USE_IO_ITER, &wreq->flags); if (async)
__set_bit(NETFS_RREQ_OFFLOAD_COLLECTION, &wreq->flags);
/* Copy the data into the bounce buffer and encrypt it. */ // TODO
/* Dispatch the write. */
__set_bit(NETFS_RREQ_UPLOAD_TO_SERVER, &wreq->flags); if (async)
wreq->iocb = iocb;
wreq->len = iov_iter_count(&wreq->buffer.iter);
ret = netfs_unbuffered_write(wreq, is_sync_kiocb(iocb), wreq->len); if (ret < 0) {
_debug("begin = %zd", ret); goto out;
}
if (!async) {
ret = netfs_wait_for_write(wreq); if (ret > 0)
iocb->ki_pos += ret;
} else {
ret = -EIOCBQUEUED;
}
ret = netfs_start_io_direct(inode); if (ret < 0) return ret;
ret = generic_write_checks(iocb, from); if (ret <= 0) goto out;
ret = file_remove_privs(file); if (ret < 0) goto out;
ret = file_update_time(file); if (ret < 0) goto out; if (iocb->ki_flags & IOCB_NOWAIT) { /* We could block if there are any pages in the range. */
ret = -EAGAIN; if (filemap_range_has_page(mapping, pos, end)) if (filemap_invalidate_inode(inode, true, pos, end)) goto out;
} else {
ret = filemap_write_and_wait_range(mapping, pos, end); if (ret < 0) goto out;
}
/* *Afterawritewewantbufferedreadstobesuretogotodisktoget *thenewdata.Weinvalidatecleancachedpagefromtheregionwe're *abouttowrite.Wedothis*before*thewritesothatwecanreturn *withoutclobbering-EIOCBQUEUEDfrom->direct_IO().
*/
ret = filemap_invalidate_inode(inode, true, pos, end); if (ret < 0) goto out;
end = iocb->ki_pos + iov_iter_count(from); if (end > ictx->zero_point)
ictx->zero_point = end;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.