diff options
-rw-r--r-- | source3/include/proto.h | 1 | ||||
-rw-r--r-- | source3/lib/util.c | 23 | ||||
-rw-r--r-- | source3/smbd/files.c | 35 | ||||
-rw-r--r-- | source3/smbwrapper/smbw.c | 2 |
4 files changed, 34 insertions, 27 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index f89b7a7ff5..0736e3f5bd 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -347,6 +347,7 @@ char *sid_to_string(pstring sidstr_out, DOM_SID *sid); BOOL string_to_sid(DOM_SID *sidout, char *sidstr); int str_checksum(const char *s); void zero_free(void *p, size_t size); +int set_maxfiles(void); /*The following definitions come from libsmb/clientgen.c */ diff --git a/source3/lib/util.c b/source3/lib/util.c index 38cde624d4..d079f86988 100644 --- a/source3/lib/util.c +++ b/source3/lib/util.c @@ -4845,3 +4845,26 @@ void zero_free(void *p, size_t size) free(p); } + +/***************************************************************** +set our open file limit to the max and return the limit +*****************************************************************/ +int set_maxfiles(void) +{ +#if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE)) + struct rlimit rlp; + getrlimit(RLIMIT_NOFILE, &rlp); + /* Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to + * account for the extra fd we need + * as well as the log files and standard + * handles etc. */ + rlp.rlim_cur = rlp.rlim_max; + setrlimit(RLIMIT_NOFILE, &rlp); + getrlimit(RLIMIT_NOFILE, &rlp); + return rlp.rlim_cur; +#else + /* just guess ... */ + return 1024; +#endif +} + diff --git a/source3/smbd/files.c b/source3/smbd/files.c index 4000439db0..6afa059753 100644 --- a/source3/smbd/files.c +++ b/source3/smbd/files.c @@ -202,38 +202,19 @@ initialise file structures void file_init(void) { - real_max_open_files = lp_max_open_files(); - -#if (defined(HAVE_GETRLIMIT) && defined(RLIMIT_NOFILE)) - { - struct rlimit rlp; - getrlimit(RLIMIT_NOFILE, &rlp); - /* Set the fd limit to be real_max_open_files + MAX_OPEN_FUDGEFACTOR to - * account for the extra fd we need - * as well as the log files and standard - * handles etc. */ - rlp.rlim_cur = (real_max_open_files+MAX_OPEN_FUDGEFACTOR>rlp.rlim_max)? - rlp.rlim_max:real_max_open_files+MAX_OPEN_FUDGEFACTOR; - setrlimit(RLIMIT_NOFILE, &rlp); - getrlimit(RLIMIT_NOFILE, &rlp); - if(rlp.rlim_cur != (real_max_open_files + MAX_OPEN_FUDGEFACTOR)) - DEBUG(0,("file_init: Maximum number of open files requested per session \ -was %d, actual files available per session = %d\n", - real_max_open_files, (int)rlp.rlim_cur - MAX_OPEN_FUDGEFACTOR )); - - DEBUG(2,("Maximum number of open files per session is %d\n", - (int)rlp.rlim_cur - MAX_OPEN_FUDGEFACTOR)); - - real_max_open_files = (int)rlp.rlim_cur - MAX_OPEN_FUDGEFACTOR; - } -#endif + int real_max_open_files, lim; - file_bmap = bitmap_allocate(real_max_open_files); + lim = set_maxfiles(); + lim = MIN(lim, lp_max_open_files()); + real_max_open_files = lim - MAX_OPEN_FUDGEFACTOR; + + file_bmap = bitmap_allocate(real_max_open_files); + if (!file_bmap) { exit_server("out of memory in file_init"); } - + /* * Ensure that pipe_handle_oppset is set correctly. */ diff --git a/source3/smbwrapper/smbw.c b/source3/smbwrapper/smbw.c index e76b42692e..633e63ef8d 100644 --- a/source3/smbwrapper/smbw.c +++ b/source3/smbwrapper/smbw.c @@ -87,6 +87,8 @@ void smbw_init(void) DEBUG(4,("Initial cwd from getwd is %s\n", smb_cwd)); } smbw_busy--; + + set_maxfiles(); } /***************************************************** |