next up previous
Siguiente: Cambios en el servidor Superior: Mejorando NFS Anterior: El protocolo NFScp

Cambios al cliente

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;
                }




Download this document: [src.tar.gz][ps.gz][html.tar.gz][dvi.gz]

Congreso HispaLinux 2000