spin_unlock(&current->files->file_lock); 
rcu_read_unlock(); 
int do_select(int n, fd_set_bits *fds, long *timeout){	struct poll_wqueues table;	poll_table *wait;	int retval, i;	long __timeout = *timeout; 	spin_lock(&current->files->file_lock);	retval = max_select_fd(n, fds);	spin_unlock(&current->files->file_lock);	if (retval < 0)		return retval;	n = retval;	poll_initwait(&table);	wait = &table.pt;	if (!__timeout)		wait = NULL;	retval = 0;	for (;;) {		unsigned long *rinp, *routp, *rexp, *inp, *outp, *exp;		set_current_state(TASK_INTERRUPTIBLE);		inp = fds->in; outp = fds->out; exp = fds->ex;		rinp = fds->res_in; routp = fds->res_out; rexp = fds->res_ex;		for (i = 0; i < n; ++rinp, ++routp, ++rexp) {			unsigned long in, out, ex, all_bits, bit = 1, mask, j;			unsigned long res_in = 0, res_out = 0, res_ex = 0;			struct file_operations *f_op = NULL;			struct file *file = NULL;			in = *inp++; out = *outp++; ex = *exp++;			all_bits = in | out | ex;			if (all_bits == 0) {				i += __NFDBITS;				continue;			}			for (j = 0; j < __NFDBITS; ++j, ++i, bit <<= 1) {				if (i >= n)					break;				if (!(bit & all_bits))					continue;				file = fget(i);				if (file) {					f_op = file->f_op;					mask = DEFAULT_POLLMASK;					if (f_op && f_op->poll)						mask = (*f_op->poll)(file, retval ? NULL : wait);					fput(file);					if ((mask & POLLIN_SET) && (in & bit)) {						res_in |= bit;						retval++;					}					if ((mask & POLLOUT_SET) && (out & bit)) {						res_out |= bit;						retval++;					}					if ((mask & POLLEX_SET) && (ex & bit)) {						res_ex |= bit;						retval++;					}				}				cond_resched();			}			if (res_in)				*rinp = res_in;			if (res_out)				*routp = res_out;			if (res_ex)				*rexp = res_ex;		}		wait = NULL;		if (retval || !__timeout || signal_pending(current))			break;		if(table.error) {			retval = table.error;			break;		}		__timeout = schedule_timeout(__timeout);	}	__set_current_state(TASK_RUNNING);	poll_freewait(&table);	/*	 * Up-to-date the caller timeout.	 */	*timeout = __timeout;	return retval;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/b835996f628eadb55c5fb222ba46fe9395bf73c7/select.c/clean/fs/select.c