pvfs_setfileinfo: tell the opendb about renames
authorStefan Metzmacher <metze@samba.org>
Thu, 28 Feb 2008 11:19:18 +0000 (12:19 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 29 Feb 2008 14:17:53 +0000 (15:17 +0100)
metze

source/ntvfs/posix/pvfs_setfileinfo.c

index fcadbfd852a52ed05a6bd3224548b9392c1d82e9..18647c95c590c7ea45e81e008b40b6e7303abb5a 100644 (file)
@@ -82,11 +82,13 @@ static uint32_t pvfs_setfileinfo_access(union smb_setfileinfo *info)
 static NTSTATUS pvfs_setfileinfo_rename(struct pvfs_state *pvfs, 
                                        struct ntvfs_request *req, 
                                        struct pvfs_filename *name,
+                                       DATA_BLOB *odb_locking_key,
                                        union smb_setfileinfo *info)
 {
        NTSTATUS status;
        struct pvfs_filename *name2;
        char *new_name, *p;
+       struct odb_lock *lck = NULL;
 
        /* renames are only allowed within a directory */
        if (strchr_m(info->rename_information.in.new_name, '\\') &&
@@ -168,7 +170,18 @@ static NTSTATUS pvfs_setfileinfo_rename(struct pvfs_state *pvfs,
                return status;
        }
 
+       lck = odb_lock(req, pvfs->odb_context, odb_locking_key);
+       if (lck == NULL) {
+               DEBUG(0,("Unable to lock opendb for can_stat\n"));
+               return NT_STATUS_INTERNAL_DB_CORRUPTION;
+       }
+
        status = pvfs_do_rename(pvfs, name, name2->full_name);
+       if (NT_STATUS_IS_OK(status)) {
+               status = odb_rename(lck, name2->full_name);
+       }
+       talloc_free(lck);
+       NT_STATUS_NOT_OK_RETURN(status);
        if (NT_STATUS_IS_OK(status)) {
                name->full_name = talloc_steal(name, name2->full_name);
                name->original_name = talloc_steal(name, name2->original_name);
@@ -391,7 +404,8 @@ NTSTATUS pvfs_setfileinfo(struct ntvfs_module_context *ntvfs,
 
        case RAW_SFILEINFO_RENAME_INFORMATION:
        case RAW_SFILEINFO_RENAME_INFORMATION_SMB2:
-               return pvfs_setfileinfo_rename(pvfs, req, h->name, 
+               return pvfs_setfileinfo_rename(pvfs, req, h->name,
+                                              &h->odb_locking_key,
                                               info);
 
        case RAW_SFILEINFO_SEC_DESC:
@@ -565,6 +579,7 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
        uint32_t access_needed;
        uint32_t change_mask = 0;
        struct odb_lock *lck = NULL;
+       DATA_BLOB odb_locking_key;
 
        /* resolve the cifs name to a posix name */
        status = pvfs_resolve_name(pvfs, req, info->generic.in.file.path, 
@@ -696,8 +711,12 @@ NTSTATUS pvfs_setpathinfo(struct ntvfs_module_context *ntvfs,
 
        case RAW_SFILEINFO_RENAME_INFORMATION:
        case RAW_SFILEINFO_RENAME_INFORMATION_SMB2:
-               return pvfs_setfileinfo_rename(pvfs, req, name, 
-                                              info);
+               status = pvfs_locking_key(name, name, &odb_locking_key);
+               NT_STATUS_NOT_OK_RETURN(status);
+               status = pvfs_setfileinfo_rename(pvfs, req, name,
+                                                &odb_locking_key, info);
+               NT_STATUS_NOT_OK_RETURN(status);
+               return NT_STATUS_OK;
 
        case RAW_SFILEINFO_DISPOSITION_INFO:
        case RAW_SFILEINFO_DISPOSITION_INFORMATION: