@@ -3850,10 +3850,17 @@ static void wake_lock_waiters(struct rbd_device *rbd_dev, int result)
3850
3850
list_splice_tail_init (& rbd_dev -> acquiring_list , & rbd_dev -> running_list );
3851
3851
}
3852
3852
3853
- static int get_lock_owner_info (struct rbd_device * rbd_dev ,
3854
- struct ceph_locker * * lockers , u32 * num_lockers )
3853
+ static void free_locker (struct ceph_locker * locker )
3854
+ {
3855
+ if (locker )
3856
+ ceph_free_lockers (locker , 1 );
3857
+ }
3858
+
3859
+ static struct ceph_locker * get_lock_owner_info (struct rbd_device * rbd_dev )
3855
3860
{
3856
3861
struct ceph_osd_client * osdc = & rbd_dev -> rbd_client -> client -> osdc ;
3862
+ struct ceph_locker * lockers ;
3863
+ u32 num_lockers ;
3857
3864
u8 lock_type ;
3858
3865
char * lock_tag ;
3859
3866
int ret ;
@@ -3862,39 +3869,45 @@ static int get_lock_owner_info(struct rbd_device *rbd_dev,
3862
3869
3863
3870
ret = ceph_cls_lock_info (osdc , & rbd_dev -> header_oid ,
3864
3871
& rbd_dev -> header_oloc , RBD_LOCK_NAME ,
3865
- & lock_type , & lock_tag , lockers , num_lockers );
3866
- if (ret )
3867
- return ret ;
3872
+ & lock_type , & lock_tag , & lockers , & num_lockers );
3873
+ if (ret ) {
3874
+ rbd_warn (rbd_dev , "failed to retrieve lockers: %d" , ret );
3875
+ return ERR_PTR (ret );
3876
+ }
3868
3877
3869
- if (* num_lockers == 0 ) {
3878
+ if (num_lockers == 0 ) {
3870
3879
dout ("%s rbd_dev %p no lockers detected\n" , __func__ , rbd_dev );
3880
+ lockers = NULL ;
3871
3881
goto out ;
3872
3882
}
3873
3883
3874
3884
if (strcmp (lock_tag , RBD_LOCK_TAG )) {
3875
3885
rbd_warn (rbd_dev , "locked by external mechanism, tag %s" ,
3876
3886
lock_tag );
3877
- ret = - EBUSY ;
3878
- goto out ;
3887
+ goto err_busy ;
3879
3888
}
3880
3889
3881
3890
if (lock_type == CEPH_CLS_LOCK_SHARED ) {
3882
3891
rbd_warn (rbd_dev , "shared lock type detected" );
3883
- ret = - EBUSY ;
3884
- goto out ;
3892
+ goto err_busy ;
3885
3893
}
3886
3894
3887
- if (strncmp ((* lockers )[0 ].id .cookie , RBD_LOCK_COOKIE_PREFIX ,
3895
+ WARN_ON (num_lockers != 1 );
3896
+ if (strncmp (lockers [0 ].id .cookie , RBD_LOCK_COOKIE_PREFIX ,
3888
3897
strlen (RBD_LOCK_COOKIE_PREFIX ))) {
3889
3898
rbd_warn (rbd_dev , "locked by external mechanism, cookie %s" ,
3890
- (* lockers )[0 ].id .cookie );
3891
- ret = - EBUSY ;
3892
- goto out ;
3899
+ lockers [0 ].id .cookie );
3900
+ goto err_busy ;
3893
3901
}
3894
3902
3895
3903
out :
3896
3904
kfree (lock_tag );
3897
- return ret ;
3905
+ return lockers ;
3906
+
3907
+ err_busy :
3908
+ kfree (lock_tag );
3909
+ ceph_free_lockers (lockers , num_lockers );
3910
+ return ERR_PTR (- EBUSY );
3898
3911
}
3899
3912
3900
3913
static int find_watcher (struct rbd_device * rbd_dev ,
@@ -3948,51 +3961,56 @@ static int find_watcher(struct rbd_device *rbd_dev,
3948
3961
static int rbd_try_lock (struct rbd_device * rbd_dev )
3949
3962
{
3950
3963
struct ceph_client * client = rbd_dev -> rbd_client -> client ;
3951
- struct ceph_locker * lockers ;
3952
- u32 num_lockers ;
3964
+ struct ceph_locker * locker ;
3953
3965
int ret ;
3954
3966
3955
3967
for (;;) {
3968
+ locker = NULL ;
3969
+
3956
3970
ret = rbd_lock (rbd_dev );
3957
3971
if (ret != - EBUSY )
3958
- return ret ;
3972
+ goto out ;
3959
3973
3960
3974
/* determine if the current lock holder is still alive */
3961
- ret = get_lock_owner_info (rbd_dev , & lockers , & num_lockers );
3962
- if (ret )
3963
- return ret ;
3964
-
3965
- if (num_lockers == 0 )
3975
+ locker = get_lock_owner_info (rbd_dev );
3976
+ if (IS_ERR (locker )) {
3977
+ ret = PTR_ERR (locker );
3978
+ locker = NULL ;
3979
+ goto out ;
3980
+ }
3981
+ if (!locker )
3966
3982
goto again ;
3967
3983
3968
- ret = find_watcher (rbd_dev , lockers );
3984
+ ret = find_watcher (rbd_dev , locker );
3969
3985
if (ret )
3970
3986
goto out ; /* request lock or error */
3971
3987
3972
3988
rbd_warn (rbd_dev , "breaking header lock owned by %s%llu" ,
3973
- ENTITY_NAME (lockers [ 0 ]. id .name ));
3989
+ ENTITY_NAME (locker -> id .name ));
3974
3990
3975
3991
ret = ceph_monc_blocklist_add (& client -> monc ,
3976
- & lockers [ 0 ]. info .addr );
3992
+ & locker -> info .addr );
3977
3993
if (ret ) {
3978
- rbd_warn (rbd_dev , "blocklist of %s%llu failed : %d" ,
3979
- ENTITY_NAME (lockers [ 0 ]. id .name ), ret );
3994
+ rbd_warn (rbd_dev , "failed to blocklist %s%llu: %d" ,
3995
+ ENTITY_NAME (locker -> id .name ), ret );
3980
3996
goto out ;
3981
3997
}
3982
3998
3983
3999
ret = ceph_cls_break_lock (& client -> osdc , & rbd_dev -> header_oid ,
3984
4000
& rbd_dev -> header_oloc , RBD_LOCK_NAME ,
3985
- lockers [0 ].id .cookie ,
3986
- & lockers [0 ].id .name );
3987
- if (ret && ret != - ENOENT )
4001
+ locker -> id .cookie , & locker -> id .name );
4002
+ if (ret && ret != - ENOENT ) {
4003
+ rbd_warn (rbd_dev , "failed to break header lock: %d" ,
4004
+ ret );
3988
4005
goto out ;
4006
+ }
3989
4007
3990
4008
again :
3991
- ceph_free_lockers ( lockers , num_lockers );
4009
+ free_locker ( locker );
3992
4010
}
3993
4011
3994
4012
out :
3995
- ceph_free_lockers ( lockers , num_lockers );
4013
+ free_locker ( locker );
3996
4014
return ret ;
3997
4015
}
3998
4016
0 commit comments