diff options
author | Volker Lendecke <vl@samba.org> | 2011-01-21 10:30:13 +0100 |
---|---|---|
committer | Volker Lendecke <vlendec@samba.org> | 2011-01-21 12:29:21 +0100 |
commit | 1b373d6044e56f3678c42dae2c03825ef761cabc (patch) | |
tree | 5608ce6592342edd28a741df65d34eb300f28b1d | |
parent | 8db3258983bcf4ad73679a5bd5a554adc062a324 (diff) | |
download | samba-1b373d6044e56f3678c42dae2c03825ef761cabc.tar.gz samba-1b373d6044e56f3678c42dae2c03825ef761cabc.tar.bz2 samba-1b373d6044e56f3678c42dae2c03825ef761cabc.zip |
s3: Fix a deadlock between smbd and ctdbd
Do the notification after we released the share mode lock. Inside notify_fname
we take out another tdb lock. With ctdb also accessing our databases, this can
lead to deadlocks. Putting this notify after the TALLOC_FREE(lck) above we
avoid locking two records simultaneously. Notifies are async and informational
only, so calling the notify_fname without holding the share mode lock should
not do any harm.
Autobuild-User: Volker Lendecke <vlendec@samba.org>
Autobuild-Date: Fri Jan 21 12:29:21 CET 2011 on sn-devel-104
-rw-r--r-- | source3/smbd/close.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 00bcef0a71..a6610e58f1 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -473,10 +473,6 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, status = map_nt_error_from_unix(errno); } - notify_fname(conn, NOTIFY_ACTION_REMOVED, - FILE_NOTIFY_CHANGE_FILE_NAME, - fsp->fsp_name->base_name); - /* As we now have POSIX opens which can unlink * with other open files we may have taken * this code path with more than one share mode @@ -495,6 +491,24 @@ static NTSTATUS close_remove_share_mode(files_struct *fsp, } TALLOC_FREE(lck); + + if (delete_file) { + /* + * Do the notification after we released the share + * mode lock. Inside notify_fname we take out another + * tdb lock. With ctdb also accessing our databases, + * this can lead to deadlocks. Putting this notify + * after the TALLOC_FREE(lck) above we avoid locking + * two records simultaneously. Notifies are async and + * informational only, so calling the notify_fname + * without holding the share mode lock should not do + * any harm. + */ + notify_fname(conn, NOTIFY_ACTION_REMOVED, + FILE_NOTIFY_CHANGE_FILE_NAME, + fsp->fsp_name->base_name); + } + return status; } |