summaryrefslogtreecommitdiff
path: root/source3/smbd/files.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/smbd/files.c')
-rw-r--r--source3/smbd/files.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/source3/smbd/files.c b/source3/smbd/files.c
index 7069818dee..982de4c55f 100644
--- a/source3/smbd/files.c
+++ b/source3/smbd/files.c
@@ -361,6 +361,50 @@ files_struct *file_find_di_next(files_struct *start_fsp)
return NULL;
}
+/*
+ * Same as file_find_di_first/next, but also finds non-fd opens.
+ *
+ * Jeremy, do we really need the fsp->fh->fd != -1 ??
+ */
+
+struct files_struct *fsp_find_di_first(SMB_DEV_T dev, SMB_INO_T inode)
+{
+ files_struct *fsp;
+
+ if (fsp_fi_cache.dev == dev && fsp_fi_cache.inode == inode) {
+ /* Positive or negative cache hit. */
+ return fsp_fi_cache.fsp;
+ }
+
+ fsp_fi_cache.dev = dev;
+ fsp_fi_cache.inode = inode;
+
+ for (fsp=Files;fsp;fsp=fsp->next) {
+ if ((fsp->dev == dev) && (fsp->inode == inode)) {
+ /* Setup positive cache. */
+ fsp_fi_cache.fsp = fsp;
+ return fsp;
+ }
+ }
+
+ /* Setup negative cache. */
+ fsp_fi_cache.fsp = NULL;
+ return NULL;
+}
+
+struct files_struct *fsp_find_di_next(files_struct *start_fsp)
+{
+ files_struct *fsp;
+
+ for (fsp = start_fsp->next;fsp;fsp=fsp->next) {
+ if ( (fsp->dev == start_fsp->dev)
+ && (fsp->inode == start_fsp->inode) )
+ return fsp;
+ }
+
+ return NULL;
+}
+
/****************************************************************************
Find a fsp that is open for printing.
****************************************************************************/
@@ -439,6 +483,8 @@ void file_free(files_struct *fsp)
fsp->fh->ref_count--;
}
+ TALLOC_FREE(fsp->notify);
+
bitmap_clear(file_bmap, fsp->fnum - FILE_HANDLE_OFFSET);
files_used--;