diff options
author | Andrew Tridgell <tridge@samba.org> | 1998-08-16 03:04:06 +0000 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 1998-08-16 03:04:06 +0000 |
commit | f573a65b67e7a57586fec57845598e49b157ee0a (patch) | |
tree | 3d48290cafbadb22118ba4167f2c974eb51ff6c3 /source | |
parent | 3daee29636dcb2d99a0e7c08179a098befae00dc (diff) | |
download | samba-f573a65b67e7a57586fec57845598e49b157ee0a.tar.gz |
server.c: fixed a bug in close_file() with the new files.c handling code
bitmap.c: added bitmap hanlding code in preparation for increasing the
default max open files to several thousand
Diffstat (limited to 'source')
-rw-r--r-- | source/include/proto.h | 2 | ||||
-rw-r--r-- | source/include/smb.h | 29 | ||||
-rw-r--r-- | source/lib/bitmap.c | 121 | ||||
-rw-r--r-- | source/locking/locking.c | 2 | ||||
-rw-r--r-- | source/smbd/server.c | 29 |
5 files changed, 154 insertions, 29 deletions
diff --git a/source/include/proto.h b/source/include/proto.h index 9587828ea94..6f2a593f92a 100644 --- a/source/include/proto.h +++ b/source/include/proto.h @@ -1943,7 +1943,7 @@ void DirCacheFlush(int snum); /*The following definitions come from smbd/files.c */ -files_struct *find_free_file(void ); +files_struct *file_new(void ); file_fd_struct *fd_get_already_open(struct stat *sbuf); file_fd_struct *fd_get_new(void); void file_close_conn(connection_struct *conn); diff --git a/source/include/smb.h b/source/include/smb.h index 801e1344354..3b562b9d13a 100644 --- a/source/include/smb.h +++ b/source/include/smb.h @@ -494,17 +494,19 @@ typedef struct * file descriptor and process. */ -typedef struct +typedef struct file_fd_struct { - uint16 ref_count; - uint16 uid_cache_count; - uid_t uid_users_cache[10]; - uint32 dev; - uint32 inode; - int fd; - int fd_readonly; - int fd_writeonly; - int real_open_flags; + struct file_fd_struct *next, *prev; + uint16 ref_count; + uint16 uid_cache_count; + uid_t uid_users_cache[10]; + uint32 dev; + uint32 inode; + int fd; + int fdnum; + int fd_readonly; + int fd_writeonly; + int real_open_flags; } file_fd_struct; /* @@ -573,8 +575,9 @@ struct current_user GID_T *groups; }; -typedef struct +typedef struct files_struct { + struct files_struct *next, *prev; int fnum; connection_struct *conn; file_fd_struct *fd_ptr; @@ -852,6 +855,10 @@ struct parm_struct } def; }; +struct bitmap { + uint32 *b; + int n; +}; #define FLAG_BASIC 1 /* fundamental options */ #define FLAG_HIDE 2 /* options that should be hidden in SWAT */ diff --git a/source/lib/bitmap.c b/source/lib/bitmap.c new file mode 100644 index 00000000000..f67ea994e56 --- /dev/null +++ b/source/lib/bitmap.c @@ -0,0 +1,121 @@ +/* + Unix SMB/Netbios implementation. + Version 1.9. + simple bitmap functions + Copyright (C) Andrew Tridgell 1992-1998 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" + +/* these functions provide a simple way to allocate integers from a + pool without repitition */ + + +/**************************************************************************** +allocate a bitmap of the specified size +****************************************************************************/ +struct bitmap *bitmap_allocate(int n) +{ + struct bitmap *bm; + + bm = (struct bitmap *)malloc(sizeof(*bm)); + bm->n = n; + + if (!bm) return NULL; + + bm->b = (uint32 *)malloc(sizeof(bm->b[0])*(n+31)/32); + if (!bm->b) { + free(bm); + return NULL; + } + + memset(bm->b, 0, sizeof(bm->b[0])*bm->n); + + return bm; +} + +/**************************************************************************** +free a bitmap structure +****************************************************************************/ +void bitmap_free(struct bitmap *bm) +{ + free(bm->b); + bm->b = NULL; + free(bm); +} + + +/**************************************************************************** +set a bit in a bitmap +****************************************************************************/ +BOOL bitmap_set(struct bitmap *bm, unsigned i) +{ + if (i >= bm->n) return False; + bm->b[i/32] |= (1<<(i%32)); + return True; +} + +/**************************************************************************** +query a bit in a bitmap +****************************************************************************/ +BOOL bitmap_query(struct bitmap *bm, unsigned i) +{ + if (i >= bm->n) return False; + if (bm->b[i/32] & (1<<(i%32))) { + return True; + } + return False; +} + +/**************************************************************************** +find a zero bit in a bitmap starting at the specified offset, with +wraparound +****************************************************************************/ +int bitmap_find(struct bitmap *bm, unsigned ofs) +{ + int i, j; + + if (ofs > bm->n) ofs = 0; + + i = ofs; + while (i < bm->n) { + if (~(bm->b[i/32])) { + j = i; + do { + if (!bitmap_query(bm, j)) return j; + j++; + } while (j & 31 && j < bm->n); + } + i += 32; + i &= ~31; + } + + i = 0; + while (i < ofs) { + if (~(bm->b[i/32])) { + j = i; + do { + if (!bitmap_query(bm, j)) return j; + j++; + } while (j & 31 && j < bm->n); + } + i += 32; + i &= ~31; + } + + return -1; +} diff --git a/source/locking/locking.c b/source/locking/locking.c index 50c4af2265d..cdaeea6d7ed 100644 --- a/source/locking/locking.c +++ b/source/locking/locking.c @@ -494,7 +494,6 @@ int get_share_modes(connection_struct *conn, /******************************************************************* Del the share mode of a file. ********************************************************************/ - void del_share_mode(int token, files_struct *fsp) { share_ops->del_entry(token, fsp); @@ -503,7 +502,6 @@ void del_share_mode(int token, files_struct *fsp) /******************************************************************* Set the share mode of a file. Return False on fail, True on success. ********************************************************************/ - BOOL set_share_mode(int token, files_struct *fsp, uint16 port, uint16 op_type) { return share_ops->set_entry(token, fsp, port, op_type); diff --git a/source/smbd/server.c b/source/smbd/server.c index 8b656ab2646..e9aa2d0278d 100644 --- a/source/smbd/server.c +++ b/source/smbd/server.c @@ -1308,7 +1308,7 @@ static void close_filestruct(files_struct *fsp) { connection_struct *conn = fsp->conn; - file_free(fsp); + fsp->reserved = False; fsp->open = False; fsp->is_directory = False; @@ -1388,22 +1388,21 @@ void close_file(files_struct *fsp, BOOL normal_close) void close_directory(files_struct *fsp) { + /* TODO - walk the list of pending + change notify requests and free + any pertaining to this fsp. */ - /* TODO - walk the list of pending - change notify requests and free - any pertaining to this fsp. */ + remove_pending_change_notify_requests_by_fid(fsp); - remove_pending_change_notify_requests_by_fid(fsp); - - /* - * Do the code common to files and directories. - */ - close_filestruct(fsp); - - if (fsp->fsp_name) - string_free(&fsp->fsp_name); - - file_free(fsp); + /* + * Do the code common to files and directories. + */ + close_filestruct(fsp); + + if (fsp->fsp_name) + string_free(&fsp->fsp_name); + + file_free(fsp); } /**************************************************************************** |