diff options
| -rw-r--r-- | fs/dlm/device.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/fs/dlm/device.c b/fs/dlm/device.c index 99d8b6b07fba..5da4b2ed988d 100644 --- a/fs/dlm/device.c +++ b/fs/dlm/device.c | |||
| @@ -79,7 +79,7 @@ struct lock_info { | |||
| 79 | struct list_head li_ownerqueue; | 79 | struct list_head li_ownerqueue; |
| 80 | struct file_info *li_file; | 80 | struct file_info *li_file; |
| 81 | struct dlm_lksb __user *li_user_lksb; | 81 | struct dlm_lksb __user *li_user_lksb; |
| 82 | struct semaphore li_firstlock; | 82 | struct completion li_firstcomp; |
| 83 | }; | 83 | }; |
| 84 | 84 | ||
| 85 | /* A queued AST no less */ | 85 | /* A queued AST no less */ |
| @@ -376,8 +376,7 @@ static void ast_routine(void *param) | |||
| 376 | li->li_lksb.sb_status != 0) { | 376 | li->li_lksb.sb_status != 0) { |
| 377 | 377 | ||
| 378 | /* Wait till dlm_lock() has finished */ | 378 | /* Wait till dlm_lock() has finished */ |
| 379 | down(&li->li_firstlock); | 379 | wait_for_completion(&li->li_firstcomp); |
| 380 | up(&li->li_firstlock); | ||
| 381 | 380 | ||
| 382 | spin_lock(&li->li_file->fi_li_lock); | 381 | spin_lock(&li->li_file->fi_li_lock); |
| 383 | list_del(&li->li_ownerqueue); | 382 | list_del(&li->li_ownerqueue); |
| @@ -808,10 +807,10 @@ static int do_user_lock(struct file_info *fi, uint8_t cmd, | |||
| 808 | li->li_castaddr = kparams->castaddr; | 807 | li->li_castaddr = kparams->castaddr; |
| 809 | li->li_castparam = kparams->castparam; | 808 | li->li_castparam = kparams->castparam; |
| 810 | 809 | ||
| 811 | /* OK, this isn;t exactly a FIRSTLOCK but it is the | 810 | /* OK, this isn't exactly a FIRSTLOCK but it is the |
| 812 | first time we've used this lockinfo, and if things | 811 | first time we've used this lockinfo, and if things |
| 813 | fail we want rid of it */ | 812 | fail we want rid of it */ |
| 814 | init_MUTEX_LOCKED(&li->li_firstlock); | 813 | init_completion(&li->li_firstcomp); |
| 815 | set_bit(LI_FLAG_FIRSTLOCK, &li->li_flags); | 814 | set_bit(LI_FLAG_FIRSTLOCK, &li->li_flags); |
| 816 | add_lockinfo(li); | 815 | add_lockinfo(li); |
| 817 | 816 | ||
| @@ -839,10 +838,10 @@ static int do_user_lock(struct file_info *fi, uint8_t cmd, | |||
| 839 | if (!li) | 838 | if (!li) |
| 840 | return -ENOMEM; | 839 | return -ENOMEM; |
| 841 | 840 | ||
| 842 | /* semaphore to allow us to complete our work before | 841 | /* Allow us to complete our work before |
| 843 | the AST routine runs. In fact we only need (and use) this | 842 | the AST routine runs. In fact we only need (and use) this |
| 844 | when the initial lock fails */ | 843 | when the initial lock fails */ |
| 845 | init_MUTEX_LOCKED(&li->li_firstlock); | 844 | init_completion(&li->li_firstcomp); |
| 846 | set_bit(LI_FLAG_FIRSTLOCK, &li->li_flags); | 845 | set_bit(LI_FLAG_FIRSTLOCK, &li->li_flags); |
| 847 | } | 846 | } |
| 848 | 847 | ||
| @@ -892,7 +891,7 @@ static int do_user_lock(struct file_info *fi, uint8_t cmd, | |||
| 892 | if (add_lockinfo(li)) | 891 | if (add_lockinfo(li)) |
| 893 | printk(KERN_WARNING "Add lockinfo failed\n"); | 892 | printk(KERN_WARNING "Add lockinfo failed\n"); |
| 894 | 893 | ||
| 895 | up(&li->li_firstlock); | 894 | complete(&li->li_firstcomp); |
| 896 | } | 895 | } |
| 897 | 896 | ||
| 898 | /* Return the lockid as the user needs it /now/ */ | 897 | /* Return the lockid as the user needs it /now/ */ |
| @@ -936,8 +935,7 @@ static int do_user_unlock(struct file_info *fi, uint8_t cmd, | |||
| 936 | 935 | ||
| 937 | /* Wait until dlm_lock() has completed */ | 936 | /* Wait until dlm_lock() has completed */ |
| 938 | if (!test_bit(LI_FLAG_ONLIST, &li->li_flags)) { | 937 | if (!test_bit(LI_FLAG_ONLIST, &li->li_flags)) { |
| 939 | down(&li->li_firstlock); | 938 | wait_for_completion(&li->li_firstcomp); |
| 940 | up(&li->li_firstlock); | ||
| 941 | } | 939 | } |
| 942 | 940 | ||
| 943 | /* dlm_unlock() passes a 0 for castaddr which means don't overwrite | 941 | /* dlm_unlock() passes a 0 for castaddr which means don't overwrite |
