This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
/* A singleton cache to speed up searching by dev/inode. */
static struct fsp_singleton_cache {
files_struct *fsp;
- SMB_DEV_T dev;
- SMB_INO_T inode;
+ struct file_id id;
} fsp_fi_cache;
/****************************************************************************
fsp->fh->fd = -1;
fsp->conn = conn;
- fsp->fh->file_id = get_gen_count();
+ fsp->fh->gen_id = get_gen_count();
GetTimeOfDay(&fsp->open_time);
first_file = (i+1) % real_max_open_files;
chain_fsp = fsp;
- /* A new fsp invalidates a negative fsp_fi_cache. */
- if (fsp_fi_cache.fsp == NULL) {
- ZERO_STRUCT(fsp_fi_cache);
- }
+ /* A new fsp invalidates the positive and
+ negative fsp_fi_cache as the new fsp is pushed
+ at the start of the list and we search from
+ a cache hit to the *end* of the list. */
+
+ ZERO_STRUCT(fsp_fi_cache);
*result = fsp;
return NT_STATUS_OK;
files_struct *fsp;
for (fsp=Files;fsp;fsp=fsp->next,count++) {
- DEBUG(10,("Files[%d], fnum = %d, name %s, fd = %d, fileid = %lu, dev = %x, inode = %.0f\n",
- count, fsp->fnum, fsp->fsp_name, fsp->fh->fd, (unsigned long)fsp->fh->file_id,
- (unsigned int)fsp->dev, (double)fsp->inode ));
+ DEBUG(10,("Files[%d], fnum = %d, name %s, fd = %d, gen = %lu, fileid=%s\n",
+ count, fsp->fnum, fsp->fsp_name, fsp->fh->fd, (unsigned long)fsp->fh->gen_id,
+ file_id_string_tos(&fsp->file_id)));
}
}
Find a fsp given a device, inode and file_id.
****************************************************************************/
-files_struct *file_find_dif(SMB_DEV_T dev, SMB_INO_T inode, unsigned long file_id)
+files_struct *file_find_dif(struct file_id id, unsigned long gen_id)
{
int count=0;
files_struct *fsp;
for (fsp=Files;fsp;fsp=fsp->next,count++) {
/* We can have a fsp->fh->fd == -1 here as it could be a stat open. */
- if (fsp->dev == dev &&
- fsp->inode == inode &&
- fsp->fh->file_id == file_id ) {
+ if (file_id_equal(&fsp->file_id, &id) &&
+ fsp->fh->gen_id == gen_id ) {
if (count > 10) {
DLIST_PROMOTE(Files, fsp);
}
if ((fsp->fh->fd == -1) &&
(fsp->oplock_type != NO_OPLOCK) &&
(fsp->oplock_type != FAKE_LEVEL_II_OPLOCK)) {
- DEBUG(0,("file_find_dif: file %s dev = %x, inode = %.0f, file_id = %u \
-oplock_type = %u is a stat open with oplock type !\n", fsp->fsp_name, (unsigned int)fsp->dev,
- (double)fsp->inode, (unsigned int)fsp->fh->file_id,
- (unsigned int)fsp->oplock_type ));
- smb_panic("file_find_dif\n");
+ DEBUG(0,("file_find_dif: file %s file_id = %s, gen = %u \
+oplock_type = %u is a stat open with oplock type !\n", fsp->fsp_name,
+ file_id_string_tos(&fsp->file_id),
+ (unsigned int)fsp->fh->gen_id,
+ (unsigned int)fsp->oplock_type ));
+ smb_panic("file_find_dif");
}
return fsp;
}
calls.
****************************************************************************/
-files_struct *file_find_di_first(SMB_DEV_T dev, SMB_INO_T inode)
+files_struct *file_find_di_first(struct file_id id)
{
files_struct *fsp;
- if (fsp_fi_cache.dev == dev && fsp_fi_cache.inode == inode) {
+ if (file_id_equal(&fsp_fi_cache.id, &id)) {
/* Positive or negative cache hit. */
return fsp_fi_cache.fsp;
}
- fsp_fi_cache.dev = dev;
- fsp_fi_cache.inode = inode;
+ fsp_fi_cache.id = id;
for (fsp=Files;fsp;fsp=fsp->next) {
- if ( fsp->fh->fd != -1 &&
- fsp->dev == dev &&
- fsp->inode == inode ) {
+ if (file_id_equal(&fsp->file_id, &id)) {
/* Setup positive cache. */
fsp_fi_cache.fsp = fsp;
return fsp;
files_struct *fsp;
for (fsp = start_fsp->next;fsp;fsp=fsp->next) {
- if ( fsp->fh->fd != -1 &&
- fsp->dev == start_fsp->dev &&
- fsp->inode == start_fsp->inode )
+ if (file_id_equal(&fsp->file_id, &start_fsp->file_id)) {
return fsp;
+ }
}
return NULL;
return NULL;
}
-/****************************************************************************
- Set a pending modtime across all files with a given dev/ino pair.
- Record the owner of that modtime.
-****************************************************************************/
-
-void fsp_set_pending_modtime(files_struct *tfsp, time_t pmod)
-{
- files_struct *fsp;
-
- if (null_mtime(pmod)) {
- return;
- }
-
- for (fsp = Files;fsp;fsp=fsp->next) {
- if ( fsp->fh->fd != -1 &&
- fsp->dev == tfsp->dev &&
- fsp->inode == tfsp->inode ) {
- fsp->pending_modtime = pmod;
- fsp->pending_modtime_owner = False;
- }
- }
-
- tfsp->pending_modtime_owner = True;
-}
-
/****************************************************************************
Sync open files on a connection.
****************************************************************************/
fsp->fh->ref_count--;
}
+ if (fsp->notify) {
+ notify_remove(fsp->conn->notify_ctx, fsp);
+ TALLOC_FREE(fsp->notify);
+ }
+
+ /* Ensure this event will never fire. */
+ TALLOC_FREE(fsp->oplock_timeout);
+
+ /* Ensure this event will never fire. */
+ TALLOC_FREE(fsp->update_write_time_event);
+
bitmap_clear(file_bmap, fsp->fnum - FILE_HANDLE_OFFSET);
files_used--;
ZERO_STRUCT(fsp_fi_cache);
}
+ /* Drop all remaining extensions. */
+ while (fsp->vfs_extension) {
+ vfs_remove_fsp_extension(fsp->vfs_extension->owner, fsp);
+ }
+
SAFE_FREE(fsp);
}
Get an fsp from a packet given the offset of a 16 bit fnum.
****************************************************************************/
-files_struct *file_fsp(char *buf, int where)
+files_struct *file_fsp(uint16 fid)
{
files_struct *fsp;
return chain_fsp;
}
- if (!buf) {
- return NULL;
- }
-
- fsp = file_fnum(SVAL(buf, where));
+ fsp = file_fnum(fid);
if (fsp) {
chain_fsp = fsp;
}
dup_fsp->fh = fsp->fh;
dup_fsp->fh->ref_count++;
- dup_fsp->dev = fsp->dev;
- dup_fsp->inode = fsp->inode;
+ dup_fsp->file_id = fsp->file_id;
dup_fsp->initial_allocation_size = fsp->initial_allocation_size;
dup_fsp->mode = fsp->mode;
dup_fsp->file_pid = fsp->file_pid;
dup_fsp->open_time = fsp->open_time;
dup_fsp->access_mask = access_mask;
dup_fsp->share_access = share_access;
- dup_fsp->pending_modtime_owner = fsp->pending_modtime_owner;
- dup_fsp->pending_modtime = fsp->pending_modtime;
- dup_fsp->last_write_time = fsp->last_write_time;
dup_fsp->oplock_type = fsp->oplock_type;
dup_fsp->can_lock = fsp->can_lock;
dup_fsp->can_read = (access_mask & (FILE_READ_DATA)) ? True : False;
dup_fsp->print_file = fsp->print_file;
dup_fsp->modified = fsp->modified;
dup_fsp->is_directory = fsp->is_directory;
- dup_fsp->is_stat = fsp->is_stat;
dup_fsp->aio_write_behind = fsp->aio_write_behind;
string_set(&dup_fsp->fsp_name,fsp->fsp_name);