--- ./fs/nfs/dir.c.orig 2005-02-02 22:42:30.000000000 +0100 +++ ./fs/nfs/dir.c 2005-02-02 23:19:38.000000000 +0100 @@ -1176,6 +1176,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, @@ -1222,11 +1223,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); @@ -1420,6 +1421,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; /* @@ -1494,7 +1503,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/proc.c.orig 2005-02-02 22:44:49.000000000 +0100 +++ ./fs/nfs/proc.c 2005-02-02 23:15:19.000000000 +0100 @@ -350,7 +350,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), @@ -363,7 +364,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; } --- ./fs/nfs/nfs3proc.c.orig 2005-02-02 22:45:24.000000000 +0100 +++ ./fs/nfs/nfs3proc.c 2005-02-02 23:15:52.000000000 +0100 @@ -435,7 +435,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 = { @@ -455,7 +456,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-02-02 22:45:51.000000000 +0100 +++ ./fs/nfs/nfs4proc.c 2005-02-02 23:16:25.000000000 +0100 @@ -1455,7 +1455,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; --- ./include/linux/nfs_xdr.h.orig 2005-02-02 22:47:26.000000000 +0100 +++ ./include/linux/nfs_xdr.h 2005-02-02 23:16:51.000000000 +0100 @@ -688,7 +688,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 *,