spin_unlock(&inode->i_lock); 
static int nfs_readpage_sync(struct nfs_open_context *ctx, struct inode *inode,		struct page *page){	unsigned int	rsize = NFS_SERVER(inode)->rsize;	unsigned int	count = PAGE_CACHE_SIZE;	int		result;	struct nfs_read_data *rdata;	rdata = nfs_readdata_alloc();	if (!rdata)		return -ENOMEM;	memset(rdata, 0, sizeof(*rdata));	rdata->flags = (IS_SWAPFILE(inode)? NFS_RPC_SWAPFLAGS : 0);	rdata->cred = ctx->cred;	rdata->inode = inode;	INIT_LIST_HEAD(&rdata->pages);	rdata->args.fh = NFS_FH(inode);	rdata->args.context = ctx;	rdata->args.pages = &page;	rdata->args.pgbase = 0UL;	rdata->args.count = rsize;	rdata->res.fattr = &rdata->fattr;	dprintk("NFS: nfs_readpage_sync(%p)\n", page);	/*	 * This works now because the socket layer never tries to DMA	 * into this buffer directly.	 */	do {		if (count < rsize)			rdata->args.count = count;		rdata->res.count = rdata->args.count;		rdata->args.offset = page_offset(page) + rdata->args.pgbase;		dprintk("NFS: nfs_proc_read(%s, (%s/%Ld), %Lu, %u)\n",			NFS_SERVER(inode)->hostname,			inode->i_sb->s_id,			(long long)NFS_FILEID(inode),			(unsigned long long)rdata->args.pgbase,			rdata->args.count);		lock_kernel();		result = NFS_PROTO(inode)->read(rdata);		unlock_kernel();		/*		 * Even if we had a partial success we can't mark the page		 * cache valid.		 */		if (result < 0) {			if (result == -EISDIR)				result = -EINVAL;			goto io_error;		}		count -= result;		rdata->args.pgbase += result;		/* Note: result == 0 should only happen if we're caching		 * a write that extends the file and punches a hole.		 */		if (rdata->res.eof != 0 || result == 0)			break;	} while (count);	NFS_I(inode)->cache_validity |= NFS_INO_INVALID_ATIME;	if (count)		memclear_highpage_flush(page, rdata->args.pgbase, count);	SetPageUptodate(page);	if (PageError(page))		ClearPageError(page);	result = 0;io_error:	unlock_page(page);	nfs_readdata_free(rdata);	return result;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/dc59250c6ebed099a9bc0a11298e2281dd896657/read.c/buggy/fs/nfs/read.c