diff options
author | Jeremy Allison <jra@samba.org> | 2000-10-06 18:13:52 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2000-10-06 18:13:52 +0000 |
commit | dfe77c7046cbd65ee52aea7439f21503c1eac41d (patch) | |
tree | 31f50133199395ecc388d39ae04db91e628b1528 /source | |
parent | e451fd346105d5d34354ff9141d445b5f1a82e0a (diff) | |
download | samba-dfe77c7046cbd65ee52aea7439f21503c1eac41d.tar.gz samba-dfe77c7046cbd65ee52aea7439f21503c1eac41d.tar.xz samba-dfe77c7046cbd65ee52aea7439f21503c1eac41d.zip |
Herb's warning fixes. Also the POSIX locking fix.
We now use our own vfs layer to do get/set acl calls (hurrah!).
Jeremy.
Diffstat (limited to 'source')
-rw-r--r-- | source/include/includes.h | 5 | ||||
-rw-r--r-- | source/include/profile.h | 72 | ||||
-rw-r--r-- | source/include/proto.h | 6 | ||||
-rw-r--r-- | source/include/smb.h | 7 | ||||
-rw-r--r-- | source/include/vfs.h | 4 | ||||
-rw-r--r-- | source/lib/kanji.c | 1 | ||||
-rw-r--r-- | source/locking/posix.c | 2 | ||||
-rw-r--r-- | source/profile/profile.c | 11 | ||||
-rw-r--r-- | source/rpc_client/cli_spoolss.c | 2 | ||||
-rw-r--r-- | source/rpc_client/cli_use.c | 2 | ||||
-rw-r--r-- | source/rpc_client/msrpc_spoolss.c | 4 | ||||
-rw-r--r-- | source/rpc_client/ncacn_np_use.c | 4 | ||||
-rw-r--r-- | source/rpc_server/srv_spoolss_nt.c | 4 | ||||
-rw-r--r-- | source/smbd/fileio.c | 55 | ||||
-rw-r--r-- | source/smbd/reply.c | 2 | ||||
-rw-r--r-- | source/smbd/statcache.c | 33 | ||||
-rw-r--r-- | source/smbd/unix_acls.c | 18 | ||||
-rw-r--r-- | source/smbd/vfs-wrap.c | 111 | ||||
-rw-r--r-- | source/smbd/vfs.c | 80 |
19 files changed, 250 insertions, 173 deletions
diff --git a/source/include/includes.h b/source/include/includes.h index ad2771665a3..da365ab953d 100644 --- a/source/include/includes.h +++ b/source/include/includes.h @@ -635,12 +635,7 @@ extern int errno; #include "msdfs.h" -#ifdef WITH_PROFILE #include "profile.h" -#else -#define START_PROFILE(x) -#define END_PROFILE(x) -#endif #ifndef MAXCODEPAGELINES #define MAXCODEPAGELINES 256 diff --git a/source/include/profile.h b/source/include/profile.h index 9b6ec462df8..d18f598021e 100644 --- a/source/include/profile.h +++ b/source/include/profile.h @@ -22,6 +22,14 @@ */ +/* + * Reasons for cache flush. + */ + +#define NUM_FLUSH_REASONS 8 /* Keep this in sync with the enum below. */ +enum flush_reason_enum { SEEK_FLUSH, READ_FLUSH, WRITE_FLUSH, READRAW_FLUSH, + OPLOCK_RELEASE_FLUSH, CLOSE_FLUSH, SYNC_FLUSH, SIZECHANGE_FLUSH }; + /* this file defines the profile structure in the profile shared memory area */ @@ -308,19 +316,61 @@ struct profile_struct { extern struct profile_struct *profile_p; +extern struct timeval profile_starttime; +extern struct timeval profile_endtime; +extern BOOL do_profile_flag; -#define INC_PROFILE_COUNT(x) if (profile_p) profile_p->x++ -#define DEC_PROFILE_COUNT(x) if (profile_p) profile_p->x-- -#define ADD_PROFILE_COUNT(x,y) if (profile_p) profile_p->x += (y) +/* these are helper macros - do not call them directly in the code + * use the DO_PROFILE_* START_PROFILE and END_PROFILE ones + * below which test for the profile flage first + */ +#define INC_PROFILE_COUNT(x) profile_p->x++ +#define DEC_PROFILE_COUNT(x) profile_p->x-- +#define ADD_PROFILE_COUNT(x,y) profile_p->x += (y) +#define PROFILE_TIME TvalDiff(&profile_starttime,&profile_endtime) +#ifdef WITH_PROFILE +#define DO_PROFILE_INC(x) \ + if (do_profile_flag) { \ + INC_PROFILE_COUNT(x); \ + } +#define DO_PROFILE_DEC(x) \ + if (do_profile_flag) { \ + DEC_PROFILE_COUNT(x); \ + } +#define DO_PROFILE_DEC_INC(x,y) \ + if (do_profile_flag) { \ + DEC_PROFILE_COUNT(x); \ + INC_PROFILE_COUNT(y); \ + } +#define DO_PROFILE_ADD(x,n) \ + if (do_profile_flag) { \ + ADD_PROFILE_COUNT(x,n); \ + } #define START_PROFILE(x) \ - struct timeval starttime; \ - struct timeval endtime; \ - GetTimeOfDay(&starttime); \ - INC_PROFILE_COUNT(x##_count) - -#define END_PROFILE(y) \ - GetTimeOfDay(&endtime); \ - ADD_PROFILE_COUNT((y##_time),TvalDiff(&starttime,&endtime)) + if (do_profile_flag) { \ + GetTimeOfDay(&profile_starttime); \ + INC_PROFILE_COUNT(x##_count); \ + } +#define START_PROFILE_BYTES(x,n) \ + if (do_profile_flag) { \ + GetTimeOfDay(&profile_starttime); \ + INC_PROFILE_COUNT(x##_count); \ + ADD_PROFILE_COUNT(x##_bytes,n); \ + } +#define END_PROFILE(x) \ + if (do_profile_flag) { \ + GetTimeOfDay(&profile_endtime); \ + ADD_PROFILE_COUNT(x##_time,PROFILE_TIME); \ + } +#else +#define DO_PROFILE_INC(x) +#define DO_PROFILE_DEC(x) +#define DO_PROFILE_DEC_INC(x,y) +#define DO_PROFILE_ADD(x,n) +#define START_PROFILE(x) +#define START_PROFILE_BYTES(x,n) +#define END_PROFILE(x) +#endif #endif diff --git a/source/include/proto.h b/source/include/proto.h index 24578564252..22c3f48f86b 100644 --- a/source/include/proto.h +++ b/source/include/proto.h @@ -3793,7 +3793,6 @@ int sslutil_negotiate_ssl(int fd, int msg_type); /*The following definitions come from smbd/statcache.c */ -void print_stat_cache_statistics(void); void stat_cache_add( char *full_orig_name, char *orig_translated_path); BOOL stat_cache_lookup(connection_struct *conn, char *name, char *dirpath, char **start, SMB_STRUCT_STAT *pst); @@ -3834,7 +3833,7 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd); /*The following definitions come from smbd/vfs-wrap.c */ int vfswrap_dummy_connect(connection_struct *conn, char *service, char *user); -void vfswrap_dummy_disconnect(void); +void vfswrap_dummy_disconnect(connection_struct *conn); SMB_BIG_UINT vfswrap_disk_free(connection_struct *conn, char *path, BOOL small_query, SMB_BIG_UINT *bsize, SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize); DIR *vfswrap_opendir(connection_struct *conn, char *fname); @@ -3860,6 +3859,9 @@ char *vfswrap_getwd(connection_struct *conn, char *path); int vfswrap_utime(connection_struct *conn, char *path, struct utimbuf *times); int vfswrap_ftruncate(files_struct *fsp, int fd, SMB_OFF_T offset); BOOL vfswrap_lock(files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type); +size_t vfswrap_fget_nt_acl(files_struct *fsp, int fd, SEC_DESC **ppdesc); +size_t vfswrap_get_nt_acl(files_struct *fsp, char *name, SEC_DESC **ppdesc); +BOOL vfswrap_fset_nt_acl(files_struct *fsp, int fd, uint32 security_info_sent, SEC_DESC *psd); /*The following definitions come from smbd/vfs.c */ diff --git a/source/include/smb.h b/source/include/smb.h index 24211b0d50d..4d4aef088ef 100644 --- a/source/include/smb.h +++ b/source/include/smb.h @@ -617,13 +617,6 @@ struct current_user NT_USER_TOKEN *nt_user_token; }; -/* - * Reasons for cache flush. - */ - -#define NUM_FLUSH_REASONS 8 /* Keep this in sync with the enum below. */ -enum flush_reason_enum { SEEK_FLUSH, READ_FLUSH, WRITE_FLUSH, READRAW_FLUSH, - OPLOCK_RELEASE_FLUSH, CLOSE_FLUSH, SYNC_FLUSH, SIZECHANGE_FLUSH }; /* Defines for the sent_oplock_break field above. */ #define NO_BREAK_SENT 0 #define EXCLUSIVE_BREAK_SENT 1 diff --git a/source/include/vfs.h b/source/include/vfs.h index fb089c86cc7..3624311c301 100644 --- a/source/include/vfs.h +++ b/source/include/vfs.h @@ -78,9 +78,9 @@ struct vfs_ops { BOOL (*lock)(struct files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type); size_t (*fget_nt_acl)(struct files_struct *fsp, int fd, struct security_descriptor_info **ppdesc); - size_t (*get_nt_acl)(struct connection_struct *conn, char *name, struct security_descriptor_info **ppdesc); + size_t (*get_nt_acl)(struct files_struct *fsp, char *name, struct security_descriptor_info **ppdesc); BOOL (*fset_nt_acl)(struct files_struct *fsp, int fd, uint32 security_info_sent, struct security_descriptor_info *psd); - BOOL (*set_nt_acl)(struct connection_struct *conn, char *name, uint32 security_info_sent, struct security_descriptor_info *psd); + BOOL (*set_nt_acl)(struct files_struct *fsp, char *name, uint32 security_info_sent, struct security_descriptor_info *psd); }; struct vfs_options { diff --git a/source/lib/kanji.c b/source/lib/kanji.c index ca81933a195..294b6a623a3 100644 --- a/source/lib/kanji.c +++ b/source/lib/kanji.c @@ -693,7 +693,6 @@ static int euc3sjis (int hi, int lo, BOOL is_3byte) } } } - return ((GETAHI << 8) | GETALO); } /******************************************************************* diff --git a/source/locking/posix.c b/source/locking/posix.c index 7bac1ffe379..fbdcf662fc9 100644 --- a/source/locking/posix.c +++ b/source/locking/posix.c @@ -408,7 +408,7 @@ static BOOL does_lock_overlap(SMB_OFF_T start1, SMB_OFF_T size1, SMB_OFF_T start if (start1 >= start2 && start1 <= start2 + size2) return True; - if (start1 < start2 && start1 + size1 > start2); + if (start1 < start2 && start1 + size1 > start2) return True; return False; diff --git a/source/profile/profile.c b/source/profile/profile.c index c2d9b4ce89e..5b8b280c293 100644 --- a/source/profile/profile.c +++ b/source/profile/profile.c @@ -22,7 +22,6 @@ #include "includes.h" -#ifdef WITH_PROFILE #include <sys/shm.h> extern int DEBUGLEVEL; @@ -34,6 +33,11 @@ static BOOL read_only; struct profile_struct *profile_p; +BOOL do_profile_flag = False; + +struct timeval profile_starttime; +struct timeval profile_endtime; + /******************************************************************* open the profiling shared memory area ******************************************************************/ @@ -99,10 +103,7 @@ BOOL profile_setup(BOOL rdonly) DEBUG(3,("Initialised profile area\n")); } + do_profile_flag = True; /* temp for now */ return True; } -#else - /* to keep compilers happy about empty modules */ - void profile_dummy(void) {} -#endif diff --git a/source/rpc_client/cli_spoolss.c b/source/rpc_client/cli_spoolss.c index 19e269a323c..3517fbbc9c8 100644 --- a/source/rpc_client/cli_spoolss.c +++ b/source/rpc_client/cli_spoolss.c @@ -679,7 +679,7 @@ uint32 spoolss_getprinterdata(const POLICY_HND *hnd, const UNISTR2 *valuename, DEBUG(5,("SPOOLSS Get Printer data)\n")); - make_spoolss_q_getprinterdata(&q_o, hnd, valuename, in_size); + make_spoolss_q_getprinterdata(&q_o, hnd,(UNISTR2 *)valuename, in_size); /* turn parameters into data stream */ if (spoolss_io_q_getprinterdata("", &q_o, &buf, 0) && diff --git a/source/rpc_client/cli_use.c b/source/rpc_client/cli_use.c index 7cc4477b579..93560e9772b 100644 --- a/source/rpc_client/cli_use.c +++ b/source/rpc_client/cli_use.c @@ -172,7 +172,7 @@ static struct cli_use *cli_find(const char *srv_name, { continue; } - if (!reuse && !pwd_compare(&usr_creds->pwd, &c->cli->pwd)) + if (!reuse && !pwd_compare((struct pwd_info *)&usr_creds->pwd, &c->cli->pwd)) { DEBUG(100, ("password doesn't match\n")); continue; diff --git a/source/rpc_client/msrpc_spoolss.c b/source/rpc_client/msrpc_spoolss.c index a841af82d01..a7a25caaea2 100644 --- a/source/rpc_client/msrpc_spoolss.c +++ b/source/rpc_client/msrpc_spoolss.c @@ -391,7 +391,7 @@ uint32 msrpc_spoolss_getprinterdata( const char* printer_name, init_buffer(buffer, size, mem_ctx); status = spoolss_getprinterdata(&hnd, &uni_val_name, size, type, &size, - data, &needed); + (unsigned char *)data, &needed); if (status == ERROR_INSUFFICIENT_BUFFER) { @@ -400,7 +400,7 @@ uint32 msrpc_spoolss_getprinterdata( const char* printer_name, data = prs_data_p(&buffer->prs); status = spoolss_getprinterdata(&hnd, &uni_val_name, size, type, &size, - data, &needed); + (unsigned char *)data, &needed); } if (mem_ctx) diff --git a/source/rpc_client/ncacn_np_use.c b/source/rpc_client/ncacn_np_use.c index 8e5c7240461..1a3938b6e9d 100644 --- a/source/rpc_client/ncacn_np_use.c +++ b/source/rpc_client/ncacn_np_use.c @@ -77,7 +77,7 @@ static BOOL ncacn_np_establish_connection(struct ncacn_np *cli, return False; } /* if (!cli_nt_session_open(cli->smb, pipe_name, &cli->fnum)) by JERRY */ - if (!cli_nt_session_open(cli->smb, pipe_name)) + if (!cli_nt_session_open(cli->smb, (char *)pipe_name)) { cli_net_use_del(srv_name, ntc, False, NULL); return False; @@ -331,7 +331,7 @@ static struct ncacn_np_use *ncacn_np_find(const char *srv_name, continue; } if (!reuse - && !pwd_compare(&usr_creds->pwd, &c->cli->smb->pwd)) + && !pwd_compare((struct pwd_info *)&usr_creds->pwd, &c->cli->smb->pwd)) { DEBUG(100, ("password doesn't match\n")); continue; diff --git a/source/rpc_server/srv_spoolss_nt.c b/source/rpc_server/srv_spoolss_nt.c index c32ca8d8713..5a724d6ab64 100644 --- a/source/rpc_server/srv_spoolss_nt.c +++ b/source/rpc_server/srv_spoolss_nt.c @@ -358,16 +358,14 @@ static BOOL set_printer_hnd_printertype(Printer_entry *Printer, char *handlename if (!strchr(handlename+2, '\\')) { DEBUGADD(4,("Printer is a print server\n")); Printer->printer_type = PRINTER_HANDLE_IS_PRINTSERVER; - return True; } /* it's a printer */ else { DEBUGADD(4,("Printer is a printer\n")); Printer->printer_type = PRINTER_HANDLE_IS_PRINTER; - return True; } - return False; + return True; } /**************************************************************************** diff --git a/source/smbd/fileio.c b/source/smbd/fileio.c index b8a0585d90e..bb7ab46baa9 100644 --- a/source/smbd/fileio.c +++ b/source/smbd/fileio.c @@ -83,9 +83,7 @@ BOOL read_from_write_cache(files_struct *fsp,char *data,SMB_OFF_T pos,size_t n) memcpy(data, wcp->data + (pos - wcp->offset), n); -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_read_hits); -#endif + DO_PROFILE_INC(writecache_read_hits); return True; } @@ -183,9 +181,9 @@ ssize_t write_file(files_struct *fsp, char *data, SMB_OFF_T pos, size_t n) } #ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_total_writes); + DO_PROFILE_INC(writecache_total_writes); if (!fsp->oplock_type) { - INC_PROFILE_COUNT(writecache_non_oplock_writes); + DO_PROFILE_INC(writecache_non_oplock_writes); } #endif @@ -296,9 +294,7 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", #endif if(!wcp) { -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_direct_writes); -#endif + DO_PROFILE_INC(writecache_direct_writes); return real_write_file(fsp, data, pos, n); } @@ -350,9 +346,7 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", pos += data_used; n -= data_used; -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_abutted_writes); -#endif + DO_PROFILE_INC(writecache_abutted_writes); total_written = data_used; write_path = 1; @@ -388,9 +382,7 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", cache_flush_needed = True; -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_abutted_writes); -#endif + DO_PROFILE_INC(writecache_abutted_writes); total_written = data_used; write_path = 2; @@ -460,9 +452,7 @@ nonop=%u allocated=%u active=%u direct=%u perfect=%u readhits=%u\n", pos += data_used; n -= data_used; -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_abutted_writes); -#endif + DO_PROFILE_INC(writecache_abutted_writes); total_written = data_used; write_path = 3; @@ -494,9 +484,7 @@ len = %u\n",fsp->fd, (double)pos, (unsigned int)n, (double)wcp->offset, (unsigne if ( n <= wcp->alloc_size && n > wcp->data_size) { cache_flush_needed = True; } else { -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_direct_writes); -#endif + DO_PROFILE_INC(writecache_direct_writes); return real_write_file(fsp, data, pos, n); } @@ -525,9 +513,7 @@ n = %u, wcp->offset=%.0f, wcp->data_size=%u\n", if (n > wcp->alloc_size ) { if(real_write_file(fsp, data, pos, n) == -1) return -1; -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_direct_writes); -#endif + DO_PROFILE_INC(writecache_direct_writes); return total_written + n; } @@ -538,17 +524,15 @@ n = %u, wcp->offset=%.0f, wcp->data_size=%u\n", if (n) { #ifdef WITH_PROFILE if (wcp->data_size) { - INC_PROFILE_COUNT(writecache_abutted_writes); + DO_PROFILE_INC(writecache_abutted_writes); } else { - INC_PROFILE_COUNT(writecache_init_writes); + DO_PROFILE_INC(writecache_init_writes); } #endif memcpy(wcp->data+wcp->data_size, data, n); if (wcp->data_size == 0) { wcp->offset = pos; -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_num_write_caches); -#endif + DO_PROFILE_INC(writecache_num_write_caches); } wcp->data_size += n; DEBUG(9,("cache return %u\n", (unsigned int)n)); @@ -573,9 +557,7 @@ void delete_write_cache(files_struct *fsp) if(!(wcp = fsp->wcp)) return; -#ifdef WITH_PROFILE - DEC_PROFILE_COUNT(writecache_allocated_write_caches); -#endif + DO_PROFILE_DEC(writecache_allocated_write_caches); allocated_write_caches--; SMB_ASSERT(wcp->data_size == 0); @@ -621,9 +603,7 @@ static BOOL setup_write_cache(files_struct *fsp, SMB_OFF_T file_size) } fsp->wcp = wcp; -#ifdef WITH_PROFILE - INC_PROFILE_COUNT(writecache_allocated_write_caches); -#endif + DO_PROFILE_INC(writecache_allocated_write_caches); allocated_write_caches++; DEBUG(10,("setup_write_cache: File %s allocated write cache size %u\n", @@ -659,17 +639,14 @@ ssize_t flush_write_cache(files_struct *fsp, enum flush_reason_enum reason) data_size = wcp->data_size; wcp->data_size = 0; -#ifdef WITH_PROFILE - DEC_PROFILE_COUNT(writecache_num_write_caches); - INC_PROFILE_COUNT(writecache_flushed_writes[reason]); -#endif + DO_PROFILE_DEC_INC(writecache_num_write_caches,writecache_flushed_writes[reason]); DEBUG(9,("flushing write cache: fd = %d, off=%.0f, size=%u\n", fsp->fd, (double)wcp->offset, (unsigned int)data_size)); #ifdef WITH_PROFILE if(data_size == wcp->alloc_size) - INC_PROFILE_COUNT(writecache_num_perfect_writes); + DO_PROFILE_INC(writecache_num_perfect_writes); #endif return real_write_file(fsp, wcp->data, wcp->offset, data_size); diff --git a/source/smbd/reply.c b/source/smbd/reply.c index e64875a8058..fd4ff23461f 100644 --- a/source/smbd/reply.c +++ b/source/smbd/reply.c @@ -1034,7 +1034,7 @@ int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size BOOL ok = False; BOOL bad_path = False; SMB_STRUCT_STAT st; - START_PROFILE(SMBchkpth_count); + START_PROFILE(SMBchkpth); pstrcpy(name,smb_buf(inbuf) + 1); diff --git a/source/smbd/statcache.c b/source/smbd/statcache.c index b66c5e2fe9e..8d756a1d466 100644 --- a/source/smbd/statcache.c +++ b/source/smbd/statcache.c @@ -30,28 +30,6 @@ extern BOOL case_sensitive; Stat cache code used in unix_convert. *****************************************************************************/ -static int global_stat_cache_lookups; -static int global_stat_cache_misses; -static int global_stat_cache_hits; - -/**************************************************************************** - Stat cache statistics code. -*****************************************************************************/ - -void print_stat_cache_statistics(void) -{ - double eff; - - if(global_stat_cache_lookups == 0) - return; - - eff = (100.0* (double)global_stat_cache_hits)/(double)global_stat_cache_lookups; - - DEBUG(0,("stat cache stats: lookups = %d, hits = %d, misses = %d, \ -stat cache was %f%% effective.\n", global_stat_cache_lookups, - global_stat_cache_hits, global_stat_cache_misses, eff )); -} - typedef struct { int name_len; char names[2]; /* This is extended via malloc... */ @@ -175,13 +153,14 @@ BOOL stat_cache_lookup(connection_struct *conn, char *name, char *dirpath, namelen = strlen(name); *start = name; - global_stat_cache_lookups++; + + DO_PROFILE_INC(statcache_lookups); /* * Don't lookup trivial valid directory entries. */ if((*name == '\0') || (strcmp(name, ".") == 0) || (strcmp(name, "..") == 0)) { - global_stat_cache_misses++; + DO_PROFILE_INC(statcache_misses); return False; } @@ -202,17 +181,17 @@ BOOL stat_cache_lookup(connection_struct *conn, char *name, char *dirpath, /* * We reached the end of the name - no match. */ - global_stat_cache_misses++; + DO_PROFILE_INC(statcache_misses); return False; } if((*chk_name == '\0') || (strcmp(chk_name, ".") == 0) || (strcmp(chk_name, "..") == 0)) { - global_stat_cache_misses++; + DO_PROFILE_INC(statcache_misses); return False; } } else { scp = (stat_cache_entry *)(hash_elem->value); - global_stat_cache_hits++; + DO_PROFILE_INC(statcache_hits); trans_name = scp->names+scp->name_len+1; if(conn->vfs_ops.stat(conn,dos_to_unix(trans_name,False), pst) != 0) { /* Discard this entry - it doesn't exist in the filesystem. */ diff --git a/source/smbd/unix_acls.c b/source/smbd/unix_acls.c index d32f1cfaae4..2e16611b0cb 100644 --- a/source/smbd/unix_acls.c +++ b/source/smbd/unix_acls.c @@ -352,15 +352,6 @@ size_t get_nt_acl(files_struct *fsp, SEC_DESC **ppdesc) sid_copy( &group_sid, &global_sid_World); } else { - /* - * If there is a VFS redirect, use it. - */ - - if ((fsp->is_directory || fsp->fd == -1) && fsp->conn->vfs_ops.get_nt_acl) - return fsp->conn->vfs_ops.get_nt_acl(fsp->conn,dos_to_unix(fsp->fsp_name, False), ppdesc); - else if (fsp->conn->vfs_ops.fget_nt_acl) - return fsp->conn->vfs_ops.fget_nt_acl(fsp,fsp->fd, ppdesc); - if(fsp->is_directory || fsp->fd == -1) { if(vfs_stat(fsp->conn,fsp->fsp_name, &sbuf) != 0) { return 0; @@ -463,15 +454,6 @@ BOOL set_nt_acl(files_struct *fsp, uint32 security_info_sent, SEC_DESC *psd) BOOL got_dacl = False; /* - * If there is a VFS redirect, use it. - */ - - if ((fsp->is_directory || fsp->fd == -1) && fsp->conn->vfs_ops.set_nt_acl) - return fsp->conn->vfs_ops.set_nt_acl(conn,dos_to_unix(fsp->fsp_name, False), security_info_sent, psd); - else if (fsp->conn->vfs_ops.fset_nt_acl) - return fsp->conn->vfs_ops.fset_nt_acl(fsp,fsp->fd, security_info_sent, psd); - - /* * Get the current state of the file. */ diff --git a/source/smbd/vfs-wrap.c b/source/smbd/vfs-wrap.c index 7495a766875..3b8d5eebcc9 100644 --- a/source/smbd/vfs-wrap.c +++ b/source/smbd/vfs-wrap.c @@ -34,7 +34,7 @@ int vfswrap_dummy_connect(connection_struct *conn, char *service, char *user) return 0; /* Return >= 0 for success */ } -void vfswrap_dummy_disconnect(void) +void vfswrap_dummy_disconnect(connection_struct *conn) { } @@ -63,6 +63,8 @@ DIR *vfswrap_opendir(connection_struct *conn, char *fname) { DIR *result; + START_PROFILE(syscall_opendir); + #ifdef VFS_CHECK_NULL if (fname == NULL) { smb_panic("NULL pointer passed to vfswrap_opendir()\n"); @@ -70,6 +72,7 @@ DIR *vfswrap_opendir(connection_struct *conn, char *fname) #endif result = opendir(fname); + END_PROFILE(syscall_opendir); return result; } @@ -77,6 +80,8 @@ struct dirent *vfswrap_readdir(connection_struct *conn, DIR *dirp) { struct dirent *result; + START_PROFILE(syscall_readdir); + #ifdef VFS_CHECK_NULL if (dirp == NULL) { smb_panic("NULL pointer passed to vfswrap_readdir()\n"); @@ -84,6 +89,7 @@ struct dirent *vfswrap_readdir(connection_struct *conn, DIR *dirp) #endif result = readdir(dirp); + END_PROFILE(syscall_readdir); return result; } @@ -91,6 +97,8 @@ int vfswrap_mkdir(connection_struct *conn, char *path, mode_t mode) { int result; + START_PROFILE(syscall_mkdir); + #ifdef VFS_CHECK_NULL if (path == NULL) { smb_panic("NULL pointer passed to vfswrap_mkdir()\n"); @@ -98,6 +106,7 @@ int vfswrap_mkdir(connection_struct *conn, char *path, mode_t mode) #endif result = mkdir(path, mode); + END_PROFILE(syscall_mkdir); return result; } @@ -105,6 +114,8 @@ int vfswrap_rmdir(connection_struct *conn, char *path) { int result; + START_PROFILE(syscall_rmdir); + #ifdef VFS_CHECK_NULL if (path == NULL) { smb_panic("NULL pointer passed to vfswrap_rmdir()\n"); @@ -112,6 +123,7 @@ int vfswrap_rmdir(connection_struct *conn, char *path) #endif result = rmdir(path); + END_PROFILE(syscall_rmdir); return result; } @@ -119,6 +131,8 @@ int vfswrap_closedir(connection_struct *conn, DIR *dirp) { int result; + START_PROFILE(syscall_closedir); + #ifdef VFS_CHECK_NULL if (dirp == NULL) { smb_panic("NULL pointer passed to vfswrap_closedir()\n"); @@ -126,6 +140,7 @@ int vfswrap_closedir(connection_struct *conn, DIR *dirp) #endif result = closedir(dirp); + END_PROFILE(syscall_closedir); return result; } @@ -135,6 +150,8 @@ int vfswrap_open(connection_struct *conn, char *fname, int flags, mode_t mode) { int result; + START_PROFILE(syscall_open); + #ifdef VFS_CHECK_NULL if (fname == NULL) { smb_panic("NULL pointer passed to vfswrap_open()\n"); @@ -142,6 +159,7 @@ int vfswrap_open(connection_struct *conn, char *fname, int flags, mode_t mode) #endif result = sys_open(fname, flags, mode); + END_PROFILE(syscall_open); return result; } @@ -149,7 +167,10 @@ int vfswrap_close(files_struct *fsp, int fd) { int result; + START_PROFILE(syscall_close); + result = close(fd); + END_PROFILE(syscall_close); return result; } @@ -157,6 +178,8 @@ ssize_t vfswrap_read(files_struct *fsp, int fd, char *data, size_t n) { ssize_t result; + START_PROFILE_BYTES(syscall_read, n); + #ifdef VFS_CHECK_NULL if (data == NULL) { smb_panic("NULL pointer passed to vfswrap_read()\n"); @@ -164,6 +187,7 @@ ssize_t vfswrap_read(files_struct *fsp, int fd, char *data, size_t n) #endif result = read(fd, data, n); + END_PROFILE(syscall_read); return result; } @@ -171,6 +195,8 @@ ssize_t vfswrap_write(files_struct *fsp, int fd, char *data, size_t n) { ssize_t result; + START_PROFILE_BYTES(syscall_write, n); + #ifdef VFS_CHECK_NULL if (data == NULL) { smb_panic("NULL pointer passed to vfswrap_write()\n"); @@ -178,6 +204,7 @@ ssize_t vfswrap_write(files_struct *fsp, int fd, char *data, size_t n) #endif result = write(fd, data, n); + END_PROFILE(syscall_write); return result; } @@ -185,7 +212,10 @@ SMB_OFF_T vfswrap_lseek(files_struct *fsp, int filedes, SMB_OFF_T offset, int wh { SMB_OFF_T result; + START_PROFILE(syscall_lseek); + result = sys_lseek(filedes, offset, whence); + END_PROFILE(syscall_lseek); return result; } @@ -193,6 +223,8 @@ int vfswrap_rename(connection_struct *conn, char *old, char *new) { int result; + START_PROFILE(syscall_rename); + #ifdef VFS_CHECK_NULL if ((old == NULL) || (new == NULL)) { smb_panic("NULL pointer passed to vfswrap_rename()\n"); @@ -200,13 +232,20 @@ int vfswrap_rename(connection_struct *conn, char *old, char *new) #endif result = rename(old, new); + END_PROFILE(syscall_rename); return result; } int vfswrap_fsync(files_struct *fsp, int fd) { #ifdef HAVE_FSYNC - return fsync(fd); + int result; + + START_PROFILE(syscall_fsync); + + result = fsync(fd); + END_PROFILE(syscall_fsync); + return result; #else return 0; #endif @@ -216,6 +255,8 @@ int vfswrap_stat(connection_struct *conn, char *fname, SMB_STRUCT_STAT *sbuf) { int result; + START_PROFILE(syscall_stat); + #ifdef VFS_CHECK_NULL if ((fname == NULL) || (sbuf == NULL)) { smb_panic("NULL pointer passed to vfswrap_stat()\n"); @@ -223,6 +264,7 @@ int vfswrap_stat(connection_struct *conn, char *fname, SMB_STRUCT_STAT *sbuf) #endif result = sys_stat(fname, sbuf); + END_PROFILE(syscall_stat); return result; } @@ -230,6 +272,8 @@ int vfswrap_fstat(files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf) { int result; + START_PROFILE(syscall_fstat); + #ifdef VFS_CHECK_NULL if (sbuf == NULL) { smb_panic("NULL pointer passed to vfswrap_fstat()\n"); @@ -237,6 +281,7 @@ int vfswrap_fstat(files_struct *fsp, int fd, SMB_STRUCT_STAT *sbuf) #endif result = sys_fstat(fd, sbuf); + END_PROFILE(syscall_fstat); return result; } @@ -244,6 +289,8 @@ int vfswrap_lstat(connection_struct *conn, char *path, SMB_STRUCT_STAT *sbuf) { int result; + START_PROFILE(syscall_lstat); + #ifdef VFS_CHECK_NULL if ((path == NULL) || (sbuf == NULL)) { smb_panic("NULL pointer passed to vfswrap_lstat()\n"); @@ -251,6 +298,7 @@ int vfswrap_lstat(connection_struct *conn, char *path, SMB_STRUCT_STAT *sbuf) #endif result = sys_lstat(path, sbuf); + END_PROFILE(syscall_lstat); return result; } @@ -258,6 +306,8 @@ int vfswrap_unlink(connection_struct *conn, char *path) { int result; + START_PROFILE(syscall_unlink); + #ifdef VFS_CHECK_NULL if (path == NULL) { smb_panic("NULL pointer passed to vfswrap_unlink()\n"); @@ -265,6 +315,7 @@ int vfswrap_unlink(connection_struct *conn, char *path) #endif result = unlink(path); + END_PROFILE(syscall_unlink); return result; } @@ -272,6 +323,8 @@ int vfswrap_chmod(connection_struct *conn, char *path, mode_t mode) { int result; + START_PROFILE(syscall_chmod); + #ifdef VFS_CHECK_NULL if (path == NULL) { smb_panic("NULL pointer passed to vfswrap_chmod()\n"); @@ -279,6 +332,7 @@ int vfswrap_chmod(connection_struct *conn, char *path, mode_t mode) #endif result = chmod(path, mode); + END_PROFILE(syscall_chmod); return result; } @@ -286,6 +340,8 @@ int vfswrap_chown(connection_struct *conn, char *path, uid_t uid, gid_t gid) { int result; + START_PROFILE(syscall_chown); + #ifdef VFS_CHECK_NULL if (path == NULL) { smb_panic("NULL pointer passed to vfswrap_chown()\n"); @@ -293,35 +349,50 @@ int vfswrap_chown(connection_struct *conn, char *path, uid_t uid, gid_t gid) #endif result = sys_chown(path, uid, gid); + END_PROFILE(syscall_chown); return result; } int vfswrap_chdir(connection_struct *conn, char *path) { + int result; + + START_PROFILE(syscall_chdir); + #ifdef VFS_CHECK_NULL if (path == NULL) { smb_panic("NULL pointer passed to vfswrap_chdir()\n"); } #endif - return chdir(path); + result = chdir(path); + END_PROFILE(syscall_chdir); + return result; } char *vfswrap_getwd(connection_struct *conn, char *path) { + char *result; + + START_PROFILE(syscall_getwd); + #ifdef VFS_CHECK_NULL if (path == NULL) { smb_panic("NULL pointer passed to vfswrap_getwd()\n"); } #endif - return sys_getwd(path); + result = sys_getwd(path); + END_PROFILE(syscall_getwd); + return result; } int vfswrap_utime(connection_struct *conn, char *path, struct utimbuf *times) { int result; + START_PROFILE(syscall_utime); + #ifdef VFS_CHECK_NULL if ((path == NULL) || (times == NULL)) { smb_panic("NULL pointer passed to vfswrap_utime()\n"); @@ -329,6 +400,7 @@ int vfswrap_utime(connection_struct *conn, char *path, struct utimbuf *times) #endif result = utime(path, times); + END_PROFILE(syscall_utime); return result; } @@ -336,11 +408,40 @@ int vfswrap_ftruncate(files_struct *fsp, int fd, SMB_OFF_T offset) { int result; + START_PROFILE(syscall_ftruncate); + result = sys_ftruncate(fd, offset); + END_PROFILE(syscall_ftruncate); return result; } BOOL vfswrap_lock(files_struct *fsp, int fd, int op, SMB_OFF_T offset, SMB_OFF_T count, int type) { - return fcntl_lock(fd, op, offset, count,type); + BOOL result; + + START_PROFILE(syscall_fcntl_lock); + + result = fcntl_lock(fd, op, offset, count,type); + END_PROFILE(syscall_fcntl_lock); + return result; +} + +size_t vfswrap_fget_nt_acl(files_struct *fsp, int fd, SEC_DESC **ppdesc) +{ + return get_nt_acl(fsp, ppdesc); +} + +size_t vfswrap_get_nt_acl(files_struct *fsp, char *name, SEC_DESC **ppdesc) +{ + return get_nt_acl(fsp, ppdesc); +} + +BOOL vfswrap_fset_nt_acl(files_struct *fsp, int fd, uint32 security_info_sent, SEC_DESC *psd) +{ + return set_nt_acl(fsp, security_info_sent, psd); +} + +BOOL vfswrap_set_nt_acl(files_struct *fsp, char *name, uint32 security_info_sent, SEC_DESC *psd) +{ + return set_nt_acl(fsp, security_info_sent, psd); } diff --git a/source/smbd/vfs.c b/source/smbd/vfs.c index 6b1b5ed22de..467f3e47a2b 100644 --- a/source/smbd/vfs.c +++ b/source/smbd/vfs.c @@ -26,8 +26,8 @@ extern int DEBUGLEVEL; /* Some structures to help us initialise the vfs operations table */ struct vfs_syminfo { - char *name; - void *fptr; + char *name; + void *fptr; }; /* Default vfs hooks. WARNING: The order of these initialisers is @@ -36,44 +36,44 @@ struct vfs_syminfo { struct vfs_ops default_vfs_ops = { - /* Disk operations */ - - vfswrap_dummy_connect, - vfswrap_dummy_disconnect, - vfswrap_disk_free, - - /* Directory operations */ - - vfswrap_opendir, - vfswrap_readdir, - vfswrap_mkdir, - vfswrap_rmdir, - vfswrap_closedir, - - /* File operations */ - - vfswrap_open, - vfswrap_close, - vfswrap_read, - vfswrap_write, - vfswrap_lseek, - vfswrap_rename, - vfswrap_fsync, - vfswrap_stat, - vfswrap_fstat, - vfswrap_lstat, - vfswrap_unlink, - vfswrap_chmod, - vfswrap_chown, - vfswrap_chdir, - vfswrap_getwd, - vfswrap_utime, - vfswrap_ftruncate, - vfswrap_lock, - NULL, /* The 4 security descriptor functions are not defined by default. */ - NULL, - NULL, - NULL + /* Disk operations */ + + vfswrap_dummy_connect, + vfswrap_dummy_disconnect, + vfswrap_disk_free, + + /* Directory operations */ + + vfswrap_opendir, + vfswrap_readdir, + vfswrap_mkdir, + vfswrap_rmdir, + vfswrap_closedir, + + /* File operations */ + + vfswrap_open, + vfswrap_close, + vfswrap_read, + vfswrap_write, + vfswrap_lseek, + vfswrap_rename, + vfswrap_fsync, + vfswrap_stat, + vfswrap_fstat, + vfswrap_lstat, + vfswrap_unlink, + vfswrap_chmod, + vfswrap_chown, + vfswrap_chdir, + vfswrap_getwd, + vfswrap_utime, + vfswrap_ftruncate, + vfswrap_lock, + vfswrap_fget_nt_acl, + vfswrap_get_nt_acl, + vfswrap_fset_nt_acl, + vfswrap_set_nt_acl }; /**************************************************************************** |