--- ./fs/nfs/dir.c.orig 2005-06-12 23:02:51.000000000 +0200 +++ ./fs/nfs/dir.c 2005-06-12 23:04:31.000000000 +0200 @@ -1128,6 +1128,7 @@ struct qstr qsilly; struct dentry *sdentry; int error = -EIO; + struct rpc_groups fsg = { 1, { dir->i_gid } }; dfprintk(VFS, "NFS: silly-rename(%s/%s, ct=%d)\n", dentry->d_parent->d_name.name, dentry->d_name.name, @@ -1174,11 +1175,11 @@ if (dentry->d_inode) { nfs_begin_data_update(dentry->d_inode); error = NFS_PROTO(dir)->rename(dir, &dentry->d_name, - dir, &qsilly); + dir, &qsilly, &fsg); nfs_end_data_update(dentry->d_inode); } else error = NFS_PROTO(dir)->rename(dir, &dentry->d_name, - dir, &qsilly); + dir, &qsilly, &fsg); nfs_end_data_update(dir); if (!error) { nfs_renew_times(dentry); @@ -1372,6 +1373,14 @@ struct inode *old_inode = old_dentry->d_inode; struct inode *new_inode = new_dentry->d_inode; struct dentry *dentry = NULL, *rehash = NULL; + struct rpc_groups fsg = { + .ngroups = 3, + .groups = { + old_dir->i_gid, + new_dir->i_gid, /* old_dir != new_dir */ + old_inode->i_gid /* reparent a dir */ + } + }; int error = -EBUSY; /* @@ -1444,7 +1453,7 @@ nfs_begin_data_update(new_dir); nfs_begin_data_update(old_inode); error = NFS_PROTO(old_dir)->rename(old_dir, &old_dentry->d_name, - new_dir, &new_dentry->d_name); + new_dir, &new_dentry->d_name, &fsg); nfs_end_data_update(old_inode); nfs_end_data_update(new_dir); nfs_end_data_update(old_dir); --- ./fs/nfs/nfs3proc.c.orig 2005-06-12 23:02:51.000000000 +0200 +++ ./fs/nfs/nfs3proc.c 2005-06-12 23:04:31.000000000 +0200 @@ -418,7 +418,8 @@ static int nfs3_proc_rename(struct inode *old_dir, struct qstr *old_name, - struct inode *new_dir, struct qstr *new_name) + struct inode *new_dir, struct qstr *new_name, + struct rpc_groups *fsg) { struct nfs_fattr old_dir_attr, new_dir_attr; struct nfs3_renameargs arg = { @@ -438,7 +439,7 @@ dprintk("NFS call rename %s -> %s\n", old_name->name, new_name->name); old_dir_attr.valid = 0; new_dir_attr.valid = 0; - status = nfs3_rpc(NFS_CLIENT(old_dir), NFS3PROC_RENAME, &arg, &res); + status = nfs3_rpc(NFS_CLIENT(old_dir), NFS3PROC_RENAME, &arg, &res, fsg); nfs_refresh_inode(old_dir, &old_dir_attr); nfs_refresh_inode(new_dir, &new_dir_attr); dprintk("NFS reply rename: %d\n", status); --- ./fs/nfs/nfs4proc.c.orig 2005-06-12 23:02:51.000000000 +0200 +++ ./fs/nfs/nfs4proc.c 2005-06-12 23:04:31.000000000 +0200 @@ -1567,7 +1567,8 @@ } static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name, - struct inode *new_dir, struct qstr *new_name) + struct inode *new_dir, struct qstr *new_name, + struct rpc_groups *fsg) { struct nfs4_exception exception = { }; int err; --- ./fs/nfs/proc.c.orig 2005-06-12 23:02:51.000000000 +0200 +++ ./fs/nfs/proc.c 2005-06-12 23:04:31.000000000 +0200 @@ -348,7 +348,8 @@ static int nfs_proc_rename(struct inode *old_dir, struct qstr *old_name, - struct inode *new_dir, struct qstr *new_name) + struct inode *new_dir, struct qstr *new_name, + struct rpc_groups *fsg) { struct nfs_renameargs arg = { .fromfh = NFS_FH(old_dir), @@ -361,7 +362,7 @@ int status; dprintk("NFS call rename %s -> %s\n", old_name->name, new_name->name); - status = nfs2_rpc(NFS_CLIENT(old_dir), NFSPROC_RENAME, &arg, NULL); + status = nfs2_rpc(NFS_CLIENT(old_dir), NFSPROC_RENAME, &arg, NULL, fsg); dprintk("NFS reply rename: %d\n", status); return status; } --- ./include/linux/nfs_xdr.h.orig 2005-06-12 23:03:24.000000000 +0200 +++ ./include/linux/nfs_xdr.h 2005-06-12 23:04:31.000000000 +0200 @@ -689,7 +689,7 @@ struct dentry *, struct qstr *); int (*unlink_done) (struct dentry *, struct rpc_task *); int (*rename) (struct inode *, struct qstr *, - struct inode *, struct qstr *); + struct inode *, struct qstr *, struct rpc_groups *); int (*link) (struct inode *, struct inode *, struct qstr *, struct rpc_groups *); int (*symlink) (struct inode *, struct qstr *, struct qstr *,