diff options
author | Jeremy Allison <jra@samba.org> | 2005-10-27 23:30:25 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:05:13 -0500 |
commit | c0dad16e0ff95a800dfbe11ca3c6303d882687a9 (patch) | |
tree | 3afc606e14da0f86c12c645e65c0f3e4fd4da57b | |
parent | 533da83852b13c2e008938a026f99937ef320f3c (diff) | |
download | samba-c0dad16e0ff95a800dfbe11ca3c6303d882687a9.tar.gz samba-c0dad16e0ff95a800dfbe11ca3c6303d882687a9.tar.bz2 samba-c0dad16e0ff95a800dfbe11ca3c6303d882687a9.zip |
r11344: I don't think share mode conflicts occur on deleting
a directory when you've got permissions. Need to write
a smbtorture test for this.
Jeremy.
(This used to be commit e959a5be393eb59b8987eb6967a2ee5d11978f41)
-rw-r--r-- | source3/smbd/close.c | 23 | ||||
-rw-r--r-- | source3/smbd/notify.c | 7 |
2 files changed, 10 insertions, 20 deletions
diff --git a/source3/smbd/close.c b/source3/smbd/close.c index 44ab168a3a..fcea62e1aa 100644 --- a/source3/smbd/close.c +++ b/source3/smbd/close.c @@ -300,8 +300,6 @@ static int close_directory(files_struct *fsp, BOOL normal_close) struct share_mode_lock *lck = 0; BOOL delete_dir = False; - remove_pending_change_notify_requests_by_fid(fsp); - /* * NT can set delete_on_close of the last open * reference to a directory also. @@ -320,18 +318,7 @@ static int close_directory(files_struct *fsp, BOOL normal_close) delete_dir = lck->delete_on_close; - if (delete_dir) { - int i; - /* See if others still have the file open. If this is the - * case, then don't delete */ - for (i=0; i<lck->num_share_modes; i++) { - if (is_valid_share_mode_entry(&lck->share_modes[i])) { - delete_dir = False; - break; - } - } - } - + talloc_free(lck); if (normal_close && delete_dir) { BOOL ok = rmdir_internals(fsp->conn, fsp->fsp_name); @@ -344,13 +331,15 @@ static int close_directory(files_struct *fsp, BOOL normal_close) */ if(ok) { - remove_pending_change_notify_requests_by_filename(fsp); + remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING); + remove_pending_change_notify_requests_by_filename(fsp, NT_STATUS_DELETE_PENDING); + } process_pending_change_notify_queue((time_t)0); + } else { + remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_CANCELLED); } - talloc_free(lck); - /* * Do the code common to files and directories. */ diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index ad49dc0a21..bc76cfb322 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -82,13 +82,14 @@ static void change_notify_remove(struct change_notify *cnbp) Delete entries by fnum from the change notify pending queue. *****************************************************************************/ -void remove_pending_change_notify_requests_by_fid(files_struct *fsp) +void remove_pending_change_notify_requests_by_fid(files_struct *fsp, NTSTATUS status) { struct change_notify *cnbp, *next; for (cnbp=change_notify_list; cnbp; cnbp=next) { next=cnbp->next; if (cnbp->fsp->fnum == fsp->fnum) { + change_notify_reply_packet(cnbp->request_buf,status); change_notify_remove(cnbp); } } @@ -116,7 +117,7 @@ void remove_pending_change_notify_requests_by_mid(int mid) Always send reply. *****************************************************************************/ -void remove_pending_change_notify_requests_by_filename(files_struct *fsp) +void remove_pending_change_notify_requests_by_filename(files_struct *fsp, NTSTATUS status) { struct change_notify *cnbp, *next; @@ -127,7 +128,7 @@ void remove_pending_change_notify_requests_by_filename(files_struct *fsp) * the filename are identical. */ if((cnbp->fsp->conn == fsp->conn) && strequal(cnbp->fsp->fsp_name,fsp->fsp_name)) { - change_notify_reply_packet(cnbp->request_buf,NT_STATUS_CANCELLED); + change_notify_reply_packet(cnbp->request_buf,status); change_notify_remove(cnbp); } } |