diff options
Diffstat (limited to 'fs/lockd/svclock.c')
| -rw-r--r-- | fs/lockd/svclock.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index cf0d5c2c318d..6063a8e4b9f3 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c | |||
| @@ -360,7 +360,7 @@ nlmsvc_defer_lock_rqst(struct svc_rqst *rqstp, struct nlm_block *block) | |||
| 360 | __be32 | 360 | __be32 |
| 361 | nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, | 361 | nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, |
| 362 | struct nlm_host *host, struct nlm_lock *lock, int wait, | 362 | struct nlm_host *host, struct nlm_lock *lock, int wait, |
| 363 | struct nlm_cookie *cookie) | 363 | struct nlm_cookie *cookie, int reclaim) |
| 364 | { | 364 | { |
| 365 | struct nlm_block *block = NULL; | 365 | struct nlm_block *block = NULL; |
| 366 | int error; | 366 | int error; |
| @@ -406,6 +406,15 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, | |||
| 406 | goto out; | 406 | goto out; |
| 407 | } | 407 | } |
| 408 | 408 | ||
| 409 | if (locks_in_grace() && !reclaim) { | ||
| 410 | ret = nlm_lck_denied_grace_period; | ||
| 411 | goto out; | ||
| 412 | } | ||
| 413 | if (reclaim && !locks_in_grace()) { | ||
| 414 | ret = nlm_lck_denied_grace_period; | ||
| 415 | goto out; | ||
| 416 | } | ||
| 417 | |||
| 409 | if (!wait) | 418 | if (!wait) |
| 410 | lock->fl.fl_flags &= ~FL_SLEEP; | 419 | lock->fl.fl_flags &= ~FL_SLEEP; |
| 411 | error = vfs_lock_file(file->f_file, F_SETLK, &lock->fl, NULL); | 420 | error = vfs_lock_file(file->f_file, F_SETLK, &lock->fl, NULL); |
| @@ -502,6 +511,10 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file, | |||
| 502 | goto out; | 511 | goto out; |
| 503 | } | 512 | } |
| 504 | 513 | ||
| 514 | if (locks_in_grace()) { | ||
| 515 | ret = nlm_lck_denied_grace_period; | ||
| 516 | goto out; | ||
| 517 | } | ||
| 505 | error = vfs_test_lock(file->f_file, &lock->fl); | 518 | error = vfs_test_lock(file->f_file, &lock->fl); |
| 506 | if (error == FILE_LOCK_DEFERRED) { | 519 | if (error == FILE_LOCK_DEFERRED) { |
| 507 | ret = nlmsvc_defer_lock_rqst(rqstp, block); | 520 | ret = nlmsvc_defer_lock_rqst(rqstp, block); |
| @@ -582,6 +595,9 @@ nlmsvc_cancel_blocked(struct nlm_file *file, struct nlm_lock *lock) | |||
| 582 | (long long)lock->fl.fl_start, | 595 | (long long)lock->fl.fl_start, |
| 583 | (long long)lock->fl.fl_end); | 596 | (long long)lock->fl.fl_end); |
| 584 | 597 | ||
| 598 | if (locks_in_grace()) | ||
| 599 | return nlm_lck_denied_grace_period; | ||
| 600 | |||
| 585 | mutex_lock(&file->f_mutex); | 601 | mutex_lock(&file->f_mutex); |
| 586 | block = nlmsvc_lookup_block(file, lock); | 602 | block = nlmsvc_lookup_block(file, lock); |
| 587 | mutex_unlock(&file->f_mutex); | 603 | mutex_unlock(&file->f_mutex); |
