lockd: don't attempt blocking locks on nfs reexports
As in the v4 case, it doesn't work well to block waiting for a lock on an nfs filesystem. As in the v4 case, that means we're depending on the client to poll. It's probably incorrect to depend on that, but I *think* clients do poll in practice. In any case, it's an improvement over hanging the lockd thread indefinitely as we currently are. Signed-off-by: J. Bruce Fields <bfields@redhat.com> Acked-by: Anna Schumaker <Anna.Schumaker@Netapp.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
Родитель
f657f8eef3
Коммит
b840be2f00
|
@ -31,6 +31,7 @@
|
|||
#include <linux/lockd/nlm.h>
|
||||
#include <linux/lockd/lockd.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/exportfs.h>
|
||||
|
||||
#define NLMDBG_FACILITY NLMDBG_SVCLOCK
|
||||
|
||||
|
@ -470,18 +471,24 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
|
|||
struct nlm_cookie *cookie, int reclaim)
|
||||
{
|
||||
struct nlm_block *block = NULL;
|
||||
struct inode *inode = nlmsvc_file_inode(file);
|
||||
int error;
|
||||
int mode;
|
||||
int async_block = 0;
|
||||
__be32 ret;
|
||||
|
||||
dprintk("lockd: nlmsvc_lock(%s/%ld, ty=%d, pi=%d, %Ld-%Ld, bl=%d)\n",
|
||||
nlmsvc_file_inode(file)->i_sb->s_id,
|
||||
nlmsvc_file_inode(file)->i_ino,
|
||||
inode->i_sb->s_id, inode->i_ino,
|
||||
lock->fl.fl_type, lock->fl.fl_pid,
|
||||
(long long)lock->fl.fl_start,
|
||||
(long long)lock->fl.fl_end,
|
||||
wait);
|
||||
|
||||
if (inode->i_sb->s_export_op->flags & EXPORT_OP_SYNC_LOCKS) {
|
||||
async_block = wait;
|
||||
wait = 0;
|
||||
}
|
||||
|
||||
/* Lock file against concurrent access */
|
||||
mutex_lock(&file->f_mutex);
|
||||
/* Get existing block (in case client is busy-waiting)
|
||||
|
@ -542,7 +549,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
|
|||
*/
|
||||
if (wait)
|
||||
break;
|
||||
ret = nlm_lck_denied;
|
||||
ret = async_block ? nlm_lck_blocked : nlm_lck_denied;
|
||||
goto out;
|
||||
case FILE_LOCK_DEFERRED:
|
||||
if (wait)
|
||||
|
|
Загрузка…
Ссылка в новой задаче