Siguiente: Cambios en el servidor Superior: Mejorando NFS Anterior: El protocolo NFScp |
A continuación se muestra la rutina de codificación y decodificación de los argumentos de copy para traducirlos a XDR y de vuelta (no usamos ninguna descripción en XDR de copy, puesto que en el kernel no se usa compilador de XDR, sino que se escriben las rutinas a mano).
nfs_xdr_copyargs(struct rpc_rqst *req, u32 *p, struct nfs_copyargs *args) { p = xdr_encode_fhandle(p, args->fhdest); p = xdr_encode_fhandle(p, args->fhsrc); *p++ = htonl(args->offsetdest); *p++ = htonl(args->offsetsrc); *p++ = htonl(args->count); p = xdr_encode_string(p, args->host); req->rq_slen = xdr_adjust_iovec(req->rq_svec, p); return 0; } nfs_xdr_copyres(struct rpc_rqst *req, u32 *p, struct nfs_copyres *res) { int status,count; if ((status = ntohl(*p++))) return -nfs_stat_to_errno(status); p = xdr_decode_fattr(p, res->fattrdest); p = xdr_decode_fattr(p, res->fattrsrc); res->count = count = ntohl(*p++); return count; }
Aquí se puede observar la parte de sys_sendfile
que
se ocupa de decidir si se usa copy o no.
/* Caso remoto en el que se llama a copy*/ if (nfs_copy_enabled && is_remote(in_file) && is_remote(out_file)) { size_t (*cpf)(struct file *,struct file*, size_t,loff_t*,loff_t*); if (!(cpf=in_file->f_op->copy)) panic("cp: no copy for remote file"); retval = (*cpf)(out_file,in_file,count,dppos,ppos); } /* Caso normal de sendfile si no hemos usado copy*/ if (!nfs_copy_enabled || retval<0 || !is_remote(in_file) || !is_remote(out_file)){ read_descriptor_t desc; printk("local sendfile call\n"); desc.written = 0; desc.count = count; desc.buf = (char *) out_file; desc.error = 0; do_generic_file_read(in_file,ppos, &desc, file_send_actor); retval = desc.written; if (!retval) retval = desc.error; }