The branch, master has been updated
       via  73d5f14c04f2487f67695ce2e9ff025e25b2b026 (commit)
       via  53bcd162ee4fd55fc5cc3293596f8733ce636b11 (commit)
       via  04a7213eb6a2b776c17a5b56ba3b66e3c3444507 (commit)
       via  2b53b791938bf6b6855b854561dcff70dbc328d3 (commit)
       via  e4675ce8db436ac572fcc476b9bfb1116e997f9f (commit)
       via  6fbebb5369211b72545a1dd588bc6b9fa04210a1 (commit)
      from  669f2a02e29195aaba8cb2f3e50cb2ce66b904a6 (commit)

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


- Log -----------------------------------------------------------------
commit 73d5f14c04f2487f67695ce2e9ff025e25b2b026
Author: Tim Prouty <[email protected]>
Date:   Tue Feb 17 20:39:03 2009 -0800

    s3 OneFS: Add shadow copy module

commit 53bcd162ee4fd55fc5cc3293596f8733ce636b11
Author: Tim Prouty <[email protected]>
Date:   Tue Feb 17 18:38:58 2009 -0800

    s3 OneFS: Add file_id_create implementation to take advantage of snapshots

commit 04a7213eb6a2b776c17a5b56ba3b66e3c3444507
Author: Tim Prouty <[email protected]>
Date:   Mon Feb 16 16:06:45 2009 -0800

    s3: Change the vfs_GetWd cache to use the file_id struct

commit 2b53b791938bf6b6855b854561dcff70dbc328d3
Author: Tim Prouty <[email protected]>
Date:   Mon Feb 16 14:55:52 2009 -0800

    s3: Remove unused inform_level2_message struct

commit e4675ce8db436ac572fcc476b9bfb1116e997f9f
Author: Tim Prouty <[email protected]>
Date:   Sun Feb 15 23:45:28 2009 -0800

    s3: Add extid to the dev/inode pair
    
    This extends the file_id struct to add an additional generic uint64_t
    field: extid.  For backwards compatibility with dev/inodes stored in
    xattr_tdbs and acl_tdbs, the ext id is ignored for these databases.
    This patch should cause no functional change on systems that don't use
    SMB_VFS_FILE_ID_CREATE to set the extid.
    
    Existing code that uses the smb_share_mode library will need to be
    updated to be compatibile with the new extid.

commit 6fbebb5369211b72545a1dd588bc6b9fa04210a1
Author: Tim Prouty <[email protected]>
Date:   Sun Feb 15 23:38:53 2009 -0800

    s3: Modify SMB_VFS_FILE_ID_CREATE to take a stat struct
    
    Since file_id_create_dev is incompatible with the concept of file_ids,
    it is now static and in the one file that needs it.

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

Summary of changes:
 examples/VFS/skel_opaque.c              |    2 +-
 examples/VFS/skel_transparent.c         |    4 +-
 source3/Makefile.in                     |    5 +
 source3/configure.in                    |    3 +-
 source3/include/locking.h               |    1 +
 source3/include/proto.h                 |    4 +-
 source3/include/smb.h                   |   56 +--
 source3/include/smb_share_modes.h       |   11 +-
 source3/include/vfs.h                   |    3 +-
 source3/include/vfs_macros.h            |    6 +-
 source3/lib/file_id.c                   |   47 +-
 source3/libsmb/smb_share_modes.c        |   39 +-
 source3/locking/locking.c               |    6 +-
 source3/modules/onefs_shadow_copy.c     |  782 +++++++++++++++++++++++++++++++
 source3/modules/onefs_shadow_copy.h     |   32 ++
 source3/modules/vfs_acl_tdb.c           |    6 +
 source3/modules/vfs_default.c           |   15 +-
 source3/modules/vfs_fileid.c            |    6 +-
 source3/modules/vfs_full_audit.c        |    6 +-
 source3/modules/vfs_onefs.c             |   18 +
 source3/modules/vfs_onefs_shadow_copy.c |  717 ++++++++++++++++++++++++++++
 source3/modules/vfs_streams_depot.c     |    3 +-
 source3/modules/vfs_xattr_tdb.c         |   23 +-
 source3/smbd/globals.c                  |    3 +-
 source3/smbd/nttrans.c                  |    2 +
 source3/smbd/open.c                     |    4 +-
 source3/smbd/oplock.c                   |   28 +-
 source3/smbd/oplock_irix.c              |   18 +
 source3/smbd/vfs.c                      |   15 +-
 29 files changed, 1737 insertions(+), 128 deletions(-)
 create mode 100644 source3/modules/onefs_shadow_copy.c
 create mode 100644 source3/modules/onefs_shadow_copy.h
 create mode 100644 source3/modules/vfs_onefs_shadow_copy.c


Changeset truncated at 500 lines:

diff --git a/examples/VFS/skel_opaque.c b/examples/VFS/skel_opaque.c
index 2eb7a94..5845f62 100644
--- a/examples/VFS/skel_opaque.c
+++ b/examples/VFS/skel_opaque.c
@@ -292,7 +292,7 @@ static int skel_chflags(vfs_handle_struct *handle,  const 
char *path, uint flags
 }
 
 static struct file_id skel_file_id_create(vfs_handle_struct *handle,
-                                         SMB_DEV_T dev, SMB_INO_T inode)
+                                         const SMB_STRUCT_STAT *sbuf)
 {
        struct file_id id_zero;
        ZERO_STRUCT(id_zero);
diff --git a/examples/VFS/skel_transparent.c b/examples/VFS/skel_transparent.c
index 5670965..7036c73 100644
--- a/examples/VFS/skel_transparent.c
+++ b/examples/VFS/skel_transparent.c
@@ -284,9 +284,9 @@ static int skel_chflags(vfs_handle_struct *handle,  const 
char *path, uint flags
 }
 
 static struct file_id skel_file_id_create(vfs_handle_struct *handle,
-                                         SMB_DEV_T dev, SMB_INO_T inode)
+                                         const SMB_STRUCT_STAT *sbuf)
 {
-       return SMB_VFS_NEXT_FILE_ID_CREATE(handle, dev, inode);
+       return SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf);
 }
 
 static NTSTATUS skel_fget_nt_acl(vfs_handle_struct *handle, files_struct *fsp,
diff --git a/source3/Makefile.in b/source3/Makefile.in
index 9bac719..6ff90fc 100644
--- a/source3/Makefile.in
+++ b/source3/Makefile.in
@@ -667,6 +667,7 @@ VFS_SMB_TRAFFIC_ANALYZER_OBJ = 
modules/vfs_smb_traffic_analyzer.o
 VFS_ONEFS_OBJ = modules/vfs_onefs.o modules/onefs_acl.o modules/onefs_system.o 
\
                modules/onefs_open.o modules/onefs_streams.o 
modules/onefs_dir.c \
                modules/onefs_cbrl.o
+VFS_ONEFS_SHADOW_COPY_OBJ = modules/vfs_onefs_shadow_copy.o 
modules/onefs_shadow_copy.o
 PERFCOUNT_ONEFS_OBJ = modules/perfcount_onefs.o
 PERFCOUNT_TEST_OBJ = modules/perfcount_test.o
 
@@ -2559,6 +2560,10 @@ bin/one...@shlibext@: $(BINARY_PREREQS) $(VFS_ONEFS_OBJ)
        @echo "Building plugin $@"
        @$(SHLD_MODULE) $(VFS_ONEFS_OBJ) @ONEFS_LIBS@
 
+bin/onefs_shadow_co...@shlibext@: $(BINARY_PREREQS) 
$(VFS_ONEFS_SHADOW_COPY_OBJ)
+       @echo "Building plugin $@"
+       @$(SHLD_MODULE) $(VFS_ONEFS_SHADOW_COPY_OBJ)
+
 bin/pc_one...@shlibext@: $(BINARY_PREREQS) $(PERFCOUNT_ONEFS_OBJ)
        @echo "Building plugin $@"
        @$(SHLD_MODULE) $(PERFCOUNT_ONEFS_OBJ)
diff --git a/source3/configure.in b/source3/configure.in
index 57d475f..b163a9d 100644
--- a/source3/configure.in
+++ b/source3/configure.in
@@ -1084,7 +1084,7 @@ AC_TRY_LINK([#include <isi_version/isi_version.h>],
 echo $samba_cv_HAVE_ONEFS
 if test x"$samba_cv_HAVE_ONEFS" = x"yes"; then
     AC_DEFINE(HAVE_ONEFS,1,[Whether building on Isilon OneFS])
-    default_shared_modules="$default_shared_modules vfs_onefs perfcount_onefs"
+    default_shared_modules="$default_shared_modules vfs_onefs 
vfs_onefs_shadow_copy perfcount_onefs"
     ONEFS_LIBS="-lisi_acl -lisi_ecs -lisi_event -lisi_util"
     # Need to also add general libs for oplocks support
     save_LIBS="$save_LIBS -lisi_ecs -lisi_event -lisi_util -ldevstat"
@@ -6178,6 +6178,7 @@ SMB_MODULE(vfs_acl_xattr, \$(VFS_ACL_XATTR_OBJ), 
"bin/acl_xattr.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_acl_tdb, \$(VFS_ACL_TDB_OBJ), "bin/acl_tdb.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_smb_traffic_analyzer, \$(VFS_SMB_TRAFFIC_ANALYZER_OBJ), 
"bin/smb_traffic_analyzer.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_onefs, \$(VFS_ONEFS), "bin/onefs.$SHLIBEXT", VFS)
+SMB_MODULE(vfs_onefs_shadow_copy, \$(VFS_ONEFS_SHADOW_COPY), 
"bin/onefs_shadow_copy.$SHLIBEXT", VFS)
 
 SMB_SUBSYSTEM(VFS,smbd/vfs.o)
 
diff --git a/source3/include/locking.h b/source3/include/locking.h
index 3fd5b94..1833ba3 100644
--- a/source3/include/locking.h
+++ b/source3/include/locking.h
@@ -49,6 +49,7 @@ struct file_id {
           other than a dev_t for the device */
        uint64_t devid;
        uint64_t inode;
+       uint64_t extid; /* Support systems that use an extended id (e.g. 
snapshots). */
 };
 
 struct byte_range_lock {
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 3806c96..ab1f2f4 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -508,12 +508,12 @@ void dump_core_setup(const char *progname);
 
 /* The following definitions come from lib/file_id.c  */
 
-struct file_id file_id_create_dev(SMB_DEV_T dev, SMB_INO_T inode);
 struct file_id vfs_file_id_from_sbuf(connection_struct *conn, const 
SMB_STRUCT_STAT *sbuf);
 bool file_id_equal(const struct file_id *id1, const struct file_id *id2);
 const char *file_id_string_tos(const struct file_id *id);
 void push_file_id_16(char *buf, const struct file_id *id);
-void pull_file_id_16(char *buf, struct file_id *id);
+void push_file_id_24(char *buf, const struct file_id *id);
+void pull_file_id_24(char *buf, struct file_id *id);
 
 /* The following definitions come from lib/gencache.c  */
 
diff --git a/source3/include/smb.h b/source3/include/smb.h
index bef0fd1..f020887 100644
--- a/source3/include/smb.h
+++ b/source3/include/smb.h
@@ -758,18 +758,19 @@ Offset  Data                      length.
 16     uint32 private_options  4
 20     uint32 time sec         4
 24     uint32 time usec        4
-28     SMB_DEV_T dev           8 bytes.
-36     SMB_INO_T inode         8 bytes
-44     unsigned long file_id   4 bytes
-48     uint32 uid              4 bytes
-52     uint16 flags            2 bytes
-54
+28     uint64 dev              8 bytes
+36     uint64 inode            8 bytes
+44     uint64 extid            8 bytes
+52     unsigned long file_id   4 bytes
+56     uint32 uid              4 bytes
+60     uint16 flags            2 bytes
+62
 
 */
 #ifdef CLUSTER_SUPPORT
-#define MSG_SMB_SHARE_MODE_ENTRY_SIZE 58
+#define MSG_SMB_SHARE_MODE_ENTRY_SIZE 66
 #else
-#define MSG_SMB_SHARE_MODE_ENTRY_SIZE 54
+#define MSG_SMB_SHARE_MODE_ENTRY_SIZE 62
 #endif
 
 struct share_mode_lock {
@@ -1620,48 +1621,43 @@ enum acl_compatibility {ACL_COMPAT_AUTO, 
ACL_COMPAT_WINNT, ACL_COMPAT_WIN2K};
 #define BATCH_OPLOCK_TYPE(lck) ((lck) & (unsigned int)BATCH_OPLOCK)
 #define LEVEL_II_OPLOCK_TYPE(lck) ((lck) & ((unsigned 
int)LEVEL_II_OPLOCK|(unsigned int)FAKE_LEVEL_II_OPLOCK))
 
-struct inform_level2_message {
-       SMB_DEV_T dev;
-       SMB_INO_T inode;
-       uint16 mid;
-       unsigned long target_file_id;
-       unsigned long source_file_id;
-};
-
 /* kernel_oplock_message definition.
 
 struct kernel_oplock_message {
-       SMB_DEV_T dev;
-       SMB_INO_T inode;
+       uint64_t dev;
+       uint64_t inode;
+       unit64_t extid;
        unsigned long file_id;
 };
 
 Offset  Data                  length.
-0     SMB_DEV_T dev           8 bytes.
-8     SMB_INO_T inode         8 bytes
-16    unsigned long file_id   4 bytes
-20
+0     uint64_t dev            8 bytes
+8     uint64_t inode          8 bytes
+16    uint64_t extid          8 bytes
+24    unsigned long file_id   4 bytes
+28
 
 */
-#define MSG_SMB_KERNEL_BREAK_SIZE 20
+#define MSG_SMB_KERNEL_BREAK_SIZE 28
 
 /* file_renamed_message definition.
 
 struct file_renamed_message {
-       SMB_DEV_T dev;
-       SMB_INO_T inode;
+       uint64_t dev;
+       uint64_t inode;
        char names[1]; A variable area containing sharepath and filename.
 };
 
 Offset  Data                   length.
-0      SMB_DEV_T dev           8 bytes.
-8      SMB_INO_T inode         8 bytes
-16     char [] name            zero terminated namelen bytes
-minimum length == 18.
+0      uint64_t dev            8 bytes
+8      uint64_t inode          8 bytes
+16      unit64_t extid          8 bytes
+24     char [] name            zero terminated namelen bytes
+minimum length == 24.
 
 */
 
-#define MSG_FILE_RENAMED_MIN_SIZE 16
+#define MSG_FILE_RENAMED_MIN_SIZE 24
 
 /*
  * On the wire return values for oplock types.
diff --git a/source3/include/smb_share_modes.h 
b/source3/include/smb_share_modes.h
index 101bec8..4a2d832 100644
--- a/source3/include/smb_share_modes.h
+++ b/source3/include/smb_share_modes.h
@@ -46,6 +46,7 @@ struct smbdb_ctx;
 struct smb_share_mode_entry {
        uint64_t dev;
        uint64_t ino;
+       uint64_t extid;
        uint32_t share_access;
        uint32_t access_mask;
        struct timeval open_time;
@@ -66,11 +67,13 @@ int smb_share_mode_db_close(struct smbdb_ctx *db_ctx);
 
 int smb_lock_share_mode_entry(struct smbdb_ctx *db_ctx,
                                uint64_t dev,
-                               uint64_t ino);
+                               uint64_t ino,
+                               uint64_t extid);
 
 int smb_unlock_share_mode_entry(struct smbdb_ctx *db_ctx,
                                uint64_t dev,
-                               uint64_t ino);
+                               uint64_t ino,
+                               uint64_t extid);
 
 /*
  * Share mode database accessor functions.
@@ -79,23 +82,27 @@ int smb_unlock_share_mode_entry(struct smbdb_ctx *db_ctx,
 int smb_get_share_mode_entries(struct smbdb_ctx *db_ctx,
                                uint64_t dev,
                                uint64_t ino,
+                               uint64_t extid,
                                struct smb_share_mode_entry **pp_list,
                                unsigned char *p_delete_on_close);
 
 int smb_create_share_mode_entry(struct smbdb_ctx *db_ctx,
                                uint64_t dev,
                                uint64_t ino,
+                               uint64_t extid,
                                const struct smb_share_mode_entry *set_entry,
                                const char *path);
 
 int smb_delete_share_mode_entry(struct smbdb_ctx *db_ctx,
                                uint64_t dev,
                                uint64_t ino,
+                               uint64_t extid,
                                const struct smb_share_mode_entry *set_entry);
 
 int smb_change_share_mode_entry(struct smbdb_ctx *db_ctx,
                                uint64_t dev,
                                uint64_t ino,
+                               uint64_t extid,
                                const struct smb_share_mode_entry *set_entry,
                                const struct smb_share_mode_entry *new_entry);
 
diff --git a/source3/include/vfs.h b/source3/include/vfs.h
index ffa1a95..0ee7f23 100644
--- a/source3/include/vfs.h
+++ b/source3/include/vfs.h
@@ -383,7 +383,8 @@ struct vfs_ops {
                                                          struct notify_event 
*ev),
                                         void *private_data, void *handle_p);
                int (*chflags)(struct vfs_handle_struct *handle, const char 
*path, unsigned int flags);
-               struct file_id (*file_id_create)(struct vfs_handle_struct 
*handle, SMB_DEV_T dev, SMB_INO_T inode);
+               struct file_id (*file_id_create)(struct vfs_handle_struct 
*handle,
+                                                const SMB_STRUCT_STAT *sbuf);
 
                NTSTATUS (*streaminfo)(struct vfs_handle_struct *handle,
                                       struct files_struct *fsp,
diff --git a/source3/include/vfs_macros.h b/source3/include/vfs_macros.h
index 3af6123..7dacd23 100644
--- a/source3/include/vfs_macros.h
+++ b/source3/include/vfs_macros.h
@@ -85,7 +85,7 @@
 #define SMB_VFS_REALPATH(conn, path, resolved_path) 
((conn)->vfs.ops.realpath((conn)->vfs.handles.realpath, (path), 
(resolved_path)))
 #define SMB_VFS_NOTIFY_WATCH(conn, ctx, e, callback, private_data, handle_p) 
((conn)->vfs.ops.notify_watch((conn)->vfs.handles.notify_watch, (ctx), (e), 
(callback), (private_data), (handle_p)))
 #define SMB_VFS_CHFLAGS(conn, path, flags) 
((conn)->vfs.ops.chflags((conn)->vfs.handles.chflags, (path), (flags)))
-#define SMB_VFS_FILE_ID_CREATE(conn, dev, inode) 
((conn)->vfs.ops.file_id_create((conn)->vfs.handles.file_id_create, (dev), 
(inode)))
+#define SMB_VFS_FILE_ID_CREATE(conn, sbuf) 
((conn)->vfs.ops.file_id_create((conn)->vfs.handles.file_id_create, (sbuf)))
 #define SMB_VFS_STREAMINFO(conn, fsp, fname, mem_ctx, num_streams, streams) 
((conn)->vfs.ops.streaminfo((conn)->vfs.handles.streaminfo, (fsp), (fname), 
(mem_ctx), (num_streams), (streams)))
 #define SMB_VFS_GET_REAL_FILENAME(conn, path, name, mem_ctx, found_name) 
((conn)->vfs.ops.get_real_filename((conn)->vfs.handles.get_real_filename, 
(path), (name), (mem_ctx), (found_name)))
 #define SMB_VFS_BRL_LOCK_WINDOWS(conn, br_lck, plock, blocking_lock, blr) 
((conn)->vfs.ops.brl_lock_windows((conn)->vfs.handles.brl_lock_windows, 
(br_lck), (plock), (blocking_lock), (blr)))
@@ -217,7 +217,7 @@
 #define SMB_VFS_OPAQUE_REALPATH(conn, path, resolved_path) 
((conn)->vfs_opaque.ops.realpath((conn)->vfs_opaque.handles.realpath, (path), 
(resolved_path)))
 #define SMB_VFS_OPAQUE_NOTIFY_WATCH(conn, ctx, e, callback, private_data, 
handle_p) 
((conn)->vfs_opaque.ops.notify_watch((conn)->vfs_opaque.handles.notify_watch, 
(ctx), (e), (callback), (private_data), (handle_p)))
 #define SMB_VFS_OPAQUE_CHFLAGS(conn, path, flags) 
((conn)->vfs_opaque.ops.chflags((conn)->vfs_opaque.handles.chflags, (path), 
(flags)))
-#define SMB_VFS_OPAQUE_FILE_ID_CREATE(conn, dev, inode) 
((conn)->vfs.ops_opaque.file_id_create((conn)->vfs_opaque.handles.file_id_create,
 (dev), (inode)))
+#define SMB_VFS_OPAQUE_FILE_ID_CREATE(conn, sbuf) 
((conn)->vfs.ops_opaque.file_id_create((conn)->vfs_opaque.handles.file_id_create,
 (sbuf)))
 #define SMB_VFS_OPAQUE_STREAMINFO(conn, fsp, fname, mem_ctx, num_streams, 
streams) 
((conn)->vfs_opaque.ops.streaminfo((conn)->vfs_opaque.handles.streaminfo, 
(fsp), (fname), (mem_ctx), (num_streams), (streams)))
 #define SMB_VFS_OPAQUE_GET_REAL_FILENAME(conn, path, name, mem_ctx, 
found_name) 
((conn)->vfs_opaque.ops.get_real_filename((conn)->vfs_opaque.handles.get_real_filename,
 (path), (name), (mem_ctx), (found_name)))
 #define SMB_VFS_OPAQUE_BRL_LOCK_WINDOWS(conn, br_lck, plock, blocking_lock, 
blr) 
((conn)->vfs_opaque.ops.brl_lock_windows((conn)->vfs_opaque.handles.brl_lock_windows,
 (br_lck), (plock), (blocking_lock), (blr)))
@@ -350,7 +350,7 @@
 #define SMB_VFS_NEXT_REALPATH(handle, path, resolved_path) 
((handle)->vfs_next.ops.realpath((handle)->vfs_next.handles.realpath, (path), 
(resolved_path)))
 #define SMB_VFS_NEXT_NOTIFY_WATCH(conn, ctx, e, callback, private_data, 
handle_p) 
((conn)->vfs_next.ops.notify_watch((conn)->vfs_next.handles.notify_watch, 
(ctx), (e), (callback), (private_data), (handle_p)))
 #define SMB_VFS_NEXT_CHFLAGS(handle, path, flags) 
((handle)->vfs_next.ops.chflags((handle)->vfs_next.handles.chflags, (path), 
(flags)))
-#define SMB_VFS_NEXT_FILE_ID_CREATE(handle, dev, inode) 
((handle)->vfs_next.ops.file_id_create((handle)->vfs_next.handles.file_id_create,
 (dev), (inode)))
+#define SMB_VFS_NEXT_FILE_ID_CREATE(handle, sbuf) 
((handle)->vfs_next.ops.file_id_create((handle)->vfs_next.handles.file_id_create,
 (sbuf)))
 #define SMB_VFS_NEXT_STREAMINFO(handle, fsp, fname, mem_ctx, num_streams, 
streams) 
((handle)->vfs_next.ops.streaminfo((handle)->vfs_next.handles.streaminfo, 
(fsp), (fname), (mem_ctx), (num_streams), (streams)))
 #define SMB_VFS_NEXT_GET_REAL_FILENAME(handle, path, name, mem_ctx, 
found_name) 
((handle)->vfs_next.ops.get_real_filename((handle)->vfs_next.handles.get_real_filename,
 (path), (name), (mem_ctx), (found_name)))
 #define SMB_VFS_NEXT_BRL_LOCK_WINDOWS(handle, br_lck, plock, blocking_lock, 
blr) 
((handle)->vfs_next.ops.brl_lock_windows((handle)->vfs_next.handles.brl_lock_windows,
 (br_lck), (plock), (blocking_lock), (blr)))
diff --git a/source3/lib/file_id.c b/source3/lib/file_id.c
index 0633d4b..0902e3d 100644
--- a/source3/lib/file_id.c
+++ b/source3/lib/file_id.c
@@ -22,26 +22,11 @@
 #include "includes.h"
 
 /*
-  return a file_id which gives a unique ID for a file given the device and
-  inode numbers
- */
-struct file_id file_id_create_dev(SMB_DEV_T dev, SMB_INO_T inode)
-{
-       struct file_id key;
-       /* the ZERO_STRUCT ensures padding doesn't break using the key as a
-        * blob */
-       ZERO_STRUCT(key);
-       key.devid = dev;
-       key.inode = inode;
-       return key;
-}
-
-/*
   generate a file_id from a stat structure
  */
 struct file_id vfs_file_id_from_sbuf(connection_struct *conn, const 
SMB_STRUCT_STAT *sbuf)
 {
-       return SMB_VFS_FILE_ID_CREATE(conn, sbuf->st_dev, sbuf->st_ino);
+       return SMB_VFS_FILE_ID_CREATE(conn, sbuf);
 }
 
 /*
@@ -49,7 +34,8 @@ struct file_id vfs_file_id_from_sbuf(connection_struct *conn, 
const SMB_STRUCT_S
  */
 bool file_id_equal(const struct file_id *id1, const struct file_id *id2)
 {
-       return id1->inode == id2->inode && id1->devid == id2->devid;
+       return id1->inode == id2->inode && id1->devid == id2->devid &&
+           id1->extid == id2->extid;
 }
 
 /*
@@ -57,15 +43,17 @@ bool file_id_equal(const struct file_id *id1, const struct 
file_id *id2)
  */
 const char *file_id_string_tos(const struct file_id *id)
 {
-       char *result = talloc_asprintf(talloc_tos(), "%llx:%llx", 
+       char *result = talloc_asprintf(talloc_tos(), "%llx:%llx:%llx",
                                       (unsigned long long)id->devid, 
-                                      (unsigned long long)id->inode);
+                                      (unsigned long long)id->inode,
+                                      (unsigned long long)id->extid);
        SMB_ASSERT(result != NULL);
        return result;
 }
 
 /*
-  push a 16 byte version of a file id into a buffer
+  push a 16 byte version of a file id into a buffer.  This ignores the extid
+  and is needed when dev/inodes are stored in persistent storage (tdbs).
  */
 void push_file_id_16(char *buf, const struct file_id *id)
 {
@@ -76,13 +64,28 @@ void push_file_id_16(char *buf, const struct file_id *id)
 }
 
 /*
-  pul a 16 byte version of a file id from a buffer
+  push a 24 byte version of a file id into a buffer
+ */
+void push_file_id_24(char *buf, const struct file_id *id)
+{
+       SIVAL(buf,  0, id->devid&0xFFFFFFFF);
+       SIVAL(buf,  4, id->devid>>32);
+       SIVAL(buf,  8, id->inode&0xFFFFFFFF);
+       SIVAL(buf, 12, id->inode>>32);
+       SIVAL(buf, 16, id->extid&0xFFFFFFFF);
+       SIVAL(buf, 20, id->extid>>32);
+}
+
+/*
+  pull a 24 byte version of a file id from a buffer
  */
-void pull_file_id_16(char *buf, struct file_id *id)
+void pull_file_id_24(char *buf, struct file_id *id)
 {
        ZERO_STRUCTP(id);
        id->devid  = IVAL(buf,  0);
        id->devid |= ((uint64_t)IVAL(buf,4))<<32;
        id->inode  = IVAL(buf,  8);
        id->inode |= ((uint64_t)IVAL(buf,12))<<32;
+       id->extid  = IVAL(buf,  16);
+       id->extid |= ((uint64_t)IVAL(buf,20))<<32;
 }
diff --git a/source3/libsmb/smb_share_modes.c b/source3/libsmb/smb_share_modes.c
index af3f7b0..177e011 100644
--- a/source3/libsmb/smb_share_modes.c
+++ b/source3/libsmb/smb_share_modes.c
@@ -38,7 +38,8 @@ struct smbdb_ctx {
 #endif
 
 int smb_create_share_mode_entry_ex(struct smbdb_ctx *db_ctx, uint64_t dev,
-                               uint64_t ino, const struct smb_share_mode_entry 
*new_entry,
+                               uint64_t ino, uint64_t extid,
+                               const struct smb_share_mode_entry *new_entry,
                                const char *sharepath, const char *filename);
 
 static bool sharemodes_procid_equal(const struct server_id *p1, const struct 
server_id *p2)
@@ -83,6 +84,7 @@ struct smbdb_ctx *smb_share_mode_db_open(const char *db_path)
 struct locking_key {
         SMB_DEV_T dev;
         SMB_INO_T inode;
+       uint64_t extid;
 };
 
 int smb_share_mode_db_close(struct smbdb_ctx *db_ctx)
@@ -93,13 +95,14 @@ int smb_share_mode_db_close(struct smbdb_ctx *db_ctx)
 }
 
 static TDB_DATA get_locking_key(struct locking_key *lk, uint64_t dev,
-                               uint64_t ino)
+                               uint64_t ino, uint64_t extid)
 {
        TDB_DATA ld;
 
        memset(lk, '\0', sizeof(*lk));
        lk->dev = (SMB_DEV_T)dev;
        lk->inode = (SMB_INO_T)ino;
+       lk->extid = extid;
        ld.dptr = (uint8 *)lk;
        ld.dsize = sizeof(*lk);
        return ld;
@@ -111,19 +114,22 @@ static TDB_DATA get_locking_key(struct locking_key *lk, 
uint64_t dev,
 
 int smb_lock_share_mode_entry(struct smbdb_ctx *db_ctx,
                                uint64_t dev,
-                               uint64_t ino)
+                               uint64_t ino,
+                               uint64_t extid)
 {
        struct locking_key lk;
-       return tdb_chainlock(db_ctx->smb_tdb, get_locking_key(&lk, dev, ino));
+       return tdb_chainlock(db_ctx->smb_tdb, get_locking_key(&lk, dev, ino,
+                                                             extid));
 }
 
 int smb_unlock_share_mode_entry(struct smbdb_ctx *db_ctx,
                                 uint64_t dev,
-                                uint64_t ino)
+                                uint64_t ino,
+                                uint64_t extid)
 {
        struct locking_key lk;
        return tdb_chainunlock(db_ctx->smb_tdb,
-                              get_locking_key(&lk, dev, ino));
+                              get_locking_key(&lk, dev, ino, extid));
 }
 
 /*
@@ -140,7 +146,8 @@ static int share_mode_entry_equal(const struct 
smb_share_mode_entry *e_entry,
                e_entry->share_access == (uint32_t)entry->share_access &&
                e_entry->access_mask == (uint32_t)entry->access_mask &&
                e_entry->dev == entry->id.devid && 
-               e_entry->ino == entry->id.inode);
+               e_entry->ino == entry->id.inode &&
+               e_entry->extid == entry->id.extid);
 }
 
 /*
@@ -160,6 +167,7 @@ static void create_share_mode_entry(struct share_mode_entry 
*out,
        out->access_mask = in->access_mask;
        out->id.devid = in->dev;
        out->id.inode = in->ino;
+       out->id.extid = in->extid;
        out->uid = (uint32)geteuid();
        out->flags = 0;
 }
@@ -172,6 +180,7 @@ static void create_share_mode_entry(struct share_mode_entry 
*out,
 int smb_get_share_mode_entries(struct smbdb_ctx *db_ctx,
                                uint64_t dev,
                                uint64_t ino,
+                               uint64_t extid,
                                struct smb_share_mode_entry **pp_list,
                                unsigned char *p_delete_on_close)
 {
@@ -187,7 +196,8 @@ int smb_get_share_mode_entries(struct smbdb_ctx *db_ctx,
        *pp_list = NULL;
        *p_delete_on_close = 0;
 
-       db_data = tdb_fetch(db_ctx->smb_tdb, get_locking_key(&lk, dev, ino));
+       db_data = tdb_fetch(db_ctx->smb_tdb, get_locking_key(&lk, dev, ino,
+                                                            extid));
        if (!db_data.dptr) {
                return 0;
        }
@@ -229,6 +239,7 @@ int smb_get_share_mode_entries(struct smbdb_ctx *db_ctx,
                /* Copy into the external list. */


-- 
Samba Shared Repository

Reply via email to