X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=fs%2Flockd%2Fclntproc.c;h=31668b690e03d4e482a8affb7657a310cffac1c0;hb=7db9cbb3748c46b80e5c99ffa91945b8dd4ed5e5;hp=1f6dc518505c90b77e3bed2217f8d8de93f0803a;hpb=407d819cf0fd54c6fc1138a509225696aecafd15;p=linux-2.6 diff --git a/fs/lockd/clntproc.c b/fs/lockd/clntproc.c index 1f6dc51850..31668b690e 100644 --- a/fs/lockd/clntproc.c +++ b/fs/lockd/clntproc.c @@ -582,7 +582,15 @@ again: } if (status < 0) goto out_unlock; - status = nlm_stat_to_errno(resp->status); + /* + * EAGAIN doesn't make sense for sleeping locks, and in some + * cases NLM_LCK_DENIED is returned for a permanent error. So + * turn it into an ENOLCK. + */ + if (resp->status == nlm_lck_denied && (fl_flags & FL_SLEEP)) + status = -ENOLCK; + else + status = nlm_stat_to_errno(resp->status); out_unblock: nlmclnt_finish_block(block); out: