From 636f146abf0a75cd3b21a57b50627ee149a635ab Mon Sep 17 00:00:00 2001 From: Jeremy Allison Date: Fri, 6 Oct 2000 03:21:49 +0000 Subject: Restructuring of vfs layer to include a "this" pointer - can be an fsp or a conn struct depending on the call. We need this to have a clean NT ACL call interface. This will break any existing VFS libraries (that's why this is pre-release code). Andrew gets credit for this one :-) :-). In addition - added Herb's WITH_PROFILE changes - Herb - please examine the changes I've made to the smbd/reply.c code you added. The original code was very ugly and I have replaced it with a START_PROFILE(x)/END_PROFILE(x) pair using the preprocessor. Please check this compiles ok with the --with-profile switch. Jeremy. (This used to be commit b07611f8159b0b3f42e7e02611be9f4d56de96f5) --- source3/smbd/reply.c | 456 ++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 358 insertions(+), 98 deletions(-) (limited to 'source3/smbd/reply.c') diff --git a/source3/smbd/reply.c b/source3/smbd/reply.c index b98ae441ac..e64875a805 100644 --- a/source3/smbd/reply.c +++ b/source3/smbd/reply.c @@ -214,6 +214,7 @@ int reply_tcon(connection_struct *conn, uint16 vuid = SVAL(inbuf,smb_uid); int pwlen=0; int ecode = -1; + START_PROFILE(SMBtcon); *service = *user = *password = *dev = 0; @@ -242,6 +243,7 @@ int reply_tcon(connection_struct *conn, conn = make_connection(service,user,password,pwlen,dev,vuid,&ecode); if (!conn) { + END_PROFILE(SMBtcon); return(connection_error(inbuf,outbuf,ecode)); } @@ -253,6 +255,7 @@ int reply_tcon(connection_struct *conn, DEBUG(3,("tcon service=%s user=%s cnum=%d\n", service, user, conn->cnum)); + END_PROFILE(SMBtcon); return(outsize); } @@ -271,6 +274,7 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt int passlen = SVAL(inbuf,smb_vwv3); char *path; char *p; + START_PROFILE(SMBtconX); *service = *user = *password = *devicename = 0; @@ -294,8 +298,10 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt } p = strchr(path+2,'\\'); - if (!p) + if (!p) { + END_PROFILE(SMBtconX); return(ERROR(ERRDOS,ERRnosuchshare)); + } fstrcpy(service,p+1); p = strchr(service,'%'); if (p) { @@ -327,8 +333,10 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt conn = make_connection(service,user,password,passlen,devicename,vuid,&ecode); - if (!conn) + if (!conn) { + END_PROFILE(SMBtconX); return(connection_error(inbuf,outbuf,ecode)); + } if (Protocol < PROTOCOL_NT1) { set_message(outbuf,2,strlen(devicename)+1,True); @@ -359,6 +367,7 @@ int reply_tcon_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt SSVAL(inbuf,smb_tid,conn->cnum); SSVAL(outbuf,smb_tid,conn->cnum); + END_PROFILE(SMBtconX); return chain_reply(inbuf,outbuf,length,bufsize); } @@ -390,6 +399,7 @@ int reply_ioctl(connection_struct *conn, int replysize, outsize; char *p; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBioctl); DEBUG(4, ("Received IOCTL (code 0x%x)\n", ioctl_code)); @@ -399,6 +409,7 @@ int reply_ioctl(connection_struct *conn, replysize = 32; break; default: + END_PROFILE(SMBioctl); return(ERROR(ERRSRV,ERRnosupport)); } @@ -417,6 +428,7 @@ int reply_ioctl(connection_struct *conn, break; } + END_PROFILE(SMBioctl); return outsize; } @@ -653,6 +665,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int static BOOL done_sesssetup = False; BOOL doencrypt = SMBENCRYPT(); char *domain = ""; + START_PROFILE(SMBsesssetupX); *smb_apasswd = 0; *smb_ntpasswd = 0; @@ -801,6 +814,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int /* say yes to everything ending in $. */ if (*user && (user[strlen(user) - 1] == '$') && (smb_apasslen == 24) && (smb_ntpasslen == 24)) { + END_PROFILE(SMBsesssetupX); return session_trust_account(conn, inbuf, outbuf, user, smb_apasswd, smb_apasslen, smb_ntpasswd, smb_ntpasslen); @@ -816,6 +830,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int */ if (!*user && !*smb_apasswd && !*domain) { DEBUG(0, ("restrict anonymous is True and anonymous connection attempted. Denying access.\n")); + END_PROFILE(SMBsesssetupX); return(ERROR(ERRDOS,ERRnoaccess)); } } @@ -913,6 +928,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int if (lp_map_to_guest() == NEVER_MAP_TO_GUEST) { DEBUG(1,("Rejecting user '%s': authentication failed\n", user)); + END_PROFILE(SMBsesssetupX); return bad_password_error(inbuf,outbuf); } @@ -921,6 +937,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int if (smb_getpwnam(user,True)) { DEBUG(1,("Rejecting user '%s': bad password\n", user)); + END_PROFILE(SMBsesssetupX); return bad_password_error(inbuf,outbuf); } } @@ -976,6 +993,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int const struct passwd *pw = smb_getpwnam(user,False); if (!pw) { DEBUG(1,("Username %s is invalid on this system\n",user)); + END_PROFILE(SMBsesssetupX); return bad_password_error(inbuf,outbuf); } gid = pw->pw_gid; @@ -1000,6 +1018,7 @@ int reply_sesssetup_and_X(connection_struct *conn, char *inbuf,char *outbuf,int done_sesssetup = True; + END_PROFILE(SMBsesssetupX); return chain_reply(inbuf,outbuf,length,bufsize); } @@ -1015,6 +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); pstrcpy(name,smb_buf(inbuf) + 1); @@ -1061,6 +1081,7 @@ int reply_chkpth(connection_struct *conn, char *inbuf,char *outbuf, int dum_size DEBUG(3,("chkpth %s mode=%d\n", name, mode)); + END_PROFILE(SMBchkpth); return(outsize); } @@ -1078,6 +1099,7 @@ int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size SMB_OFF_T size=0; time_t mtime=0; BOOL bad_path = False; + START_PROFILE(SMBgetatr); pstrcpy(fname,smb_buf(inbuf) + 1); @@ -1122,6 +1144,7 @@ int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBgetatr); return(UNIXERROR(ERRDOS,ERRbadfile)); } @@ -1144,6 +1167,7 @@ int reply_getatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size DEBUG( 3, ( "getatr name=%s mode=%d size=%d\n", fname, mode, (uint32)size ) ); + END_PROFILE(SMBgetatr); return(outsize); } @@ -1160,6 +1184,7 @@ int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size time_t mtime; SMB_STRUCT_STAT st; BOOL bad_path = False; + START_PROFILE(SMBsetatr); pstrcpy(fname,smb_buf(inbuf) + 1); unix_convert(fname,conn,0,&bad_path,&st); @@ -1182,6 +1207,7 @@ int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBsetatr); return(UNIXERROR(ERRDOS,ERRnoaccess)); } @@ -1189,6 +1215,7 @@ int reply_setatr(connection_struct *conn, char *inbuf,char *outbuf, int dum_size DEBUG( 3, ( "setatr name=%s mode=%d\n", fname, mode ) ); + END_PROFILE(SMBsetatr); return(outsize); } @@ -1200,8 +1227,9 @@ int reply_dskattr(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz { int outsize = 0; SMB_BIG_UINT dfree,dsize,bsize; + START_PROFILE(SMBdskattr); - conn->vfs_ops.disk_free(".",True,&bsize,&dfree,&dsize); + conn->vfs_ops.disk_free(conn,".",True,&bsize,&dfree,&dsize); outsize = set_message(outbuf,5,0,True); @@ -1212,6 +1240,7 @@ int reply_dskattr(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz DEBUG(3,("dskattr dfree=%d\n", (unsigned int)dfree)); + END_PROFILE(SMBdskattr); return(outsize); } @@ -1244,6 +1273,7 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size BOOL expect_close = False; BOOL can_open = True; BOOL bad_path = False; + START_PROFILE(SMBsearch); *mask = *directory = *fname = 0; @@ -1324,8 +1354,10 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size unix_ERR_class = ERRDOS; unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBsearch); return (UNIXERROR(ERRDOS,ERRnofids)); } + END_PROFILE(SMBsearch); return(ERROR(ERRDOS,ERRnofids)); } dptr_set_wcard(dptr_num, strdup(mask)); @@ -1416,6 +1448,7 @@ int reply_search(connection_struct *conn, char *inbuf,char *outbuf, int dum_size smb_fn_name(CVAL(inbuf,smb_com)), mask, directory, dirtype, numentries, maxentries ) ); + END_PROFILE(SMBsearch); return(outsize); } @@ -1430,14 +1463,17 @@ int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size char *path; char status[21]; int dptr_num= -2; + START_PROFILE(SMBfclose); outsize = set_message(outbuf,1,0,True); path = smb_buf(inbuf) + 1; status_len = SVAL(smb_buf(inbuf),3 + strlen(path)); - if (status_len == 0) + if (status_len == 0) { + END_PROFILE(SMBfclose); return(ERROR(ERRSRV,ERRsrverror)); + } memcpy(status,smb_buf(inbuf) + 1 + strlen(path) + 4,21); @@ -1450,6 +1486,7 @@ int reply_fclose(connection_struct *conn, char *inbuf,char *outbuf, int dum_size DEBUG(3,("search close\n")); + END_PROFILE(SMBfclose); return(outsize); } @@ -1472,6 +1509,7 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, BOOL bad_path = False; files_struct *fsp; int oplock_request = CORE_OPLOCK_REQUEST(inbuf); + START_PROFILE(SMBopen); share_mode = SVAL(inbuf,smb_vwv0); @@ -1493,11 +1531,13 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, unix_ERR_class = ERRDOS; unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBopen); return(UNIXERROR(ERRDOS,ERRnoaccess)); } - if (fsp->conn->vfs_ops.fstat(fsp->fd,&sbuf) != 0) { + if (vfs_fstat(fsp,fsp->fd,&sbuf) != 0) { close_file(fsp,False); + END_PROFILE(SMBopen); return(ERROR(ERRDOS,ERRnoaccess)); } @@ -1508,6 +1548,7 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, if (fmode & aDIR) { DEBUG(3,("attempt to open a directory %s\n",fname)); close_file(fsp,False); + END_PROFILE(SMBopen); return(ERROR(ERRDOS,ERRnoaccess)); } @@ -1527,6 +1568,7 @@ int reply_open(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, if(EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type)) CVAL(outbuf,smb_flg) |= CORE_OPLOCK_GRANTED; + END_PROFILE(SMBopen); return(outsize); } @@ -1557,13 +1599,17 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt int smb_action = 0; BOOL bad_path = False; files_struct *fsp; + START_PROFILE(SMBopenX); /* If it's an IPC, pass off the pipe handler. */ if (IS_IPC(conn)) { - if (lp_nt_pipe_support()) + if (lp_nt_pipe_support()) { + END_PROFILE(SMBopenX); return reply_open_pipe_and_X(conn, inbuf,outbuf,length,bufsize); - else + } else { + END_PROFILE(SMBopenX); return (ERROR(ERRSRV,ERRaccess)); + } } /* XXXX we need to handle passed times, sattr and flags */ @@ -1586,11 +1632,13 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt unix_ERR_class = ERRDOS; unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBopenX); return(UNIXERROR(ERRDOS,ERRnoaccess)); } - if (fsp->conn->vfs_ops.fstat(fsp->fd,&sbuf) != 0) { + if (vfs_fstat(fsp,fsp->fd,&sbuf) != 0) { close_file(fsp,False); + END_PROFILE(SMBopenX); return(ERROR(ERRDOS,ERRnoaccess)); } @@ -1599,6 +1647,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt mtime = sbuf.st_mtime; if (fmode & aDIR) { close_file(fsp,False); + END_PROFILE(SMBopenX); return(ERROR(ERRDOS,ERRnoaccess)); } @@ -1639,6 +1688,7 @@ int reply_open_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt SSVAL(outbuf,smb_vwv8,rmode); SSVAL(outbuf,smb_vwv11,smb_action); + END_PROFILE(SMBopenX); return chain_reply(inbuf,outbuf,length,bufsize); } @@ -1650,6 +1700,7 @@ int reply_ulogoffX(connection_struct *conn, char *inbuf,char *outbuf,int length, { uint16 vuid = SVAL(inbuf,smb_uid); user_struct *vuser = get_valid_user_struct(vuid); + START_PROFILE(SMBulogoffX); if(vuser == 0) { DEBUG(3,("ulogoff, vuser id %d does not map to user.\n", vuid)); @@ -1667,6 +1718,7 @@ int reply_ulogoffX(connection_struct *conn, char *inbuf,char *outbuf,int length, DEBUG( 3, ( "ulogoffX vuid=%d\n", vuid ) ); + END_PROFILE(SMBulogoffX); return chain_reply(inbuf,outbuf,length,bufsize); } @@ -1685,6 +1737,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, BOOL bad_path = False; files_struct *fsp; int oplock_request = CORE_OPLOCK_REQUEST(inbuf); + START_PROFILE(SMBcreate); com = SVAL(inbuf,smb_com); @@ -1724,6 +1777,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, unix_ERR_class = ERRDOS; unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBcreate); return(UNIXERROR(ERRDOS,ERRnoaccess)); } @@ -1741,6 +1795,7 @@ int reply_mknew(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, DEBUG( 3, ( "mknew %s fd=%d dmode=%d umode=%o\n", fname, fsp->fd, createmode, (int)unixmode ) ); + END_PROFILE(SMBcreate); return(outsize); } @@ -1758,6 +1813,7 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, BOOL bad_path = False; files_struct *fsp; int oplock_request = CORE_OPLOCK_REQUEST(inbuf); + START_PROFILE(SMBctemp); createmode = SVAL(inbuf,smb_vwv0); pstrcpy(fname,smb_buf(inbuf)+1); @@ -1783,6 +1839,7 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, unix_ERR_class = ERRDOS; unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBctemp); return(UNIXERROR(ERRDOS,ERRnoaccess)); } @@ -1802,6 +1859,7 @@ int reply_ctemp(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, DEBUG( 3, ( "ctemp %s fd=%d dmode=%d umode=%o\n", fname2, fsp->fd, createmode, (int)unixmode ) ); + END_PROFILE(SMBctemp); return(outsize); } @@ -1816,7 +1874,7 @@ static BOOL can_delete(char *fname,connection_struct *conn, int dirtype) if (!CAN_WRITE(conn)) return(False); - if (conn->vfs_ops.lstat(dos_to_unix(fname,False),&sbuf) != 0) return(False); + if (conn->vfs_ops.lstat(conn,dos_to_unix(fname,False),&sbuf) != 0) return(False); fmode = dos_mode(conn,fname,&sbuf); if (fmode & aDIR) return(False); if (!lp_delete_readonly(SNUM(conn))) { @@ -1846,6 +1904,7 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size BOOL exists=False; BOOL bad_path = False; BOOL rc = True; + START_PROFILE(SMBunlink); *directory = *mask = 0; @@ -1919,7 +1978,7 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size error = ERRnoaccess; slprintf(fname,sizeof(fname)-1, "%s/%s",directory,dname); if (!can_delete(fname,conn,dirtype)) continue; - if (!conn->vfs_ops.unlink(dos_to_unix(fname,False))) count++; + if (!vfs_unlink(conn,fname)) count++; DEBUG(3,("reply_unlink : doing unlink on %s\n",fname)); } CloseDir(dirptr); @@ -1927,21 +1986,24 @@ int reply_unlink(connection_struct *conn, char *inbuf,char *outbuf, int dum_size } if (count == 0) { - if (exists) + if (exists) { + END_PROFILE(SMBunlink); return(ERROR(ERRDOS,error)); - else + } else { if((errno == ENOENT) && bad_path) { unix_ERR_class = ERRDOS; unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBunlink); return(UNIXERROR(ERRDOS,error)); } } outsize = set_message(outbuf,0,0,True); + END_PROFILE(SMBunlink); return(outsize); } @@ -1958,6 +2020,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s char *header = outbuf; ssize_t ret=0; files_struct *fsp; + START_PROFILE(SMBreadbraw); /* * Special check if an oplock break has been issued @@ -1970,6 +2033,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s _smb_setlen(header,0); transfer_file(0,smbd_server_fd(),(SMB_OFF_T)0,header,4,0); DEBUG(5,("readbraw - oplock break finished\n")); + END_PROFILE(SMBreadbraw); return -1; } @@ -1982,6 +2046,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s DEBUG(3,("fnum %d not open in readbraw - cache prime?\n",(int)SVAL(inbuf,smb_vwv0))); _smb_setlen(header,0); transfer_file(0,smbd_server_fd(),(SMB_OFF_T)0,header,4,0); + END_PROFILE(SMBreadbraw); return(-1); } @@ -2009,6 +2074,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s 64 bit offsets.\n", (unsigned int)IVAL(inbuf,smb_vwv8) )); _smb_setlen(header,0); transfer_file(0,smbd_server_fd(),(SMB_OFF_T)0,header,4,0); + END_PROFILE(SMBreadbraw); return(-1); } @@ -2019,6 +2085,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s (double)startpos )); _smb_setlen(header,0); transfer_file(0,smbd_server_fd(),(SMB_OFF_T)0,header,4,0); + END_PROFILE(SMBreadbraw); return(-1); } } @@ -2037,7 +2104,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s if (size < sizeneeded) { SMB_STRUCT_STAT st; - if (fsp->conn->vfs_ops.fstat(fsp->fd,&st) == 0) + if (vfs_fstat(fsp,fsp->fd,&st) == 0) size = st.st_size; if (!fsp->can_write) fsp->size = size; @@ -2060,7 +2127,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s _smb_setlen(header,nread); if ((nread-predict) > 0) { - if(conn->vfs_ops.seek(fsp,startpos + predict) == -1) { + if(conn->vfs_ops.seek(fsp,fsp->fd,startpos + predict) == -1) { DEBUG(0,("reply_readbraw: ERROR: seek_file failed.\n")); ret = 0; seek_fail = True; @@ -2068,7 +2135,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s } if(!seek_fail) - ret = (ssize_t)vfs_transfer_file(-1, fsp->fd, Client, NULL, + ret = (ssize_t)vfs_transfer_file(-1, fsp, fsp->fd, Client, NULL, (SMB_OFF_T)(nread-predict),header,4+predict, startpos+predict); } @@ -2086,6 +2153,7 @@ int reply_readbraw(connection_struct *conn, char *inbuf, char *outbuf, int dum_s #endif /* UNSAFE_READRAW */ DEBUG(5,("readbraw finished\n")); + END_PROFILE(SMBreadbraw); return -1; } @@ -2103,6 +2171,7 @@ int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length int eclass; uint32 ecode; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBlockread); CHECK_FSP(fsp,conn); CHECK_READ(fsp); @@ -2130,15 +2199,19 @@ int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length * onto the blocking lock queue. */ if(push_blocking_lock_request(inbuf, length, -1, 0)) + END_PROFILE(SMBlockread); return -1; } + END_PROFILE(SMBlockread); return (ERROR(eclass,ecode)); } nread = read_file(fsp,data,startpos,numtoread); - if (nread < 0) + if (nread < 0) { + END_PROFILE(SMBlockread); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } outsize += nread; SSVAL(outbuf,smb_vwv0,nread); @@ -2148,6 +2221,7 @@ int reply_lockread(connection_struct *conn, char *inbuf,char *outbuf, int length DEBUG( 3, ( "lockread fnum=%d num=%d nread=%d\n", fsp->fnum, (int)numtoread, (int)nread ) ); + END_PROFILE(SMBlockread); return(outsize); } @@ -2164,6 +2238,7 @@ int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int size, int SMB_OFF_T startpos; int outsize = 0; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBread); CHECK_FSP(fsp,conn); CHECK_READ(fsp); @@ -2176,14 +2251,18 @@ int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int size, int numtoread = MIN(BUFFER_SIZE-outsize,numtoread); data = smb_buf(outbuf) + 3; - if (is_locked(fsp,conn,(SMB_BIG_UINT)numtoread,(SMB_BIG_UINT)startpos, READ_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)numtoread,(SMB_BIG_UINT)startpos, READ_LOCK)) { + END_PROFILE(SMBread); return(ERROR(ERRDOS,ERRlock)); + } if (numtoread > 0) nread = read_file(fsp,data,startpos,numtoread); - if (nread < 0) + if (nread < 0) { + END_PROFILE(SMBread); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } outsize += nread; SSVAL(outbuf,smb_vwv0,nread); @@ -2194,6 +2273,7 @@ int reply_read(connection_struct *conn, char *inbuf,char *outbuf, int size, int DEBUG( 3, ( "read fnum=%d num=%d nread=%d\n", fsp->fnum, (int)numtoread, (int)nread ) ); + END_PROFILE(SMBread); return(outsize); } @@ -2209,10 +2289,13 @@ int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt size_t smb_mincnt = SVAL(inbuf,smb_vwv6); ssize_t nread = -1; char *data; + START_PROFILE(SMBreadX); /* If it's an IPC, pass off the pipe handler. */ - if (IS_IPC(conn)) + if (IS_IPC(conn)) { + END_PROFILE(SMBreadX); return reply_pipe_read_and_X(inbuf,outbuf,length,bufsize); + } CHECK_FSP(fsp,conn); CHECK_READ(fsp); @@ -2237,6 +2320,7 @@ int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt if(IVAL(inbuf,smb_vwv10) != 0) { DEBUG(0,("reply_read_and_X - large offset (%x << 32) used and we don't support \ 64 bit offsets.\n", (unsigned int)IVAL(inbuf,smb_vwv10) )); + END_PROFILE(SMBreadX); return(ERROR(ERRDOS,ERRbadaccess)); } @@ -2244,12 +2328,16 @@ int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt } - if (is_locked(fsp,conn,(SMB_BIG_UINT)smb_maxcnt,(SMB_BIG_UINT)startpos, READ_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)smb_maxcnt,(SMB_BIG_UINT)startpos, READ_LOCK)) { + END_PROFILE(SMBreadX); return(ERROR(ERRDOS,ERRlock)); + } nread = read_file(fsp,data,startpos,smb_maxcnt); - if (nread < 0) + if (nread < 0) { + END_PROFILE(SMBreadX); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } SSVAL(outbuf,smb_vwv5,nread); SSVAL(outbuf,smb_vwv6,smb_offset(data,outbuf)); @@ -2258,6 +2346,7 @@ int reply_read_and_X(connection_struct *conn, char *inbuf,char *outbuf,int lengt DEBUG( 3, ( "readX fnum=%d min=%d max=%d nread=%d\n", fsp->fnum, (int)smb_mincnt, (int)smb_maxcnt, (int)nread ) ); + END_PROFILE(SMBreadX); return chain_reply(inbuf,outbuf,length,bufsize); } @@ -2276,6 +2365,7 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size, BOOL write_through; files_struct *fsp = file_fsp(inbuf,smb_vwv0); int outsize = 0; + START_PROFILE(SMBwritebraw); CHECK_FSP(fsp,conn); CHECK_WRITE(fsp); @@ -2299,8 +2389,10 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size, CVAL(inbuf,smb_com) = SMBwritec; CVAL(outbuf,smb_com) = SMBwritec; - if (is_locked(fsp,conn,(SMB_BIG_UINT)tcount,(SMB_BIG_UINT)startpos, WRITE_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)tcount,(SMB_BIG_UINT)startpos, WRITE_LOCK)) { + END_PROFILE(SMBwritebraw); return(ERROR(ERRDOS,ERRlock)); + } if (numtowrite>0) nwritten = write_file(fsp,data,startpos,numtowrite); @@ -2308,8 +2400,10 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size, DEBUG(3,("writebraw1 fnum=%d start=%.0f num=%d wrote=%d sync=%d\n", fsp->fnum, (double)startpos, (int)numtowrite, (int)nwritten, (int)write_through)); - if (nwritten < numtowrite) + if (nwritten < numtowrite) { + END_PROFILE(SMBwritebraw); return(UNIXERROR(ERRHRD,ERRdiskfull)); + } total_written = nwritten; @@ -2358,8 +2452,10 @@ int reply_writebraw(connection_struct *conn, char *inbuf,char *outbuf, int size, /* we won't return a status if write through is not selected - this follows what WfWg does */ - if (!write_through && total_written==tcount) + END_PROFILE(SMBwritebraw); + if (!write_through && total_written==tcount) { return(-1); + } return(outsize); } @@ -2378,6 +2474,7 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz uint32 ecode; files_struct *fsp = file_fsp(inbuf,smb_vwv0); int outsize = 0; + START_PROFILE(SMBwriteunlock); CHECK_FSP(fsp,conn); CHECK_WRITE(fsp); @@ -2387,8 +2484,10 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz startpos = IVAL(inbuf,smb_vwv2); data = smb_buf(inbuf) + 3; - if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) { + END_PROFILE(SMBwriteunlock); return(ERROR(ERRDOS,ERRlock)); + } /* The special X/Open SMB protocol handling of zero length writes is *NOT* done for @@ -2401,11 +2500,15 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz if (lp_syncalways(SNUM(conn))) sync_file(conn,fsp); - if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) + if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) { + END_PROFILE(SMBwriteunlock); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } - if(!do_unlock(fsp, conn, (SMB_BIG_UINT)numtowrite, (SMB_BIG_UINT)startpos, &eclass, &ecode)) + if(!do_unlock(fsp, conn, (SMB_BIG_UINT)numtowrite, (SMB_BIG_UINT)startpos, &eclass, &ecode)) { + END_PROFILE(SMBwriteunlock); return(ERROR(eclass,ecode)); + } outsize = set_message(outbuf,1,0,True); @@ -2414,6 +2517,7 @@ int reply_writeunlock(connection_struct *conn, char *inbuf,char *outbuf, int siz DEBUG( 3, ( "writeunlock fnum=%d num=%d wrote=%d\n", fsp->fnum, (int)numtowrite, (int)nwritten ) ); + END_PROFILE(SMBwriteunlock); return(outsize); } @@ -2428,10 +2532,13 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d char *data; files_struct *fsp = file_fsp(inbuf,smb_vwv0); int outsize = 0; + START_PROFILE(SMBwrite); /* If it's an IPC, pass off the pipe handler. */ - if (IS_IPC(conn)) + if (IS_IPC(conn)) { + END_PROFILE(SMBwrite); return reply_pipe_write(inbuf,outbuf,size,dum_buffsize); + } CHECK_FSP(fsp,conn); CHECK_WRITE(fsp); @@ -2441,8 +2548,10 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d startpos = IVAL(inbuf,smb_vwv2); data = smb_buf(inbuf) + 3; - if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) { + END_PROFILE(SMBwrite); return(ERROR(ERRDOS,ERRlock)); + } /* X/Open SMB protocol says that if smb_vwv1 is zero then the file size should be extended or @@ -2456,8 +2565,10 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d if (lp_syncalways(SNUM(conn))) sync_file(conn,fsp); - if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) + if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) { + END_PROFILE(SMBwrite); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } outsize = set_message(outbuf,1,0,True); @@ -2471,6 +2582,7 @@ int reply_write(connection_struct *conn, char *inbuf,char *outbuf,int size,int d DEBUG(3,("write fnum=%d num=%d wrote=%d\n", fsp->fnum, (int)numtowrite, (int)nwritten)); + END_PROFILE(SMBwrite); return(outsize); } @@ -2487,17 +2599,22 @@ int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int leng ssize_t nwritten = -1; unsigned int smb_doff = SVAL(inbuf,smb_vwv11); char *data; + START_PROFILE(SMBwriteX); /* If it's an IPC, pass off the pipe handler. */ - if (IS_IPC(conn)) + if (IS_IPC(conn)) { + END_PROFILE(SMBwriteX); return reply_pipe_write_and_X(inbuf,outbuf,length,bufsize); + } CHECK_FSP(fsp,conn); CHECK_WRITE(fsp); CHECK_ERROR(fsp); - if(smb_doff > smb_len(inbuf)) + if(smb_doff > smb_len(inbuf)) { + END_PROFILE(SMBwriteX); return(ERROR(ERRDOS,ERRbadmem)); + } data = smb_base(inbuf) + smb_doff; @@ -2517,14 +2634,17 @@ int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int leng if(IVAL(inbuf,smb_vwv12) != 0) { DEBUG(0,("reply_write_and_X - large offset (%x << 32) used and we don't support \ 64 bit offsets.\n", (unsigned int)IVAL(inbuf,smb_vwv12) )); + END_PROFILE(SMBwriteX); return(ERROR(ERRDOS,ERRbadaccess)); } #endif /* LARGE_SMB_OFF_T */ } - if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) { + END_PROFILE(SMBwriteX); return(ERROR(ERRDOS,ERRlock)); + } /* X/Open SMB protocol says that, unlike SMBwrite if the length is zero then NO truncation is @@ -2535,8 +2655,10 @@ int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int leng else nwritten = write_file(fsp,data,startpos,numtowrite); - if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) + if(((nwritten == 0) && (numtowrite != 0))||(nwritten < 0)) { + END_PROFILE(SMBwriteX); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } set_message(outbuf,6,0,True); @@ -2553,6 +2675,7 @@ int reply_write_and_X(connection_struct *conn, char *inbuf,char *outbuf,int leng if (lp_syncalways(SNUM(conn)) || write_through) sync_file(conn,fsp); + END_PROFILE(SMBwriteX); return chain_reply(inbuf,outbuf,length,bufsize); } @@ -2568,6 +2691,7 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int int mode,umode; int outsize = 0; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBlseek); CHECK_FSP(fsp,conn); CHECK_ERROR(fsp); @@ -2585,7 +2709,7 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int umode = SEEK_SET; break; } - if((res = conn->vfs_ops.lseek(fsp->fd,startpos,umode)) == -1) { + if((res = conn->vfs_ops.lseek(fsp,fsp->fd,startpos,umode)) == -1) { /* * Check for the special case where a seek before the start * of the file sets the offset to zero. Added in the CIFS spec, @@ -2597,8 +2721,10 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int if(umode == SEEK_CUR) { - if((current_pos = conn->vfs_ops.lseek(fsp->fd,0,SEEK_CUR)) == -1) + if((current_pos = conn->vfs_ops.lseek(fsp,fsp->fd,0,SEEK_CUR)) == -1) { + END_PROFILE(SMBlseek); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } current_pos += startpos; @@ -2606,18 +2732,22 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int SMB_STRUCT_STAT sbuf; - if(conn->vfs_ops.fstat(fsp->fd, &sbuf) == -1) + if(vfs_fstat(fsp,fsp->fd, &sbuf) == -1) { + END_PROFILE(SMBlseek); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } current_pos += sbuf.st_size; } if(current_pos < 0) - res = conn->vfs_ops.lseek(fsp->fd,0,SEEK_SET); + res = conn->vfs_ops.lseek(fsp,fsp->fd,0,SEEK_SET); } - if(res == -1) + if(res == -1) { + END_PROFILE(SMBlseek); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } } fsp->pos = res; @@ -2628,6 +2758,7 @@ int reply_lseek(connection_struct *conn, char *inbuf,char *outbuf, int size, int DEBUG(3,("lseek fnum=%d ofs=%.0f newpos = %.0f mode=%d\n", fsp->fnum, (double)startpos, (double)res, mode)); + END_PROFILE(SMBlseek); return(outsize); } @@ -2639,6 +2770,7 @@ int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int size, int { int outsize = set_message(outbuf,0,0,True); files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBflush); if (fsp) { CHECK_FSP(fsp,conn); @@ -2652,6 +2784,7 @@ int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int size, int } DEBUG(3,("flush\n")); + END_PROFILE(SMBflush); return(outsize); } @@ -2662,9 +2795,13 @@ int reply_flush(connection_struct *conn, char *inbuf,char *outbuf, int size, int int reply_exit(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize) { - int outsize = set_message(outbuf,0,0,True); + int outsize; + START_PROFILE(SMBexit); + outsize = set_message(outbuf,0,0,True); + DEBUG(3,("exit\n")); + END_PROFILE(SMBexit); return(outsize); } @@ -2679,12 +2816,15 @@ int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size, time_t mtime; int32 eclass = 0, err = 0; files_struct *fsp = NULL; + START_PROFILE(SMBclose); outsize = set_message(outbuf,0,0,True); /* If it's an IPC, pass off to the pipe handler. */ - if (IS_IPC(conn)) + if (IS_IPC(conn)) { + END_PROFILE(SMBclose); return reply_pipe_close(conn, inbuf,outbuf); + } fsp = file_fsp(inbuf,smb_vwv0); @@ -2692,8 +2832,10 @@ int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size, * We can only use CHECK_FSP if we know it's not a directory. */ - if(!fsp || (fsp->conn != conn)) + if(!fsp || (fsp->conn != conn)) { + END_PROFILE(SMBclose); return(ERROR(ERRDOS,ERRbadfid)); + } if(HAS_CACHED_ERROR(fsp)) { eclass = fsp->wbmpx_ptr->wr_errclass; @@ -2740,14 +2882,18 @@ int reply_close(connection_struct *conn, char *inbuf,char *outbuf, int size, if((close_err = close_file(fsp,True)) != 0) { errno = close_err; + END_PROFILE(SMBclose); return (UNIXERROR(ERRHRD,ERRgeneral)); } } /* We have a cached error */ - if(eclass || err) + if(eclass || err) { + END_PROFILE(SMBclose); return(ERROR(eclass,err)); + } + END_PROFILE(SMBclose); return(outsize); } @@ -2767,6 +2913,7 @@ int reply_writeclose(connection_struct *conn, char *data; time_t mtime; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBwriteclose); CHECK_FSP(fsp,conn); CHECK_WRITE(fsp); @@ -2777,9 +2924,11 @@ int reply_writeclose(connection_struct *conn, mtime = make_unix_date3(inbuf+smb_vwv4); data = smb_buf(inbuf) + 1; - if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)numtowrite,(SMB_BIG_UINT)startpos, WRITE_LOCK)) { + END_PROFILE(SMBwriteclose); return(ERROR(ERRDOS,ERRlock)); - + } + nwritten = write_file(fsp,data,startpos,numtowrite); set_filetime(conn, fsp->fsp_name,mtime); @@ -2790,17 +2939,21 @@ int reply_writeclose(connection_struct *conn, fsp->fnum, (int)numtowrite, (int)nwritten, conn->num_files_open)); - if (nwritten <= 0) + if (nwritten <= 0) { + END_PROFILE(SMBwriteclose); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } if(close_err != 0) { errno = close_err; + END_PROFILE(SMBwriteclose); return(UNIXERROR(ERRHRD,ERRgeneral)); } outsize = set_message(outbuf,1,0,True); SSVAL(outbuf,smb_vwv0,nwritten); + END_PROFILE(SMBwriteclose); return(outsize); } @@ -2816,6 +2969,7 @@ int reply_lock(connection_struct *conn, int eclass; uint32 ecode; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBlock); CHECK_FSP(fsp,conn); CHECK_ERROR(fsp); @@ -2827,18 +2981,22 @@ int reply_lock(connection_struct *conn, fsp->fd, fsp->fnum, (double)offset, (double)count)); if (!do_lock(fsp, conn, count, offset, WRITE_LOCK, &eclass, &ecode)) { - if((ecode == ERRlock) && lp_blocking_locks(SNUM(conn))) { - /* - * A blocking lock was requested. Package up - * this smb into a queued request and push it - * onto the blocking lock queue. - */ - if(push_blocking_lock_request(inbuf, length, -1, 0)) - return -1; - } - return (ERROR(eclass,ecode)); - } + if((ecode == ERRlock) && lp_blocking_locks(SNUM(conn))) { + /* + * A blocking lock was requested. Package up + * this smb into a queued request and push it + * onto the blocking lock queue. + */ + if(push_blocking_lock_request(inbuf, length, -1, 0)) { + END_PROFILE(SMBlock); + return -1; + } + } + END_PROFILE(SMBlock); + return (ERROR(eclass,ecode)); + } + END_PROFILE(SMBlock); return(outsize); } @@ -2853,6 +3011,7 @@ int reply_unlock(connection_struct *conn, char *inbuf,char *outbuf, int size, in int eclass; uint32 ecode; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBunlock); CHECK_FSP(fsp,conn); CHECK_ERROR(fsp); @@ -2860,12 +3019,15 @@ int reply_unlock(connection_struct *conn, char *inbuf,char *outbuf, int size, in count = (SMB_BIG_UINT)IVAL(inbuf,smb_vwv1); offset = (SMB_BIG_UINT)IVAL(inbuf,smb_vwv3); - if(!do_unlock(fsp, conn, count, offset, &eclass, &ecode)) + if(!do_unlock(fsp, conn, count, offset, &eclass, &ecode)) { + END_PROFILE(SMBunlock); return (ERROR(eclass,ecode)); + } DEBUG( 3, ( "unlock fd=%d fnum=%d offset=%.0f count=%.0f\n", fsp->fd, fsp->fnum, (double)offset, (double)count ) ); + END_PROFILE(SMBunlock); return(outsize); } @@ -2878,11 +3040,13 @@ int reply_tdis(connection_struct *conn, { int outsize = set_message(outbuf,0,0,True); uint16 vuid; + START_PROFILE(SMBtdis); vuid = SVAL(inbuf,smb_uid); if (!conn) { DEBUG(4,("Invalid connection in tdis\n")); + END_PROFILE(SMBtdis); return(ERROR(ERRSRV,ERRinvnid)); } @@ -2890,6 +3054,7 @@ int reply_tdis(connection_struct *conn, close_cnum(conn,vuid); + END_PROFILE(SMBtdis); return outsize; } @@ -2905,6 +3070,7 @@ int reply_echo(connection_struct *conn, int seq_num; unsigned int data_len = smb_buflen(inbuf); int outsize = set_message(outbuf,1,data_len,True); + START_PROFILE(SMBecho); data_len = MIN(data_len, (sizeof(inbuf)-(smb_buf(inbuf)-inbuf))); @@ -2929,6 +3095,7 @@ int reply_echo(connection_struct *conn, smb_echo_count++; + END_PROFILE(SMBecho); return -1; } @@ -2941,14 +3108,18 @@ int reply_printopen(connection_struct *conn, { int outsize = 0; files_struct *fsp; + START_PROFILE(SMBsplopen); - if (!CAN_PRINT(conn)) + if (!CAN_PRINT(conn)) { + END_PROFILE(SMBsplopen); return(ERROR(ERRDOS,ERRnoaccess)); + } /* Open for exclusive use, write only. */ fsp = print_fsp_open(conn,"dos.prn"); if (!fsp) { + END_PROFILE(SMBsplopen); return(UNIXERROR(ERRDOS,ERRnoaccess)); } @@ -2958,6 +3129,7 @@ int reply_printopen(connection_struct *conn, DEBUG(3,("openprint fd=%d fnum=%d\n", fsp->fd, fsp->fnum)); + END_PROFILE(SMBsplopen); return(outsize); } @@ -2971,12 +3143,15 @@ int reply_printclose(connection_struct *conn, int outsize = set_message(outbuf,0,0,True); files_struct *fsp = file_fsp(inbuf,smb_vwv0); int close_err = 0; + START_PROFILE(SMBsplclose); CHECK_FSP(fsp,conn); CHECK_ERROR(fsp); - if (!CAN_PRINT(conn)) + if (!CAN_PRINT(conn)) { + END_PROFILE(SMBsplclose); return(ERROR(ERRDOS,ERRnoaccess)); + } DEBUG(3,("printclose fd=%d fnum=%d\n", fsp->fd,fsp->fnum)); @@ -2985,9 +3160,11 @@ int reply_printclose(connection_struct *conn, if(close_err != 0) { errno = close_err; + END_PROFILE(SMBsplclose); return(UNIXERROR(ERRHRD,ERRgeneral)); } + END_PROFILE(SMBsplclose); return(outsize); } @@ -3001,13 +3178,16 @@ int reply_printqueue(connection_struct *conn, int outsize = set_message(outbuf,2,3,True); int max_count = SVAL(inbuf,smb_vwv0); int start_index = SVAL(inbuf,smb_vwv1); + START_PROFILE(SMBsplretq); /* we used to allow the client to get the cnum wrong, but that is really quite gross and only worked when there was only one printer - I think we should now only accept it if they get it right (tridge) */ - if (!CAN_PRINT(conn)) + if (!CAN_PRINT(conn)) { + END_PROFILE(SMBsplretq); return(ERROR(ERRDOS,ERRnoaccess)); + } SSVAL(outbuf,smb_vwv0,0); SSVAL(outbuf,smb_vwv1,0); @@ -3054,6 +3234,7 @@ int reply_printqueue(connection_struct *conn, DEBUG(3,("%d entries returned in queue\n",count)); } + END_PROFILE(SMBsplretq); return(outsize); } @@ -3067,9 +3248,12 @@ int reply_printwrite(connection_struct *conn, char *inbuf,char *outbuf, int dum_ int outsize = set_message(outbuf,0,0,True); char *data; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBsplwr); - if (!CAN_PRINT(conn)) + if (!CAN_PRINT(conn)) { + END_PROFILE(SMBsplwr); return(ERROR(ERRDOS,ERRnoaccess)); + } CHECK_FSP(fsp,conn); CHECK_WRITE(fsp); @@ -3078,11 +3262,14 @@ int reply_printwrite(connection_struct *conn, char *inbuf,char *outbuf, int dum_ numtowrite = SVAL(smb_buf(inbuf),1); data = smb_buf(inbuf) + 3; - if (write_file(fsp,data,-1,numtowrite) != numtowrite) + if (write_file(fsp,data,-1,numtowrite) != numtowrite) { + END_PROFILE(SMBsplwr); return(UNIXERROR(ERRDOS,ERRnoaccess)); - + } + DEBUG( 3, ( "printwrite fnum=%d num=%d\n", fsp->fnum, numtowrite ) ); + END_PROFILE(SMBsplwr); return(outsize); } @@ -3121,6 +3308,7 @@ int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, { pstring directory; int outsize; + START_PROFILE(SMBmkdir); pstrcpy(directory,smb_buf(inbuf) + 1); @@ -3130,6 +3318,7 @@ int reply_mkdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, DEBUG( 3, ( "mkdir %s ret=%d\n", directory, outsize ) ); + END_PROFILE(SMBmkdir); return(outsize); } @@ -3166,7 +3355,7 @@ static BOOL recursive_rmdir(connection_struct *conn, char *directory) pstrcat(fullname, "/"); pstrcat(fullname, dname); - if(conn->vfs_ops.lstat(dos_to_unix(fullname,False), &st) != 0) + if(conn->vfs_ops.lstat(conn,dos_to_unix(fullname,False), &st) != 0) { ret = True; break; @@ -3179,13 +3368,13 @@ static BOOL recursive_rmdir(connection_struct *conn, char *directory) ret = True; break; } - if(conn->vfs_ops.rmdir(dos_to_unix(fullname,False)) != 0) + if(vfs_rmdir(conn,fullname) != 0) { ret = True; break; } } - else if(conn->vfs_ops.unlink(dos_to_unix(fullname,False)) != 0) + else if(vfs_unlink(conn,fullname) != 0) { ret = True; break; @@ -3203,7 +3392,7 @@ BOOL rmdir_internals(connection_struct *conn, char *directory) { BOOL ok; - ok = (conn->vfs_ops.rmdir(dos_to_unix(directory, False)) == 0); + ok = (vfs_rmdir(conn,directory) == 0); if(!ok && ((errno == ENOTEMPTY)||(errno == EEXIST)) && lp_veto_files(SNUM(conn))) { /* @@ -3250,7 +3439,7 @@ BOOL rmdir_internals(connection_struct *conn, char *directory) pstrcat(fullname, "/"); pstrcat(fullname, dname); - if(conn->vfs_ops.lstat(dos_to_unix(fullname, False), &st) != 0) + if(conn->vfs_ops.lstat(conn,dos_to_unix(fullname, False), &st) != 0) break; if(st.st_mode & S_IFDIR) { @@ -3259,15 +3448,15 @@ BOOL rmdir_internals(connection_struct *conn, char *directory) if(recursive_rmdir(conn, fullname) != 0) break; } - if(conn->vfs_ops.rmdir(dos_to_unix(fullname, False)) != 0) + if(vfs_rmdir(conn,fullname) != 0) break; } - else if(conn->vfs_ops.unlink(dos_to_unix(fullname, False)) != 0) + else if(vfs_unlink(conn,fullname) != 0) break; } CloseDir(dirptr); /* Retry the rmdir */ - ok = (conn->vfs_ops.rmdir(dos_to_unix(directory, False)) == 0); + ok = (vfs_rmdir(conn,directory) == 0); } else CloseDir(dirptr); @@ -3293,6 +3482,7 @@ int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int outsize = 0; BOOL ok = False; BOOL bad_path = False; + START_PROFILE(SMBrmdir); pstrcpy(directory,smb_buf(inbuf) + 1); @@ -3313,6 +3503,7 @@ int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, unix_ERR_class = ERRDOS; unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBrmdir); return(UNIXERROR(ERRDOS,ERRbadpath)); } @@ -3320,6 +3511,7 @@ int reply_rmdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, DEBUG( 3, ( "rmdir %s\n", directory ) ); + END_PROFILE(SMBrmdir); return(outsize); } @@ -3397,7 +3589,7 @@ static BOOL can_rename(char *fname,connection_struct *conn) if (!CAN_WRITE(conn)) return(False); - if (conn->vfs_ops.lstat(dos_to_unix(fname,False),&sbuf) != 0) return(False); + if (conn->vfs_ops.lstat(conn,dos_to_unix(fname,False),&sbuf) != 0) return(False); if (!check_file_sharing(conn,fname,True)) return(False); return(True); @@ -3529,14 +3721,14 @@ int rename_internals(connection_struct *conn, */ if(resolve_wildcards(directory,newname) && can_rename(directory,conn) && - !conn->vfs_ops.rename(zdirectory, + !conn->vfs_ops.rename(conn,zdirectory, dos_to_unix(newname,False))) count++; } else { if (resolve_wildcards(directory,newname) && can_rename(directory,conn) && !vfs_file_exist(conn,newname,NULL) && - !conn->vfs_ops.rename(zdirectory, + !conn->vfs_ops.rename(conn,zdirectory, dos_to_unix(newname,False))) count++; } @@ -3595,7 +3787,7 @@ int rename_internals(connection_struct *conn, continue; } - if (!conn->vfs_ops.rename(dos_to_unix(fname,False), + if (!conn->vfs_ops.rename(conn,dos_to_unix(fname,False), dos_to_unix(destname,False))) count++; DEBUG(3,("rename_internals: doing rename on %s -> %s\n",fname,destname)); @@ -3628,6 +3820,7 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, in int outsize = 0; pstring name; pstring newname; + START_PROFILE(SMBmv); pstrcpy(name,smb_buf(inbuf) + 1); pstrcpy(newname,smb_buf(inbuf) + 3 + strlen(name)); @@ -3650,6 +3843,7 @@ int reply_mv(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, in outsize = set_message(outbuf,0,0,True); } + END_PROFILE(SMBmv); return(outsize); } @@ -3701,7 +3895,7 @@ static BOOL copy_file(char *src,char *dest1,connection_struct *conn, int ofun, } if ((ofun&3) == 1) { - if(conn->vfs_ops.lseek(fsp2->fd,0,SEEK_END) == -1) { + if(conn->vfs_ops.lseek(fsp2,fsp2->fd,0,SEEK_END) == -1) { DEBUG(0,("copy_file: error - sys_lseek returned error %s\n", strerror(errno) )); /* @@ -3751,6 +3945,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, BOOL bad_path1 = False; BOOL bad_path2 = False; BOOL rc = True; + START_PROFILE(SMBcopy); *directory = *mask = 0; @@ -3762,6 +3957,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, if (tid2 != conn->cnum) { /* can't currently handle inter share copies XXXX */ DEBUG(3,("Rejecting inter-share copy\n")); + END_PROFILE(SMBcopy); return(ERROR(ERRSRV,ERRinvdevice)); } @@ -3774,16 +3970,19 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, target_is_directory = vfs_directory_exist(conn,False,NULL); if ((flags&1) && target_is_directory) { + END_PROFILE(SMBcopy); return(ERROR(ERRDOS,ERRbadfile)); } if ((flags&2) && !target_is_directory) { + END_PROFILE(SMBcopy); return(ERROR(ERRDOS,ERRbadpath)); } if ((flags&(1<<5)) && vfs_directory_exist(conn,name,NULL)) { /* wants a tree copy! XXXX */ DEBUG(3,("Rejecting tree copy\n")); + END_PROFILE(SMBcopy); return(ERROR(ERRSRV,ERRerror)); } @@ -3819,6 +4018,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, count,target_is_directory,&err)) count++; if(!count && err) { errno = err; + END_PROFILE(SMBcopy); return(UNIXERROR(ERRHRD,ERRgeneral)); } if (!count) exists = vfs_file_exist(conn,directory,NULL); @@ -3859,18 +4059,21 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, if(err) { /* Error on close... */ errno = err; + END_PROFILE(SMBcopy); return(UNIXERROR(ERRHRD,ERRgeneral)); } - if (exists) + if (exists) { + END_PROFILE(SMBcopy); return(ERROR(ERRDOS,error)); - else + } else { if((errno == ENOENT) && (bad_path1 || bad_path2)) { unix_ERR_class = ERRDOS; unix_ERR_code = ERRbadpath; } + END_PROFILE(SMBcopy); return(UNIXERROR(ERRDOS,error)); } } @@ -3878,6 +4081,7 @@ int reply_copy(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, outsize = set_message(outbuf,1,0,True); SSVAL(outbuf,smb_vwv0,count); + END_PROFILE(SMBcopy); return(outsize); } @@ -3890,10 +4094,13 @@ int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size int outsize = 0; BOOL ok = False; pstring newdir; + START_PROFILE(pathworks_setdir); snum = SNUM(conn); - if (!CAN_SETDIR(snum)) + if (!CAN_SETDIR(snum)) { + END_PROFILE(pathworks_setdir); return(ERROR(ERRDOS,ERRnoaccess)); + } pstrcpy(newdir,smb_buf(inbuf) + 1); strlower(newdir); @@ -3907,14 +4114,17 @@ int reply_setdir(connection_struct *conn, char *inbuf,char *outbuf, int dum_size } } - if (!ok) + if (!ok) { + END_PROFILE(pathworks_setdir); return(ERROR(ERRDOS,ERRbadpath)); + } outsize = set_message(outbuf,0,0,True); CVAL(outbuf,smb_reh) = CVAL(inbuf,smb_reh); DEBUG(3,("setdir %s\n", newdir)); + END_PROFILE(pathworks_setdir); return(outsize); } @@ -4026,6 +4236,7 @@ int reply_lockingX(connection_struct *conn, char *inbuf,char *outbuf,int length, int eclass=0, dummy1; BOOL large_file_format = (locktype & LOCKING_ANDX_LARGE_FILES)?True:False; BOOL err; + START_PROFILE(SMBlockingX); CHECK_FSP(fsp,conn); CHECK_ERROR(fsp); @@ -4050,10 +4261,13 @@ int reply_lockingX(connection_struct *conn, char *inbuf,char *outbuf,int length, no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name)); /* if this is a pure oplock break request then don't send a reply */ - if (num_locks == 0 && num_ulocks == 0) + if (num_locks == 0 && num_ulocks == 0) { + END_PROFILE(SMBlockingX); return -1; - else + } else { + END_PROFILE(SMBlockingX); return ERROR(ERRDOS,ERRlock); + } } if (remove_oplock(fsp) == False) { @@ -4069,6 +4283,7 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name)); if(CVAL(inbuf,smb_vwv0) != 0xff) DEBUG(0,("reply_lockingX: Error : pure oplock break is a chained %d request !\n", (unsigned int)CVAL(inbuf,smb_vwv0) )); + END_PROFILE(SMBlockingX); return -1; } } @@ -4082,14 +4297,18 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name)); /* * There is no error code marked "stupid client bug".... :-). */ - if(err) + if(err) { + END_PROFILE(SMBlockingX); return ERROR(ERRDOS,ERRnoaccess); + } DEBUG(10,("reply_lockingX: unlock start=%.0f, len=%.0f for file %s\n", (double)offset, (double)count, fsp->fsp_name )); - if(!do_unlock(fsp,conn,count,offset, &eclass, &ecode)) + if(!do_unlock(fsp,conn,count,offset, &eclass, &ecode)) { + END_PROFILE(SMBlockingX); return ERROR(eclass,ecode); + } } /* Setup the timeout in seconds. */ @@ -4108,8 +4327,10 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name)); /* * There is no error code marked "stupid client bug".... :-). */ - if(err) + if(err) { + END_PROFILE(SMBlockingX); return ERROR(ERRDOS,ERRnoaccess); + } DEBUG(10,("reply_lockingX: lock start=%.0f, len=%.0f for file %s\n", (double)offset, (double)count, fsp->fsp_name )); @@ -4122,8 +4343,10 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name)); * this smb into a queued request and push it * onto the blocking lock queue. */ - if(push_blocking_lock_request(inbuf, length, lock_timeout, i)) + if(push_blocking_lock_request(inbuf, length, lock_timeout, i)) { + END_PROFILE(SMBlockingX); return -1; + } } break; } @@ -4144,11 +4367,14 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name)); /* * There is no error code marked "stupid client bug".... :-). */ - if(err) + if(err) { + END_PROFILE(SMBlockingX); return ERROR(ERRDOS,ERRnoaccess); + } do_unlock(fsp,conn,count,offset,&dummy1,&dummy2); } + END_PROFILE(SMBlockingX); return ERROR(eclass,ecode); } @@ -4157,6 +4383,7 @@ no oplock granted on this file (%s).\n", fsp->fnum, fsp->fsp_name)); DEBUG( 3, ( "lockingX fnum=%d type=%d num_locks=%d num_ulocks=%d\n", fsp->fnum, (unsigned int)locktype, num_locks, num_ulocks ) ); + END_PROFILE(SMBlockingX); return chain_reply(inbuf,outbuf,length,bufsize); } @@ -4176,10 +4403,13 @@ int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length, size_t tcount; int pad; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBreadBmpx); /* this function doesn't seem to work - disable by default */ - if (!lp_readbmpx()) + if (!lp_readbmpx()) { + END_PROFILE(SMBreadBmpx); return(ERROR(ERRSRV,ERRuseSTD)); + } outsize = set_message(outbuf,8,0,True); @@ -4199,9 +4429,11 @@ int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length, tcount = maxcount; total_read = 0; - if (is_locked(fsp,conn,(SMB_BIG_UINT)maxcount,(SMB_BIG_UINT)startpos, READ_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)maxcount,(SMB_BIG_UINT)startpos, READ_LOCK)) { + END_PROFILE(SMBreadBmpx); return(ERROR(ERRDOS,ERRlock)); - + } + do { size_t N = MIN(max_per_packet,tcount-total_read); @@ -4226,6 +4458,7 @@ int reply_readbmpx(connection_struct *conn, char *inbuf,char *outbuf,int length, } while (total_read < (ssize_t)tcount); + END_PROFILE(SMBreadBmpx); return(-1); } @@ -4244,6 +4477,7 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size, int smb_doff; char *data; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBwriteBmpx); CHECK_FSP(fsp,conn); CHECK_WRITE(fsp); @@ -4261,16 +4495,20 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size, not an SMBwritebmpx - set this up now so we don't forget */ CVAL(outbuf,smb_com) = SMBwritec; - if (is_locked(fsp,conn,(SMB_BIG_UINT)tcount,(SMB_BIG_UINT)startpos,WRITE_LOCK)) + if (is_locked(fsp,conn,(SMB_BIG_UINT)tcount,(SMB_BIG_UINT)startpos,WRITE_LOCK)) { + END_PROFILE(SMBwriteBmpx); return(ERROR(ERRDOS,ERRlock)); + } nwritten = write_file(fsp,data,startpos,numtowrite); if(lp_syncalways(SNUM(conn)) || write_through) sync_file(conn,fsp); - if(nwritten < (ssize_t)numtowrite) + if(nwritten < (ssize_t)numtowrite) { + END_PROFILE(SMBwriteBmpx); return(UNIXERROR(ERRHRD,ERRdiskfull)); + } /* If the maximum to be written to this file is greater than what we just wrote then set @@ -4286,6 +4524,7 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size, if(!wbms) { DEBUG(0,("Out of memory in reply_readmpx\n")); + END_PROFILE(SMBwriteBmpx); return(ERROR(ERRSRV,ERRnoresource)); } wbms->wr_mode = write_through; @@ -4318,6 +4557,7 @@ int reply_writebmpx(connection_struct *conn, char *inbuf,char *outbuf, int size, SSVAL(outbuf,smb_vwv0,nwritten); } + END_PROFILE(SMBwriteBmpx); return(outsize); } @@ -4338,6 +4578,7 @@ int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz write_bmpx_struct *wbms; BOOL send_response = False; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBwriteBs); CHECK_FSP(fsp,conn); CHECK_WRITE(fsp); @@ -4355,15 +4596,20 @@ int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz /* This fd should have an auxiliary struct attached, check that it does */ wbms = fsp->wbmpx_ptr; - if(!wbms) return(-1); + if(!wbms) { + END_PROFILE(SMBwriteBs); + return(-1); + } /* If write through is set we can return errors, else we must cache them */ write_through = wbms->wr_mode; /* Check for an earlier error */ - if(wbms->wr_discard) + if(wbms->wr_discard) { + END_PROFILE(SMBwriteBs); return -1; /* Just discard the packet */ + } nwritten = write_file(fsp,data,startpos,numtowrite); @@ -4377,8 +4623,10 @@ int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz /* We are returning an error - we can delete the aux struct */ if (wbms) free((char *)wbms); fsp->wbmpx_ptr = NULL; + END_PROFILE(SMBwriteBs); return(ERROR(ERRHRD,ERRdiskfull)); } + END_PROFILE(SMBwriteBs); return(CACHE_ERROR(wbms,ERRHRD,ERRdiskfull)); } @@ -4398,9 +4646,12 @@ int reply_writebs(connection_struct *conn, char *inbuf,char *outbuf, int dum_siz fsp->wbmpx_ptr = NULL; } - if(send_response) + if(send_response) { + END_PROFILE(SMBwriteBs); return(outsize); + } + END_PROFILE(SMBwriteBs); return(-1); } @@ -4414,6 +4665,7 @@ int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, struct utimbuf unix_times; int outsize = 0; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBsetattrE); outsize = set_message(outbuf,0,0,True); @@ -4439,6 +4691,7 @@ int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, dbgtext( "reply_setattrE fnum=%d ", fsp->fnum); dbgtext( "ignoring zero request - not setting timestamps of 0\n" ); } + END_PROFILE(SMBsetattrE); return(outsize); } else if ((unix_times.actime != 0) && (unix_times.modtime == 0)) @@ -4448,12 +4701,15 @@ int reply_setattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, } /* Set the date on this file */ - if(file_utime(conn, fsp->fsp_name, &unix_times)) + if(file_utime(conn, fsp->fsp_name, &unix_times)) { + END_PROFILE(SMBsetattrE); return(ERROR(ERRDOS,ERRnoaccess)); + } DEBUG( 3, ( "reply_setattrE fnum=%d actime=%d modtime=%d\n", fsp->fnum, (int)unix_times.actime, (int)unix_times.modtime ) ); + END_PROFILE(SMBsetattrE); return(outsize); } @@ -4468,6 +4724,7 @@ int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, int outsize = 0; int mode; files_struct *fsp = file_fsp(inbuf,smb_vwv0); + START_PROFILE(SMBgetattrE); outsize = set_message(outbuf,11,0,True); @@ -4475,8 +4732,10 @@ int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, CHECK_ERROR(fsp); /* Do an fstat on this file */ - if(fsp->conn->vfs_ops.fstat(fsp->fd, &sbuf)) + if(vfs_fstat(fsp,fsp->fd, &sbuf)) { + END_PROFILE(SMBgetattrE); return(UNIXERROR(ERRDOS,ERRnoaccess)); + } mode = dos_mode(conn,fsp->fsp_name,&sbuf); @@ -4500,6 +4759,7 @@ int reply_getattrE(connection_struct *conn, char *inbuf,char *outbuf, int size, DEBUG( 3, ( "reply_getattrE fnum=%d\n", fsp->fnum)); + END_PROFILE(SMBgetattrE); return(outsize); } #undef OLD_NTDOMAIN -- cgit