summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/include/proto.h1
-rw-r--r--source3/lib/util.c23
-rw-r--r--source3/smbd/files.c35
-rw-r--r--source3/smbwrapper/smbw.c2
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();
}
/*****************************************************