r779: Fix specific case of open that doesn't cause oplock break, or share mode check.
authorJeremy Allison <jra@samba.org>
Wed, 19 May 2004 02:25:48 +0000 (02:25 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:51:37 +0000 (10:51 -0500)
Test case provided by Volker will be added later. There may be other tests
needed.
Jeremy.
(This used to be commit 1f8e7946edbb2930ba5f9738688dc843bc368fbf)

source3/smbd/open.c
source3/smbd/trans2.c

index f072dc4be47ad5915ef05bc0c605c2b548670d79..3b4f50b06566775bd8d32991e2597529cddfc666 100644 (file)
@@ -805,6 +805,25 @@ files_struct *open_file_shared1(connection_struct *conn,char *fname, SMB_STRUCT_
                return print_fsp_open(conn, fname);
        }
 
+       if (desired_access && ((desired_access & ~(SYNCHRONIZE_ACCESS|FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES))==0) &&
+               ((desired_access & (SYNCHRONIZE_ACCESS|FILE_READ_ATTRIBUTES|FILE_WRITE_ATTRIBUTES)) != 0)) {
+               /* Stat open that doesn't trigger oplock breaks or share mode checks... ! JRA. */
+               oplock_request = 0;
+               fsp = open_file_stat(conn, fname, psbuf);
+               if (!fsp)
+                       return NULL;
+
+               fsp->desired_access = desired_access;
+               if (Access)
+                       *Access = DOS_OPEN_RDONLY;
+               if (paction)
+                       *paction = FILE_WAS_OPENED;
+
+               DEBUG(10,("open_file_shared: stat open for fname = %s share_mode = %x\n",
+                       fname, share_mode ));
+               return fsp;
+       }
+
        fsp = file_new(conn);
        if(!fsp)
                return NULL;
@@ -1427,12 +1446,8 @@ files_struct *open_file_stat(connection_struct *conn, char *fname, SMB_STRUCT_ST
         */
        
        fsp->mode = psbuf->st_mode;
-       /* 
-        * Don't store dev or inode, we don't want any iterator
-        * to see this.
-        */
-       fsp->inode = (SMB_INO_T)0;
-       fsp->dev = (SMB_DEV_T)0;
+       fsp->inode = psbuf->st_ino;
+       fsp->dev = psbuf->st_dev;
        fsp->size = psbuf->st_size;
        fsp->vuid = current_user.vuid;
        fsp->file_pid = global_smbpid;
index 23272752c6b894a92254628a0ab798eff17fce6d..738d12e020fd0ba323159100a2d84b7daa2fa9de 100644 (file)
@@ -2302,7 +2302,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn,
                                return set_bad_path_error(errno, bad_path, outbuf, ERRDOS,ERRbadpath);
                        }
 
-                       delete_pending = fsp->directory_delete_on_close;
+                       delete_pending = fsp->is_directory ? fsp->directory_delete_on_close : 0;
                } else {
                        /*
                         * Original code - this is an open file.