--- ./fs/nfs/dir.c.orig 2005-06-12 22:47:06.000000000 +0200 +++ ./fs/nfs/dir.c 2005-06-12 22:52:13.000000000 +0200 @@ -1101,13 +1101,14 @@ static int nfs_rmdir(struct inode *dir, struct dentry *dentry) { int error; + struct rpc_groups fsg = { 1, { dir->i_gid } }; dfprintk(VFS, "NFS: rmdir(%s/%ld, %s\n", dir->i_sb->s_id, dir->i_ino, dentry->d_name.name); lock_kernel(); nfs_begin_data_update(dir); - error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name); + error = NFS_PROTO(dir)->rmdir(dir, &dentry->d_name, &fsg); /* Ensure the VFS deletes this inode */ if (error == 0 && dentry->d_inode != NULL) dentry->d_inode->i_nlink = 0; @@ -1202,6 +1203,7 @@ { struct inode *dir = dentry->d_parent->d_inode; struct inode *inode = dentry->d_inode; + struct rpc_groups fsg = { 1, { dir->i_gid } }; int error = -EBUSY; dfprintk(VFS, "NFS: safe_remove(%s/%s)\n", @@ -1216,13 +1218,13 @@ nfs_begin_data_update(dir); if (inode != NULL) { nfs_begin_data_update(inode); - error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); + error = NFS_PROTO(dir)->remove(dir, &dentry->d_name, &fsg); /* The VFS may want to delete this inode */ if (error == 0) inode->i_nlink--; nfs_end_data_update(inode); } else - error = NFS_PROTO(dir)->remove(dir, &dentry->d_name); + error = NFS_PROTO(dir)->remove(dir, &dentry->d_name, &fsg); nfs_end_data_update(dir); out: return error; --- ./fs/nfs/nfs3proc.c.orig 2005-06-12 22:47:06.000000000 +0200 +++ ./fs/nfs/nfs3proc.c 2005-06-12 22:52:13.000000000 +0200 @@ -361,7 +361,7 @@ } static int -nfs3_proc_remove(struct inode *dir, struct qstr *name) +nfs3_proc_remove(struct inode *dir, struct qstr *name, struct rpc_groups *fsg) { struct nfs_fattr dir_attr; struct nfs3_diropargs arg = { @@ -373,7 +373,7 @@ dprintk("NFS call remove %s\n", name->name); dir_attr.valid = 0; - status = nfs3_rpc(NFS_CLIENT(dir), NFS3PROC_REMOVE, &arg, &dir_attr); + status = nfs3_rpc(NFS_CLIENT(dir), NFS3PROC_REMOVE, &arg, &dir_attr, fsg); nfs_refresh_inode(dir, &dir_attr); dprintk("NFS reply remove: %d\n", status); return status; @@ -535,7 +535,7 @@ } static int -nfs3_proc_rmdir(struct inode *dir, struct qstr *name) +nfs3_proc_rmdir(struct inode *dir, struct qstr *name, struct rpc_groups *fsg) { struct nfs_fattr dir_attr; struct nfs3_diropargs arg = { @@ -547,7 +547,7 @@ dprintk("NFS call rmdir %s\n", name->name); dir_attr.valid = 0; - status = nfs3_rpc(NFS_CLIENT(dir), NFS3PROC_RMDIR, &arg, &dir_attr); + status = nfs3_rpc(NFS_CLIENT(dir), NFS3PROC_RMDIR, &arg, &dir_attr, fsg); nfs_refresh_inode(dir, &dir_attr); dprintk("NFS reply rmdir: %d\n", status); return status; --- ./fs/nfs/nfs4proc.c.orig 2005-06-12 22:47:06.000000000 +0200 +++ ./fs/nfs/nfs4proc.c 2005-06-12 22:52:13.000000000 +0200 @@ -1489,7 +1489,8 @@ return status; } -static int nfs4_proc_remove(struct inode *dir, struct qstr *name) +static int nfs4_proc_remove(struct inode *dir, struct qstr *name, + struct rpc_groups *fsg) { struct nfs4_exception exception = { }; int err; --- ./fs/nfs/proc.c.orig 2005-06-12 22:47:06.000000000 +0200 +++ ./fs/nfs/proc.c 2005-06-12 22:52:13.000000000 +0200 @@ -304,7 +304,7 @@ } static int -nfs_proc_remove(struct inode *dir, struct qstr *name) +nfs_proc_remove(struct inode *dir, struct qstr *name, struct rpc_groups *fsg) { struct nfs_diropargs arg = { .fh = NFS_FH(dir), @@ -314,7 +314,7 @@ int status; dprintk("NFS call remove %s\n", name->name); - status = nfs2_rpc(NFS_CLIENT(dir), NFSPROC_REMOVE, &arg, NULL); + status = nfs2_rpc(NFS_CLIENT(dir), NFSPROC_REMOVE, &arg, NULL, fsg); dprintk("NFS reply remove: %d\n", status); return status; @@ -437,7 +437,7 @@ } static int -nfs_proc_rmdir(struct inode *dir, struct qstr *name) +nfs_proc_rmdir(struct inode *dir, struct qstr *name, struct rpc_groups *fsg) { struct nfs_diropargs arg = { .fh = NFS_FH(dir), @@ -447,7 +447,7 @@ int status; dprintk("NFS call rmdir %s\n", name->name); - status = nfs2_rpc(NFS_CLIENT(dir), NFSPROC_RMDIR, &arg, NULL); + status = nfs2_rpc(NFS_CLIENT(dir), NFSPROC_RMDIR, &arg, NULL, fsg); dprintk("NFS reply rmdir: %d\n", status); return status; } --- ./fs/nfs/unlink.c.orig 2005-06-12 16:05:02.000000000 +0200 +++ ./fs/nfs/unlink.c 2005-06-12 22:58:58.000000000 +0200 @@ -167,7 +167,12 @@ goto out; memset(data, 0, sizeof(*data)); - data->cred = rpcauth_lookupcred(clnt->cl_auth, NULL, 0); + if (NFS_PROTO(dir->d_inode)->version > 3) + data->cred = rpcauth_lookupcred(clnt->cl_auth, NULL, 0); + else { + struct rpc_groups fsg = { 1, { dir->d_inode->i_gid } }; + data->cred = rpcauth_lookupcred(clnt->cl_auth, &fsg, 0); + } if (IS_ERR(data->cred)) { status = PTR_ERR(data->cred); goto out_free; --- ./include/linux/nfs_xdr.h.orig 2005-06-12 22:47:06.000000000 +0200 +++ ./include/linux/nfs_xdr.h 2005-06-12 22:59:49.000000000 +0200 @@ -684,7 +684,7 @@ int (*commit) (struct nfs_write_data *); int (*create) (struct inode *, struct dentry *, struct iattr *, int, struct rpc_groups *); - int (*remove) (struct inode *, struct qstr *); + int (*remove) (struct inode *, struct qstr *, struct rpc_groups *); int (*unlink_setup) (struct rpc_message *, struct dentry *, struct qstr *); int (*unlink_done) (struct dentry *, struct rpc_task *); @@ -697,7 +697,7 @@ struct nfs_fattr *); int (*mkdir) (struct inode *, struct dentry *, struct iattr *, struct rpc_groups *); - int (*rmdir) (struct inode *, struct qstr *); + int (*rmdir) (struct inode *, struct qstr *, struct rpc_groups *); int (*readdir) (struct dentry *, struct rpc_cred *, u64, struct page *, unsigned int, int); int (*mknod) (struct inode *, struct dentry *, struct iattr *,