s3:smbd:durable: factor stat checks out into vfs_default_durable_reconnect_check_stat()
authorMichael Adam <obnox@samba.org>
Tue, 23 Oct 2012 11:00:02 +0000 (13:00 +0200)
committerJeremy Allison <jra@samba.org>
Thu, 25 Oct 2012 21:03:13 +0000 (23:03 +0200)
This makes vfs_default_durable_reconnect() simpler to read
and it reduces code duplication in the failure case handling.

Signed-off-by: Michael Adam <obnox@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Thu Oct 25 23:03:13 CEST 2012 on sn-devel-104

source3/smbd/durable.c

index 4c6ff67153c910403831f10940eecdc8d7d46e5e..5d276f38ec92a7ff8ba0f0c4cdf8319ac4365798 100644 (file)
@@ -298,6 +298,263 @@ NTSTATUS vfs_default_durable_disconnect(struct files_struct *fsp,
        return NT_STATUS_OK;
 }
 
+
+/**
+ * Check whether a cookie-stored struct info is the same
+ * as a given SMB_STRUCT_STAT, as coming with the fsp.
+ */
+static bool vfs_default_durable_reconnect_check_stat(
+                               struct vfs_default_durable_stat *cookie_st,
+                               SMB_STRUCT_STAT *fsp_st,
+                               const char *name)
+{
+       int ret;
+
+       if (cookie_st->st_ex_dev != fsp_st->st_ex_dev) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_dev",
+                         (unsigned long long)cookie_st->st_ex_dev,
+                         (unsigned long long)fsp_st->st_ex_dev));
+               return false;
+       }
+
+       if (cookie_st->st_ex_ino != fsp_st->st_ex_ino) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_ino",
+                         (unsigned long long)cookie_st->st_ex_ino,
+                         (unsigned long long)fsp_st->st_ex_ino));
+               return false;
+       }
+
+       if (cookie_st->st_ex_mode != fsp_st->st_ex_mode) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_mode",
+                         (unsigned long long)cookie_st->st_ex_mode,
+                         (unsigned long long)fsp_st->st_ex_mode));
+               return false;
+       }
+
+       if (cookie_st->st_ex_nlink != fsp_st->st_ex_nlink) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_nlink",
+                         (unsigned long long)cookie_st->st_ex_nlink,
+                         (unsigned long long)fsp_st->st_ex_nlink));
+               return false;
+       }
+
+       if (cookie_st->st_ex_uid != fsp_st->st_ex_uid) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_uid",
+                         (unsigned long long)cookie_st->st_ex_uid,
+                         (unsigned long long)fsp_st->st_ex_uid));
+               return false;
+       }
+
+       if (cookie_st->st_ex_gid != fsp_st->st_ex_gid) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_gid",
+                         (unsigned long long)cookie_st->st_ex_gid,
+                         (unsigned long long)fsp_st->st_ex_gid));
+               return false;
+       }
+
+       if (cookie_st->st_ex_rdev != fsp_st->st_ex_rdev) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_rdev",
+                         (unsigned long long)cookie_st->st_ex_rdev,
+                         (unsigned long long)fsp_st->st_ex_rdev));
+               return false;
+       }
+
+       if (cookie_st->st_ex_size != fsp_st->st_ex_size) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_size",
+                         (unsigned long long)cookie_st->st_ex_size,
+                         (unsigned long long)fsp_st->st_ex_size));
+               return false;
+       }
+
+       ret = timespec_compare(&cookie_st->st_ex_atime,
+                              &fsp_st->st_ex_atime);
+       if (ret != 0) {
+               struct timeval tc, ts;
+               tc = convert_timespec_to_timeval(cookie_st->st_ex_atime);
+               ts = convert_timespec_to_timeval(fsp_st->st_ex_atime);
+
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:'%s' != stat:'%s', "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_atime",
+                         timeval_string(talloc_tos(), &tc, true),
+                         timeval_string(talloc_tos(), &ts, true)));
+               return false;
+       }
+
+       ret = timespec_compare(&cookie_st->st_ex_mtime,
+                              &fsp_st->st_ex_mtime);
+       if (ret != 0) {
+               struct timeval tc, ts;
+               tc = convert_timespec_to_timeval(cookie_st->st_ex_mtime);
+               ts = convert_timespec_to_timeval(fsp_st->st_ex_mtime);
+
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:'%s' != stat:'%s', "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_mtime",
+                         timeval_string(talloc_tos(), &tc, true),
+                         timeval_string(talloc_tos(), &ts, true)));
+               return false;
+       }
+
+       ret = timespec_compare(&cookie_st->st_ex_ctime,
+                              &fsp_st->st_ex_ctime);
+       if (ret != 0) {
+               struct timeval tc, ts;
+               tc = convert_timespec_to_timeval(cookie_st->st_ex_ctime);
+               ts = convert_timespec_to_timeval(fsp_st->st_ex_ctime);
+
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:'%s' != stat:'%s', "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_ctime",
+                         timeval_string(talloc_tos(), &tc, true),
+                         timeval_string(talloc_tos(), &ts, true)));
+               return false;
+       }
+
+       ret = timespec_compare(&cookie_st->st_ex_btime,
+                              &fsp_st->st_ex_btime);
+       if (ret != 0) {
+               struct timeval tc, ts;
+               tc = convert_timespec_to_timeval(cookie_st->st_ex_btime);
+               ts = convert_timespec_to_timeval(fsp_st->st_ex_btime);
+
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:'%s' != stat:'%s', "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_btime",
+                         timeval_string(talloc_tos(), &tc, true),
+                         timeval_string(talloc_tos(), &ts, true)));
+               return false;
+       }
+
+       if (cookie_st->st_ex_calculated_birthtime !=
+           fsp_st->st_ex_calculated_birthtime)
+       {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_calculated_birthtime",
+                         (unsigned long long)cookie_st->st_ex_calculated_birthtime,
+                         (unsigned long long)fsp_st->st_ex_calculated_birthtime));
+               return false;
+       }
+
+       if (cookie_st->st_ex_blksize != fsp_st->st_ex_blksize) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_blksize",
+                         (unsigned long long)cookie_st->st_ex_blksize,
+                         (unsigned long long)fsp_st->st_ex_blksize));
+               return false;
+       }
+
+       if (cookie_st->st_ex_blocks != fsp_st->st_ex_blocks) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_blocks",
+                         (unsigned long long)cookie_st->st_ex_blocks,
+                         (unsigned long long)fsp_st->st_ex_blocks));
+               return false;
+       }
+
+       if (cookie_st->st_ex_flags != fsp_st->st_ex_flags) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_flags",
+                         (unsigned long long)cookie_st->st_ex_flags,
+                         (unsigned long long)fsp_st->st_ex_flags));
+               return false;
+       }
+
+       if (cookie_st->st_ex_mask != fsp_st->st_ex_mask) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "st_ex_mask",
+                         (unsigned long long)cookie_st->st_ex_mask,
+                         (unsigned long long)fsp_st->st_ex_mask));
+               return false;
+       }
+
+       if (cookie_st->vfs_private != fsp_st->vfs_private) {
+               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
+                         "stat_ex.%s differs: "
+                         "cookie:%llu != stat:%llu, "
+                         "denying durable reconnect\n",
+                         name,
+                         "vfs_private",
+                         (unsigned long long)cookie_st->vfs_private,
+                         (unsigned long long)fsp_st->vfs_private));
+               return false;
+       }
+
+       return true;
+}
+
 NTSTATUS vfs_default_durable_reconnect(struct connection_struct *conn,
                                       struct smb_request *smb1req,
                                       struct smbXsrv_open *op,
@@ -613,398 +870,10 @@ NTSTATUS vfs_default_durable_reconnect(struct connection_struct *conn,
                return NT_STATUS_OBJECT_NAME_NOT_FOUND;
        }
 
-       if (cookie.stat_info.st_ex_dev != fsp->fsp_name->st.st_ex_dev) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_dev",
-                         (unsigned long long)cookie.stat_info.st_ex_dev,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_dev));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_ino != fsp->fsp_name->st.st_ex_ino) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_ino",
-                         (unsigned long long)cookie.stat_info.st_ex_ino,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_ino));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_mode != fsp->fsp_name->st.st_ex_mode) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_mode",
-                         (unsigned long long)cookie.stat_info.st_ex_mode,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_mode));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_nlink != fsp->fsp_name->st.st_ex_nlink) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_nlink",
-                         (unsigned long long)cookie.stat_info.st_ex_nlink,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_nlink));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_uid != fsp->fsp_name->st.st_ex_uid) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_uid",
-                         (unsigned long long)cookie.stat_info.st_ex_uid,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_uid));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_gid != fsp->fsp_name->st.st_ex_gid) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_gid",
-                         (unsigned long long)cookie.stat_info.st_ex_gid,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_gid));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_rdev != fsp->fsp_name->st.st_ex_rdev) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_rdev",
-                         (unsigned long long)cookie.stat_info.st_ex_rdev,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_rdev));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_size != fsp->fsp_name->st.st_ex_size) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_size",
-                         (unsigned long long)cookie.stat_info.st_ex_size,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_size));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       ret = timespec_compare(&cookie.stat_info.st_ex_atime,
-                              &fsp->fsp_name->st.st_ex_atime);
-       if (ret != 0) {
-               struct timeval tc, ts;
-               tc = convert_timespec_to_timeval(cookie.stat_info.st_ex_atime);
-               ts = convert_timespec_to_timeval(fsp->fsp_name->st.st_ex_atime);
-
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:'%s' != stat:'%s', "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_atime",
-                         timeval_string(talloc_tos(), &tc, true),
-                         timeval_string(talloc_tos(), &ts, true)));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       ret = timespec_compare(&cookie.stat_info.st_ex_mtime,
-                              &fsp->fsp_name->st.st_ex_mtime);
-       if (ret != 0) {
-               struct timeval tc, ts;
-               tc = convert_timespec_to_timeval(cookie.stat_info.st_ex_mtime);
-               ts = convert_timespec_to_timeval(fsp->fsp_name->st.st_ex_mtime);
-
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:'%s' != stat:'%s', "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_mtime",
-                         timeval_string(talloc_tos(), &tc, true),
-                         timeval_string(talloc_tos(), &ts, true)));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       ret = timespec_compare(&cookie.stat_info.st_ex_ctime,
-                              &fsp->fsp_name->st.st_ex_ctime);
-       if (ret != 0) {
-               struct timeval tc, ts;
-               tc = convert_timespec_to_timeval(cookie.stat_info.st_ex_ctime);
-               ts = convert_timespec_to_timeval(fsp->fsp_name->st.st_ex_ctime);
-
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:'%s' != stat:'%s', "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_ctime",
-                         timeval_string(talloc_tos(), &tc, true),
-                         timeval_string(talloc_tos(), &ts, true)));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       ret = timespec_compare(&cookie.stat_info.st_ex_btime,
-                              &fsp->fsp_name->st.st_ex_btime);
-       if (ret != 0) {
-               struct timeval tc, ts;
-               tc = convert_timespec_to_timeval(cookie.stat_info.st_ex_btime);
-               ts = convert_timespec_to_timeval(fsp->fsp_name->st.st_ex_btime);
-
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:'%s' != stat:'%s', "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_btime",
-                         timeval_string(talloc_tos(), &tc, true),
-                         timeval_string(talloc_tos(), &ts, true)));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_calculated_birthtime !=
-           fsp->fsp_name->st.st_ex_calculated_birthtime)
-       {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_calculated_birthtime",
-                         (unsigned long long)cookie.stat_info.st_ex_calculated_birthtime,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_calculated_birthtime));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_blksize != fsp->fsp_name->st.st_ex_blksize) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_blksize",
-                         (unsigned long long)cookie.stat_info.st_ex_blksize,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_blksize));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_blocks != fsp->fsp_name->st.st_ex_blocks) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_blocks",
-                         (unsigned long long)cookie.stat_info.st_ex_blocks,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_blocks));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_flags != fsp->fsp_name->st.st_ex_flags) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_flags",
-                         (unsigned long long)cookie.stat_info.st_ex_flags,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_flags));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.st_ex_mask != fsp->fsp_name->st.st_ex_mask) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "st_ex_mask",
-                         (unsigned long long)cookie.stat_info.st_ex_mask,
-                         (unsigned long long)fsp->fsp_name->st.st_ex_mask));
-               ret = SMB_VFS_CLOSE(fsp);
-               if (ret == -1) {
-                       DEBUG(0, ("vfs_default_durable_reconnect: "
-                                 "SMB_VFS_CLOSE failed (%s) - leaking file "
-                                 "descriptor\n", strerror(errno)));
-               }
-               TALLOC_FREE(lck);
-               op->compat = NULL;
-               fsp_free(fsp);
-               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
-       }
-
-       if (cookie.stat_info.vfs_private != fsp->fsp_name->st.vfs_private) {
-               DEBUG(1, ("vfs_default_durable_reconnect (%s): "
-                         "stat_ex.%s differs: "
-                         "cookie:%llu != stat:%llu, "
-                         "denying durable reconnect\n",
-                         fsp_str_dbg(fsp),
-                         "vfs_private",
-                         (unsigned long long)cookie.stat_info.vfs_private,
-                         (unsigned long long)fsp->fsp_name->st.vfs_private));
+       ok = vfs_default_durable_reconnect_check_stat(&cookie.stat_info,
+                                                     &fsp->fsp_name->st,
+                                                     fsp_str_dbg(fsp));
+       if (!ok) {
                ret = SMB_VFS_CLOSE(fsp);
                if (ret == -1) {
                        DEBUG(0, ("vfs_default_durable_reconnect: "