--- ./fs/nfs/dir.c.orig 2005-02-02 21:43:21.000000000 +0100 +++ ./fs/nfs/dir.c 2005-02-02 21:43:59.000000000 +0100 @@ -1364,6 +1364,7 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) { struct inode *inode = old_dentry->d_inode; + struct rpc_groups fsg = { 1, { dir->i_gid } }; int error; dfprintk(VFS, "NFS: link(%s/%s -> %s/%s)\n", @@ -1380,7 +1381,7 @@ nfs_begin_data_update(dir); nfs_begin_data_update(inode); - error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name); + error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name, &fsg); nfs_end_data_update(inode); nfs_end_data_update(dir); unlock_kernel(); --- ./fs/nfs/proc.c.orig 2005-02-02 21:43:23.000000000 +0100 +++ ./fs/nfs/proc.c 2005-02-02 21:43:59.000000000 +0100 @@ -368,7 +368,8 @@ } static int -nfs_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) +nfs_proc_link(struct inode *inode, struct inode *dir, struct qstr *name, + struct rpc_groups *fsg) { struct nfs_linkargs arg = { .fromfh = NFS_FH(inode), @@ -379,7 +380,7 @@ int status; dprintk("NFS call link %s\n", name->name); - status = nfs2_rpc(NFS_CLIENT(inode), NFSPROC_LINK, &arg, NULL); + status = nfs2_rpc(NFS_CLIENT(inode), NFSPROC_LINK, &arg, NULL, fsg); dprintk("NFS reply link: %d\n", status); return status; } --- ./fs/nfs/nfs3proc.c.orig 2005-02-02 21:43:24.000000000 +0100 +++ ./fs/nfs/nfs3proc.c 2005-02-02 21:43:59.000000000 +0100 @@ -463,7 +463,8 @@ } static int -nfs3_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) +nfs3_proc_link(struct inode *inode, struct inode *dir, struct qstr *name, + struct rpc_groups *fsg) { struct nfs_fattr dir_attr, fattr; struct nfs3_linkargs arg = { @@ -481,7 +482,7 @@ dprintk("NFS call link %s\n", name->name); dir_attr.valid = 0; fattr.valid = 0; - status = nfs3_rpc(NFS_CLIENT(inode), NFS3PROC_LINK, &arg, &res); + status = nfs3_rpc(NFS_CLIENT(inode), NFS3PROC_LINK, &arg, &res, fsg); nfs_refresh_inode(dir, &dir_attr); nfs_refresh_inode(inode, &fattr); dprintk("NFS reply link: %d\n", status); --- ./fs/nfs/nfs4proc.c.orig 2005-02-02 21:43:25.000000000 +0100 +++ ./fs/nfs/nfs4proc.c 2005-02-02 21:43:59.000000000 +0100 @@ -1489,7 +1489,8 @@ return status; } -static int nfs4_proc_link(struct inode *inode, struct inode *dir, struct qstr *name) +static int nfs4_proc_link(struct inode *inode, struct inode *dir, + struct qstr *name, struct rpc_groups *fsg) { struct nfs4_exception exception = { }; int err; --- ./include/linux/nfs_xdr.h.orig 2005-02-02 21:43:26.000000000 +0100 +++ ./include/linux/nfs_xdr.h 2005-02-02 21:44:08.000000000 +0100 @@ -689,7 +689,8 @@ int (*unlink_done) (struct dentry *, struct rpc_task *); int (*rename) (struct inode *, struct qstr *, struct inode *, struct qstr *); - int (*link) (struct inode *, struct inode *, struct qstr *); + int (*link) (struct inode *, struct inode *, struct qstr *, + struct rpc_groups *); int (*symlink) (struct inode *, struct qstr *, struct qstr *, struct iattr *, struct nfs_fh *, struct nfs_fattr *);