diff options
author | Jeremy Allison <jra@samba.org> | 2004-05-19 02:25:48 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2004-05-19 02:25:48 +0000 |
commit | 913591bea2b40fd4028efc7606c90a8c3a948898 (patch) | |
tree | 52d57a60a3eea6d3138129314c9ed629ffd8d6ad | |
parent | 88c96c12f0e9f387311f6e0b428ae99ba4fb99bc (diff) | |
download | samba-913591bea2b40fd4028efc7606c90a8c3a948898.tar.gz |
r779: Fix specific case of open that doesn't cause oplock break, or share mode check.
Test case provided by Volker will be added later. There may be other tests
needed.
Jeremy.
-rw-r--r-- | source/smbd/open.c | 27 | ||||
-rw-r--r-- | source/smbd/trans2.c | 2 |
2 files changed, 22 insertions, 7 deletions
diff --git a/source/smbd/open.c b/source/smbd/open.c index f072dc4be47..3b4f50b0656 100644 --- a/source/smbd/open.c +++ b/source/smbd/open.c @@ -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; diff --git a/source/smbd/trans2.c b/source/smbd/trans2.c index 23272752c6b..738d12e020f 100644 --- a/source/smbd/trans2.c +++ b/source/smbd/trans2.c @@ -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. |