lkml.org 
[lkml]   [1998]   [Sep]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subjectfix for named pipes over NFS
    Hi Linus,

    The patch below, which appeared briefly in 2.1.117 and was backed out in
    2.1.118, allows the linux NFS client to handle named pipes residing on
    non-linux NFSv2 servers. It has no other impact, and has been tested here
    against a linux unfsd server and a solaris 2.5.1 server.

    Details: the NFSv2 protocol has no provisions for handling named pipes,
    and therefore they are encoded as character devices with major/minor = -1.
    Linux uses a non-standard extention of the protocol, which is incompatible
    with other servers - already existing pipes will appear as character
    devices, and trying to create new ones will result in plain files. The
    patch corrects this behavior, and also avoids breaking unfsd (which uses
    the same non-standard extention) by retrying the operation in the old
    style if the new style fails.

    Thanks,
    Ion

    --
    It is better to keep your mouth shut and be thought a fool,
    than to open it and remove all doubt.
    -------------------
    --- v2.1.120/linux/fs/nfs/dir.c Wed Jun 24 22:54:09 1998
    +++ linux/fs/nfs/dir.c Wed Aug 19 16:16:04 1998
    @@ -14,6 +14,8 @@
    * Following Linus comments on my original hack, this version
    * depends only on the dcache stuff and doesn't touch the inode
    * layer (iput() and friends).
    + * 04 Aug 1998 Ion Badulescu <ionut@cs.columbia.edu>
    + * FIFO's need special handling in NFSv2
    */

    #include <linux/sched.h>
    @@ -684,7 +703,10 @@
    if (dentry->d_name.len > NFS_MAXNAMLEN)
    return -ENAMETOOLONG;

    - sattr.mode = mode;
    + if (S_ISFIFO(mode))
    + sattr.mode = (mode & ~S_IFMT) | S_IFCHR;
    + else
    + sattr.mode = mode;
    sattr.uid = sattr.gid = sattr.size = (unsigned) -1;
    if (S_ISCHR(mode) || S_ISBLK(mode))
    sattr.size = rdev; /* get out your barf bag */
    @@ -693,6 +715,15 @@
    nfs_invalidate_dircache(dir);
    error = nfs_proc_create(NFS_SERVER(dir), NFS_FH(dentry->d_parent),
    dentry->d_name.name, &sattr, &fhandle, &fattr);
    + /*
    + * Retry invalid FIFO creates as the original object
    + * to cover for NFS servers that don't cope.
    + */
    + if (error == -EINVAL && S_ISFIFO(mode)) {
    + sattr.mode = mode;
    + error = nfs_proc_create(NFS_SERVER(dir), NFS_FH(dentry->d_parent),
    + dentry->d_name.name, &sattr, &fhandle, &fattr);
    + }
    if (!error)
    error = nfs_instantiate(dentry, &fhandle, &fattr);
    if (error)
    diff -u --recursive --new-file v2.1.120/linux/fs/nfs/mount_clnt.c linux/fs/nfs/mount_clnt.c
    --- v2.1.120/linux/fs/nfs/nfs2xdr.c Tue Mar 17 22:18:15 1998
    +++ linux/fs/nfs/nfs2xdr.c Wed Aug 19 16:16:04 1998
    @@ -5,6 +5,9 @@
    *
    * Copyright (C) 1992, 1993, 1994 Rick Sladkey
    * Copyright (C) 1996 Olaf Kirch
    + *
    + * 04 Aug 1998 Ion Badulescu <ionut@cs.columbia.edu>
    + * FIFO's need special handling in NFSv2
    */

    #define NFS_NEED_XDR_TYPES
    @@ -114,6 +117,11 @@
    fattr->mtime.useconds = ntohl(*p++);
    fattr->ctime.seconds = ntohl(*p++);
    fattr->ctime.useconds = ntohl(*p++);
    + if (fattr->type == NFCHR && fattr->rdev == NFS_FIFO_DEV) {
    + fattr->type = NFFIFO;
    + fattr->mode = (fattr->mode & ~S_IFMT) | S_IFIFO;
    + fattr->rdev = 0;
    + }
    return p;
    }


    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.rutgers.edu
    Please read the FAQ at http://www.tux.org/lkml/faq.html

    \
     
     \ /
      Last update: 2005-03-22 13:44    [W:0.023 / U:95.476 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site