The branch, master has been updated
       via  8da8a22 s3: vfs_streams_depot: add delete_lost option
       via  7a76762 s3: make recursive_rmdir function non-static
      from  07b918a s3: Fix bug 8966, Fix net rpc share allowedusers to work 
with 2008r2

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 8da8a2289ea51d4fcdf6b5352a46c14d36d8f072
Author: Björn Baumbach <b...@sernet.de>
Date:   Thu Sep 27 12:40:47 2012 +0200

    s3: vfs_streams_depot: add delete_lost option
    
    With this option lost stream directories will be removed
    instead of renamed.
    
    Autobuild-User(master): Volker Lendecke <v...@samba.org>
    Autobuild-Date(master): Mon Oct  1 18:47:30 CEST 2012 on sn-devel-104

commit 7a76762c688f4fc7519dbd204b036963c460e093
Author: Björn Baumbach <b...@sernet.de>
Date:   Mon Oct 1 09:55:28 2012 +0200

    s3: make recursive_rmdir function non-static

-----------------------------------------------------------------------

Summary of changes:
 source3/modules/vfs_streams_depot.c |   65 ++++++++++++++++++++++------------
 source3/smbd/close.c                |    8 ++--
 source3/smbd/proto.h                |    3 ++
 3 files changed, 49 insertions(+), 27 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source3/modules/vfs_streams_depot.c 
b/source3/modules/vfs_streams_depot.c
index c0d5945..620a580 100644
--- a/source3/modules/vfs_streams_depot.c
+++ b/source3/modules/vfs_streams_depot.c
@@ -198,6 +198,7 @@ static char *stream_dir(vfs_handle_struct *handle,
        if (SMB_VFS_NEXT_STAT(handle, smb_fname_hash) == 0) {
                struct smb_filename *smb_fname_new = NULL;
                char *newname;
+               bool delete_lost;
 
                if (!S_ISDIR(smb_fname_hash->st.st_ex_mode)) {
                        errno = EINVAL;
@@ -211,36 +212,54 @@ static char *stream_dir(vfs_handle_struct *handle,
 
                /*
                 * Someone has recreated a file under an existing inode
-                * without deleting the streams directory. For now, just move
-                * it away.
+                * without deleting the streams directory.
+                * Move it away or remove if streams_depot:delete_lost is set.
                 */
 
        again:
-               newname = talloc_asprintf(talloc_tos(), "lost-%lu", random());
-               if (newname == NULL) {
-                       errno = ENOMEM;
-                       goto fail;
-               }
+               delete_lost = lp_parm_bool(SNUM(handle->conn), "streams_depot",
+                                          "delete_lost", false);
+
+               if (delete_lost) {
+                       DEBUG(3, ("Someone has recreated a file under an "
+                             "existing inode. Removing: %s\n",
+                             smb_fname_hash->base_name));
+                       recursive_rmdir(talloc_tos(), handle->conn,
+                                       smb_fname_hash);
+                       SMB_VFS_NEXT_RMDIR(handle, smb_fname_hash->base_name);
+               } else {
+                       newname = talloc_asprintf(talloc_tos(), "lost-%lu",
+                                                 random());
+                       DEBUG(3, ("Someone has recreated a file under an "
+                             "existing inode. Renaming: %s to: %s\n",
+                             smb_fname_hash->base_name,
+                             newname));
+                       if (newname == NULL) {
+                               errno = ENOMEM;
+                               goto fail;
+                       }
 
-               status = create_synthetic_smb_fname(talloc_tos(), newname,
-                                                   NULL, NULL,
-                                                   &smb_fname_new);
-               TALLOC_FREE(newname);
-               if (!NT_STATUS_IS_OK(status)) {
-                       errno = map_errno_from_nt_status(status);
-                       goto fail;
-               }
+                       status = create_synthetic_smb_fname(talloc_tos(),
+                                                           newname,
+                                                           NULL, NULL,
+                                                           &smb_fname_new);
+                       TALLOC_FREE(newname);
+                       if (!NT_STATUS_IS_OK(status)) {
+                               errno = map_errno_from_nt_status(status);
+                               goto fail;
+                       }
 
-               if (SMB_VFS_NEXT_RENAME(handle, smb_fname_hash,
-                                       smb_fname_new) == -1) {
-                       TALLOC_FREE(smb_fname_new);
-                       if ((errno == EEXIST) || (errno == ENOTEMPTY)) {
-                               goto again;
+                       if (SMB_VFS_NEXT_RENAME(handle, smb_fname_hash,
+                                               smb_fname_new) == -1) {
+                               TALLOC_FREE(smb_fname_new);
+                               if ((errno == EEXIST) || (errno == ENOTEMPTY)) {
+                                       goto again;
+                               }
+                               goto fail;
                        }
-                       goto fail;
-               }
 
-               TALLOC_FREE(smb_fname_new);
+                       TALLOC_FREE(smb_fname_new);
+               }
        }
 
        if (!create_it) {
diff --git a/source3/smbd/close.c b/source3/smbd/close.c
index 8bf481d..9b988e0 100644
--- a/source3/smbd/close.c
+++ b/source3/smbd/close.c
@@ -853,13 +853,13 @@ static NTSTATUS close_normal_file(struct smb_request 
*req, files_struct *fsp,
        return status;
 }
 /****************************************************************************
- Static function used by reply_rmdir to delete an entire directory
+ Function used by reply_rmdir to delete an entire directory
  tree recursively. Return True on ok, False on fail.
 ****************************************************************************/
 
-static bool recursive_rmdir(TALLOC_CTX *ctx,
-                       connection_struct *conn,
-                       struct smb_filename *smb_dname)
+bool recursive_rmdir(TALLOC_CTX *ctx,
+                    connection_struct *conn,
+                    struct smb_filename *smb_dname)
 {
        const char *dname = NULL;
        char *talloced = NULL;
diff --git a/source3/smbd/proto.h b/source3/smbd/proto.h
index a1cef16..143da49 100644
--- a/source3/smbd/proto.h
+++ b/source3/smbd/proto.h
@@ -139,6 +139,9 @@ void msg_close_file(struct messaging_context *msg_ctx,
                    struct server_id server_id,
                    DATA_BLOB *data);
 NTSTATUS delete_all_streams(connection_struct *conn, const char *fname);
+bool recursive_rmdir(TALLOC_CTX *ctx,
+                    connection_struct *conn,
+                    struct smb_filename *smb_dname);
 
 /* The following definitions come from smbd/conn.c  */
 


-- 
Samba Shared Repository

Reply via email to