X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=nfs3%2Fnfs3.c;h=b0e5892b6e221b5e8a92e18446bd67fb71c5baa7;hb=da94a353dc1bfa08450ba5ed8bac5a1d89703a3d;hp=818cd4b8f838a292bac716872393940b0a69b7a5;hpb=105feb97ef2173d6ea45df177599be6d4592640b;p=bluesky.git diff --git a/nfs3/nfs3.c b/nfs3/nfs3.c index 818cd4b..b0e5892 100644 --- a/nfs3/nfs3.c +++ b/nfs3/nfs3.c @@ -754,17 +754,22 @@ void nfsproc3_rename_3_svc(rename3args *argp, RPCRequest *req) async_rpc_send_reply(req, &result); return; } - g_mutex_lock(dir1->lock); - encode_pre_wcc(wcc1, dir1); BlueSkyInode *dir2 = lookup_fh(req, &argp->to.dir); if (dir2 == NULL) { result.status = NFS3ERR_STALE; - g_mutex_unlock(dir1->lock); async_rpc_send_reply(req, &result); return; } - g_mutex_lock(dir2->lock); + + if (dir1->inum < dir2->inum) { + g_mutex_lock(dir1->lock); + g_mutex_lock(dir2->lock); + } else if (dir1->inum > dir2->inum) { + g_mutex_lock(dir2->lock); + g_mutex_lock(dir1->lock); + } + encode_pre_wcc(wcc1, dir1); encode_pre_wcc(wcc2, dir1); gboolean status = bluesky_rename(dir1, argp->from.name, @@ -780,8 +785,9 @@ void nfsproc3_rename_3_svc(rename3args *argp, RPCRequest *req) else result.status = NFS3ERR_PERM; - g_mutex_unlock(dir2->lock); g_mutex_unlock(dir1->lock); + if (dir1->inum != dir2->inum) + g_mutex_unlock(dir2->lock); async_rpc_send_reply(req, &result); } @@ -1097,7 +1103,7 @@ void nfsproc3_commit_3_svc(commit3args *argp, RPCRequest *req) commit3res result; memset(&result, 0, sizeof(result)); - result.status = NFS3ERR_NOTSUPP; + result.status = NFS3_OK; BlueSkyInode *inode = lookup_fh(req, &argp->file); if (inode == NULL) {