down_write(&v9ses->rename_sem);
        if (v9fs_proto_dotl(v9ses)) {
-               retval = p9_client_rename(oldfid, newdirfid,
-                                       (char *) new_dentry->d_name.name);
-               if (retval != -ENOSYS)
+               retval = p9_client_renameat(olddirfid, old_dentry->d_name.name,
+                                           newdirfid, new_dentry->d_name.name);
+               if (retval == -EOPNOTSUPP)
+                       retval = p9_client_rename(oldfid, newdirfid,
+                                                 new_dentry->d_name.name);
+               if (retval != -EOPNOTSUPP)
                        goto clunk_newdir;
        }
        if (old_dentry->d_parent != new_dentry->d_parent) {
 
 };
 
 int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb);
-int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name);
+int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid,
+                    const char *name);
+int p9_client_renameat(struct p9_fid *olddirfid, const char *old_name,
+                      struct p9_fid *newdirfid, const char *new_name);
 struct p9_client *p9_client_create(const char *dev_name, char *options);
 void p9_client_destroy(struct p9_client *clnt);
 void p9_client_disconnect(struct p9_client *clnt);
 
 }
 EXPORT_SYMBOL(p9_client_statfs);
 
-int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name)
+int p9_client_rename(struct p9_fid *fid,
+                    struct p9_fid *newdirfid, const char *name)
 {
        int err;
        struct p9_req_t *req;
 }
 EXPORT_SYMBOL(p9_client_rename);
 
+int p9_client_renameat(struct p9_fid *olddirfid, const char *old_name,
+                      struct p9_fid *newdirfid, const char *new_name)
+{
+       int err;
+       struct p9_req_t *req;
+       struct p9_client *clnt;
+
+       err = 0;
+       clnt = olddirfid->clnt;
+
+       P9_DPRINTK(P9_DEBUG_9P, ">>> TRENAMEAT olddirfid %d old name %s"
+                  " newdirfid %d new name %s\n", olddirfid->fid, old_name,
+                  newdirfid->fid, new_name);
+
+       req = p9_client_rpc(clnt, P9_TRENAMEAT, "dsds", olddirfid->fid,
+                           old_name, newdirfid->fid, new_name);
+       if (IS_ERR(req)) {
+               err = PTR_ERR(req);
+               goto error;
+       }
+
+       P9_DPRINTK(P9_DEBUG_9P, "<<< RRENAMEAT newdirfid %d new name %s\n",
+                  newdirfid->fid, new_name);
+
+       p9_free_req(clnt, req);
+error:
+       return err;
+}
+EXPORT_SYMBOL(p9_client_renameat);
+
 /*
  * An xattrwalk without @attr_name gives the fid for the lisxattr namespace
  */