diff options
Diffstat (limited to 'fs/locks.c')
| -rw-r--r-- | fs/locks.c | 21 | 
1 files changed, 12 insertions, 9 deletions
diff --git a/fs/locks.c b/fs/locks.c index efad798824dc..6f99c0a6f836 100644 --- a/fs/locks.c +++ b/fs/locks.c  | |||
| @@ -446,15 +446,14 @@ static struct lock_manager_operations lease_manager_ops = { | |||
| 446 | */ | 446 | */ | 
| 447 | static int lease_init(struct file *filp, int type, struct file_lock *fl) | 447 | static int lease_init(struct file *filp, int type, struct file_lock *fl) | 
| 448 | { | 448 | { | 
| 449 | if (assign_type(fl, type) != 0) | ||
| 450 | return -EINVAL; | ||
| 451 | |||
| 449 | fl->fl_owner = current->files; | 452 | fl->fl_owner = current->files; | 
| 450 | fl->fl_pid = current->tgid; | 453 | fl->fl_pid = current->tgid; | 
| 451 | 454 | ||
| 452 | fl->fl_file = filp; | 455 | fl->fl_file = filp; | 
| 453 | fl->fl_flags = FL_LEASE; | 456 | fl->fl_flags = FL_LEASE; | 
| 454 | if (assign_type(fl, type) != 0) { | ||
| 455 | locks_free_lock(fl); | ||
| 456 | return -EINVAL; | ||
| 457 | } | ||
| 458 | fl->fl_start = 0; | 457 | fl->fl_start = 0; | 
| 459 | fl->fl_end = OFFSET_MAX; | 458 | fl->fl_end = OFFSET_MAX; | 
| 460 | fl->fl_ops = NULL; | 459 | fl->fl_ops = NULL; | 
| @@ -466,16 +465,19 @@ static int lease_init(struct file *filp, int type, struct file_lock *fl) | |||
| 466 | static int lease_alloc(struct file *filp, int type, struct file_lock **flp) | 465 | static int lease_alloc(struct file *filp, int type, struct file_lock **flp) | 
| 467 | { | 466 | { | 
| 468 | struct file_lock *fl = locks_alloc_lock(); | 467 | struct file_lock *fl = locks_alloc_lock(); | 
| 469 | int error; | 468 | int error = -ENOMEM; | 
| 470 | 469 | ||
| 471 | if (fl == NULL) | 470 | if (fl == NULL) | 
| 472 | return -ENOMEM; | 471 | goto out; | 
| 473 | 472 | ||
| 474 | error = lease_init(filp, type, fl); | 473 | error = lease_init(filp, type, fl); | 
| 475 | if (error) | 474 | if (error) { | 
| 476 | return error; | 475 | locks_free_lock(fl); | 
| 476 | fl = NULL; | ||
| 477 | } | ||
| 478 | out: | ||
| 477 | *flp = fl; | 479 | *flp = fl; | 
| 478 | return 0; | 480 | return error; | 
| 479 | } | 481 | } | 
| 480 | 482 | ||
| 481 | /* Check if two locks overlap each other. | 483 | /* Check if two locks overlap each other. | 
| @@ -1372,6 +1374,7 @@ static int __setlease(struct file *filp, long arg, struct file_lock **flp) | |||
| 1372 | goto out; | 1374 | goto out; | 
| 1373 | 1375 | ||
| 1374 | if (my_before != NULL) { | 1376 | if (my_before != NULL) { | 
| 1377 | *flp = *my_before; | ||
| 1375 | error = lease->fl_lmops->fl_change(my_before, arg); | 1378 | error = lease->fl_lmops->fl_change(my_before, arg); | 
| 1376 | goto out; | 1379 | goto out; | 
| 1377 | } | 1380 | } | 
