Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fe82a183 authored by Chuck Lever's avatar Chuck Lever Committed by Trond Myklebust
Browse files

NFS: Convert printk's to dprintk's in fs/nfs/nfs?xdr.c



Due to recent edict to replace or remove printk's that can be triggered en
masse by remote misbehavior.  Left a few that only occur just before a BUG.

Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 0ac83779
Loading
Loading
Loading
Loading
+9 −9
Original line number Original line Diff line number Diff line
@@ -271,7 +271,7 @@ nfs_xdr_readres(struct rpc_rqst *req, __be32 *p, struct nfs_readres *res)
	res->eof = 0;
	res->eof = 0;
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	if (iov->iov_len < hdrlen) {
	if (iov->iov_len < hdrlen) {
		printk(KERN_WARNING "NFS: READ reply header overflowed:"
		dprintk("NFS: READ reply header overflowed:"
				"length %d > %Zu\n", hdrlen, iov->iov_len);
				"length %d > %Zu\n", hdrlen, iov->iov_len);
		return -errno_NFSERR_IO;
		return -errno_NFSERR_IO;
	} else if (iov->iov_len != hdrlen) {
	} else if (iov->iov_len != hdrlen) {
@@ -281,7 +281,7 @@ nfs_xdr_readres(struct rpc_rqst *req, __be32 *p, struct nfs_readres *res)


	recvd = req->rq_rcv_buf.len - hdrlen;
	recvd = req->rq_rcv_buf.len - hdrlen;
	if (count > recvd) {
	if (count > recvd) {
		printk(KERN_WARNING "NFS: server cheating in read reply: "
		dprintk("NFS: server cheating in read reply: "
			"count %d > recvd %d\n", count, recvd);
			"count %d > recvd %d\n", count, recvd);
		count = recvd;
		count = recvd;
	}
	}
@@ -431,7 +431,7 @@ nfs_xdr_readdirres(struct rpc_rqst *req, __be32 *p, void *dummy)


	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	if (iov->iov_len < hdrlen) {
	if (iov->iov_len < hdrlen) {
		printk(KERN_WARNING "NFS: READDIR reply header overflowed:"
		dprintk("NFS: READDIR reply header overflowed:"
				"length %d > %Zu\n", hdrlen, iov->iov_len);
				"length %d > %Zu\n", hdrlen, iov->iov_len);
		return -errno_NFSERR_IO;
		return -errno_NFSERR_IO;
	} else if (iov->iov_len != hdrlen) {
	} else if (iov->iov_len != hdrlen) {
@@ -454,7 +454,7 @@ nfs_xdr_readdirres(struct rpc_rqst *req, __be32 *p, void *dummy)
		len = ntohl(*p++);
		len = ntohl(*p++);
		p += XDR_QUADLEN(len) + 1;	/* name plus cookie */
		p += XDR_QUADLEN(len) + 1;	/* name plus cookie */
		if (len > NFS2_MAXNAMLEN) {
		if (len > NFS2_MAXNAMLEN) {
			printk(KERN_WARNING "NFS: giant filename in readdir (len 0x%x)!\n",
			dprintk("NFS: giant filename in readdir (len 0x%x)!\n",
						len);
						len);
			goto err_unmap;
			goto err_unmap;
		}
		}
@@ -471,7 +471,7 @@ nfs_xdr_readdirres(struct rpc_rqst *req, __be32 *p, void *dummy)
	entry[0] = entry[1] = 0;
	entry[0] = entry[1] = 0;
	/* truncate listing ? */
	/* truncate listing ? */
	if (!nr) {
	if (!nr) {
		printk(KERN_NOTICE "NFS: readdir reply truncated!\n");
		dprintk("NFS: readdir reply truncated!\n");
		entry[1] = 1;
		entry[1] = 1;
	}
	}
	goto out;
	goto out;
@@ -583,12 +583,12 @@ nfs_xdr_readlinkres(struct rpc_rqst *req, __be32 *p, void *dummy)
	/* Convert length of symlink */
	/* Convert length of symlink */
	len = ntohl(*p++);
	len = ntohl(*p++);
	if (len >= rcvbuf->page_len || len <= 0) {
	if (len >= rcvbuf->page_len || len <= 0) {
		dprintk(KERN_WARNING "nfs: server returned giant symlink!\n");
		dprintk("nfs: server returned giant symlink!\n");
		return -ENAMETOOLONG;
		return -ENAMETOOLONG;
	}
	}
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	if (iov->iov_len < hdrlen) {
	if (iov->iov_len < hdrlen) {
		printk(KERN_WARNING "NFS: READLINK reply header overflowed:"
		dprintk("NFS: READLINK reply header overflowed:"
				"length %d > %Zu\n", hdrlen, iov->iov_len);
				"length %d > %Zu\n", hdrlen, iov->iov_len);
		return -errno_NFSERR_IO;
		return -errno_NFSERR_IO;
	} else if (iov->iov_len != hdrlen) {
	} else if (iov->iov_len != hdrlen) {
@@ -597,7 +597,7 @@ nfs_xdr_readlinkres(struct rpc_rqst *req, __be32 *p, void *dummy)
	}
	}
	recvd = req->rq_rcv_buf.len - hdrlen;
	recvd = req->rq_rcv_buf.len - hdrlen;
	if (recvd < len) {
	if (recvd < len) {
		printk(KERN_WARNING "NFS: server cheating in readlink reply: "
		dprintk("NFS: server cheating in readlink reply: "
				"count %u > recvd %u\n", len, recvd);
				"count %u > recvd %u\n", len, recvd);
		return -EIO;
		return -EIO;
	}
	}
@@ -695,7 +695,7 @@ nfs_stat_to_errno(int stat)
		if (nfs_errtbl[i].stat == stat)
		if (nfs_errtbl[i].stat == stat)
			return nfs_errtbl[i].errno;
			return nfs_errtbl[i].errno;
	}
	}
	printk(KERN_ERR "nfs_stat_to_errno: bad nfs status return value: %d\n", stat);
	dprintk("nfs_stat_to_errno: bad nfs status return value: %d\n", stat);
	return nfs_errtbl[i].errno;
	return nfs_errtbl[i].errno;
}
}


+12 −11
Original line number Original line Diff line number Diff line
@@ -524,7 +524,7 @@ nfs3_xdr_readdirres(struct rpc_rqst *req, __be32 *p, struct nfs3_readdirres *res


	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	if (iov->iov_len < hdrlen) {
	if (iov->iov_len < hdrlen) {
		printk(KERN_WARNING "NFS: READDIR reply header overflowed:"
		dprintk("NFS: READDIR reply header overflowed:"
				"length %d > %Zu\n", hdrlen, iov->iov_len);
				"length %d > %Zu\n", hdrlen, iov->iov_len);
		return -errno_NFSERR_IO;
		return -errno_NFSERR_IO;
	} else if (iov->iov_len != hdrlen) {
	} else if (iov->iov_len != hdrlen) {
@@ -547,7 +547,7 @@ nfs3_xdr_readdirres(struct rpc_rqst *req, __be32 *p, struct nfs3_readdirres *res
		len = ntohl(*p++);		/* string length */
		len = ntohl(*p++);		/* string length */
		p += XDR_QUADLEN(len) + 2;	/* name + cookie */
		p += XDR_QUADLEN(len) + 2;	/* name + cookie */
		if (len > NFS3_MAXNAMLEN) {
		if (len > NFS3_MAXNAMLEN) {
			printk(KERN_WARNING "NFS: giant filename in readdir (len %x)!\n",
			dprintk("NFS: giant filename in readdir (len %x)!\n",
						len);
						len);
			goto err_unmap;
			goto err_unmap;
		}
		}
@@ -567,7 +567,7 @@ nfs3_xdr_readdirres(struct rpc_rqst *req, __be32 *p, struct nfs3_readdirres *res
					goto short_pkt;
					goto short_pkt;
				len = ntohl(*p++);
				len = ntohl(*p++);
				if (len > NFS3_FHSIZE) {
				if (len > NFS3_FHSIZE) {
					printk(KERN_WARNING "NFS: giant filehandle in "
					dprintk("NFS: giant filehandle in "
						"readdir (len %x)!\n", len);
						"readdir (len %x)!\n", len);
					goto err_unmap;
					goto err_unmap;
				}
				}
@@ -588,7 +588,7 @@ nfs3_xdr_readdirres(struct rpc_rqst *req, __be32 *p, struct nfs3_readdirres *res
	entry[0] = entry[1] = 0;
	entry[0] = entry[1] = 0;
	/* truncate listing ? */
	/* truncate listing ? */
	if (!nr) {
	if (!nr) {
		printk(KERN_NOTICE "NFS: readdir reply truncated!\n");
		dprintk("NFS: readdir reply truncated!\n");
		entry[1] = 1;
		entry[1] = 1;
	}
	}
	goto out;
	goto out;
@@ -826,22 +826,23 @@ nfs3_xdr_readlinkres(struct rpc_rqst *req, __be32 *p, struct nfs_fattr *fattr)
	/* Convert length of symlink */
	/* Convert length of symlink */
	len = ntohl(*p++);
	len = ntohl(*p++);
	if (len >= rcvbuf->page_len || len <= 0) {
	if (len >= rcvbuf->page_len || len <= 0) {
		dprintk(KERN_WARNING "nfs: server returned giant symlink!\n");
		dprintk("nfs: server returned giant symlink!\n");
		return -ENAMETOOLONG;
		return -ENAMETOOLONG;
	}
	}


	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	if (iov->iov_len < hdrlen) {
	if (iov->iov_len < hdrlen) {
		printk(KERN_WARNING "NFS: READLINK reply header overflowed:"
		dprintk("NFS: READLINK reply header overflowed:"
				"length %d > %Zu\n", hdrlen, iov->iov_len);
				"length %d > %Zu\n", hdrlen, iov->iov_len);
		return -errno_NFSERR_IO;
		return -errno_NFSERR_IO;
	} else if (iov->iov_len != hdrlen) {
	} else if (iov->iov_len != hdrlen) {
		dprintk("NFS: READLINK header is short. iovec will be shifted.\n");
		dprintk("NFS: READLINK header is short. "
			"iovec will be shifted.\n");
		xdr_shift_buf(rcvbuf, iov->iov_len - hdrlen);
		xdr_shift_buf(rcvbuf, iov->iov_len - hdrlen);
	}
	}
	recvd = req->rq_rcv_buf.len - hdrlen;
	recvd = req->rq_rcv_buf.len - hdrlen;
	if (recvd < len) {
	if (recvd < len) {
		printk(KERN_WARNING "NFS: server cheating in readlink reply: "
		dprintk("NFS: server cheating in readlink reply: "
				"count %u > recvd %u\n", len, recvd);
				"count %u > recvd %u\n", len, recvd);
		return -EIO;
		return -EIO;
	}
	}
@@ -876,13 +877,13 @@ nfs3_xdr_readres(struct rpc_rqst *req, __be32 *p, struct nfs_readres *res)
	ocount   = ntohl(*p++);
	ocount   = ntohl(*p++);


	if (ocount != count) {
	if (ocount != count) {
		printk(KERN_WARNING "NFS: READ count doesn't match RPC opaque count.\n");
		dprintk("NFS: READ count doesn't match RPC opaque count.\n");
		return -errno_NFSERR_IO;
		return -errno_NFSERR_IO;
	}
	}


	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	if (iov->iov_len < hdrlen) {
	if (iov->iov_len < hdrlen) {
		printk(KERN_WARNING "NFS: READ reply header overflowed:"
		dprintk("NFS: READ reply header overflowed:"
				"length %d > %Zu\n", hdrlen, iov->iov_len);
				"length %d > %Zu\n", hdrlen, iov->iov_len);
       		return -errno_NFSERR_IO;
       		return -errno_NFSERR_IO;
	} else if (iov->iov_len != hdrlen) {
	} else if (iov->iov_len != hdrlen) {
@@ -892,7 +893,7 @@ nfs3_xdr_readres(struct rpc_rqst *req, __be32 *p, struct nfs_readres *res)


	recvd = req->rq_rcv_buf.len - hdrlen;
	recvd = req->rq_rcv_buf.len - hdrlen;
	if (count > recvd) {
	if (count > recvd) {
		printk(KERN_WARNING "NFS: server cheating in read reply: "
		dprintk("NFS: server cheating in read reply: "
			"count %d > recvd %d\n", count, recvd);
			"count %d > recvd %d\n", count, recvd);
		count = recvd;
		count = recvd;
		res->eof = 0;
		res->eof = 0;
+21 −22
Original line number Original line Diff line number Diff line
@@ -562,7 +562,6 @@ struct compound_hdr {


#define RESERVE_SPACE(nbytes)	do {				\
#define RESERVE_SPACE(nbytes)	do {				\
	p = xdr_reserve_space(xdr, nbytes);			\
	p = xdr_reserve_space(xdr, nbytes);			\
	if (!p) printk("RESERVE_SPACE(%d) failed in function %s\n", (int) (nbytes), __FUNCTION__); \
	BUG_ON(!p);						\
	BUG_ON(!p);						\
} while (0)
} while (0)


@@ -628,7 +627,7 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s
	if (iap->ia_valid & ATTR_UID) {
	if (iap->ia_valid & ATTR_UID) {
		owner_namelen = nfs_map_uid_to_name(server->nfs_client, iap->ia_uid, owner_name);
		owner_namelen = nfs_map_uid_to_name(server->nfs_client, iap->ia_uid, owner_name);
		if (owner_namelen < 0) {
		if (owner_namelen < 0) {
			printk(KERN_WARNING "nfs: couldn't resolve uid %d to string\n",
			dprintk("nfs: couldn't resolve uid %d to string\n",
					iap->ia_uid);
					iap->ia_uid);
			/* XXX */
			/* XXX */
			strcpy(owner_name, "nobody");
			strcpy(owner_name, "nobody");
@@ -640,7 +639,7 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s
	if (iap->ia_valid & ATTR_GID) {
	if (iap->ia_valid & ATTR_GID) {
		owner_grouplen = nfs_map_gid_to_group(server->nfs_client, iap->ia_gid, owner_group);
		owner_grouplen = nfs_map_gid_to_group(server->nfs_client, iap->ia_gid, owner_group);
		if (owner_grouplen < 0) {
		if (owner_grouplen < 0) {
			printk(KERN_WARNING "nfs4: couldn't resolve gid %d to string\n",
			dprintk("nfs: couldn't resolve gid %d to string\n",
					iap->ia_gid);
					iap->ia_gid);
			strcpy(owner_group, "nobody");
			strcpy(owner_group, "nobody");
			owner_grouplen = sizeof("nobody") - 1;
			owner_grouplen = sizeof("nobody") - 1;
@@ -711,7 +710,7 @@ static int encode_attrs(struct xdr_stream *xdr, const struct iattr *iap, const s
	 * Now we backfill the bitmap and the attribute buffer length.
	 * Now we backfill the bitmap and the attribute buffer length.
	 */
	 */
	if (len != ((char *)p - (char *)q) + 4) {
	if (len != ((char *)p - (char *)q) + 4) {
		printk ("encode_attr: Attr length calculation error! %u != %Zu\n",
		printk(KERN_ERR "nfs: Attr length error, %u != %Zu\n",
				len, ((char *)p - (char *)q) + 4);
				len, ((char *)p - (char *)q) + 4);
		BUG();
		BUG();
	}
	}
@@ -2180,9 +2179,9 @@ static int nfs4_xdr_enc_fs_locations(struct rpc_rqst *req, __be32 *p, struct nfs
#define READ_BUF(nbytes)  do { \
#define READ_BUF(nbytes)  do { \
	p = xdr_inline_decode(xdr, nbytes); \
	p = xdr_inline_decode(xdr, nbytes); \
	if (unlikely(!p)) { \
	if (unlikely(!p)) { \
		printk(KERN_INFO "%s: prematurely hit end of receive" \
		dprintk("nfs: %s: prematurely hit end of receive" \
				" buffer\n", __FUNCTION__); \
				" buffer\n", __FUNCTION__); \
		printk(KERN_INFO "%s: xdr->p=%p, bytes=%u, xdr->end=%p\n", \
		dprintk("nfs: %s: xdr->p=%p, bytes=%u, xdr->end=%p\n", \
				__FUNCTION__, xdr->p, nbytes, xdr->end); \
				__FUNCTION__, xdr->p, nbytes, xdr->end); \
		return -EIO; \
		return -EIO; \
	} \
	} \
@@ -2223,8 +2222,7 @@ static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected)
	READ_BUF(8);
	READ_BUF(8);
	READ32(opnum);
	READ32(opnum);
	if (opnum != expected) {
	if (opnum != expected) {
		printk(KERN_NOTICE
		dprintk("nfs: Server returned operation"
				"nfs4_decode_op_hdr: Server returned operation"
			" %d but we issued a request for %d\n",
			" %d but we issued a request for %d\n",
				opnum, expected);
				opnum, expected);
		return -EIO;
		return -EIO;
@@ -2758,7 +2756,7 @@ static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, struct nf
				dprintk("%s: nfs_map_name_to_uid failed!\n",
				dprintk("%s: nfs_map_name_to_uid failed!\n",
						__FUNCTION__);
						__FUNCTION__);
		} else
		} else
			printk(KERN_WARNING "%s: name too long (%u)!\n",
			dprintk("%s: name too long (%u)!\n",
					__FUNCTION__, len);
					__FUNCTION__, len);
		bitmap[1] &= ~FATTR4_WORD1_OWNER;
		bitmap[1] &= ~FATTR4_WORD1_OWNER;
	}
	}
@@ -2783,7 +2781,7 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, struct nf
				dprintk("%s: nfs_map_group_to_gid failed!\n",
				dprintk("%s: nfs_map_group_to_gid failed!\n",
						__FUNCTION__);
						__FUNCTION__);
		} else
		} else
			printk(KERN_WARNING "%s: name too long (%u)!\n",
			dprintk("%s: name too long (%u)!\n",
					__FUNCTION__, len);
					__FUNCTION__, len);
		bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP;
		bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP;
	}
	}
@@ -2950,7 +2948,8 @@ static int verify_attr_len(struct xdr_stream *xdr, __be32 *savep, uint32_t attrl
	unsigned int nwords = xdr->p - savep;
	unsigned int nwords = xdr->p - savep;


	if (unlikely(attrwords != nwords)) {
	if (unlikely(attrwords != nwords)) {
		printk(KERN_WARNING "%s: server returned incorrect attribute length: %u %c %u\n",
		dprintk("%s: server returned incorrect attribute length: "
			"%u %c %u\n",
				__FUNCTION__,
				__FUNCTION__,
				attrwords << 2,
				attrwords << 2,
				(attrwords < nwords) ? '<' : '>',
				(attrwords < nwords) ? '<' : '>',
@@ -3451,7 +3450,7 @@ static int decode_read(struct xdr_stream *xdr, struct rpc_rqst *req, struct nfs_
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	hdrlen = (u8 *) p - (u8 *) iov->iov_base;
	recvd = req->rq_rcv_buf.len - hdrlen;
	recvd = req->rq_rcv_buf.len - hdrlen;
	if (count > recvd) {
	if (count > recvd) {
		printk(KERN_WARNING "NFS: server cheating in read reply: "
		dprintk("NFS: server cheating in read reply: "
				"count %u > recvd %u\n", count, recvd);
				"count %u > recvd %u\n", count, recvd);
		count = recvd;
		count = recvd;
		eof = 0;
		eof = 0;
@@ -3500,7 +3499,8 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n
		p += 2;			/* cookie */
		p += 2;			/* cookie */
		len = ntohl(*p++);	/* filename length */
		len = ntohl(*p++);	/* filename length */
		if (len > NFS4_MAXNAMLEN) {
		if (len > NFS4_MAXNAMLEN) {
			printk(KERN_WARNING "NFS: giant filename in readdir (len 0x%x)\n", len);
			dprintk("NFS: giant filename in readdir (len 0x%x)\n",
					len);
			goto err_unmap;
			goto err_unmap;
		}
		}
		xlen = XDR_QUADLEN(len);
		xlen = XDR_QUADLEN(len);
@@ -3528,7 +3528,7 @@ static int decode_readdir(struct xdr_stream *xdr, struct rpc_rqst *req, struct n
	entry[0] = entry[1] = 0;
	entry[0] = entry[1] = 0;
	/* truncate listing ? */
	/* truncate listing ? */
	if (!nr) {
	if (!nr) {
		printk(KERN_NOTICE "NFS: readdir reply truncated!\n");
		dprintk("NFS: readdir reply truncated!\n");
		entry[1] = 1;
		entry[1] = 1;
	}
	}
	goto out;
	goto out;
@@ -3554,13 +3554,13 @@ static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
	READ_BUF(4);
	READ_BUF(4);
	READ32(len);
	READ32(len);
	if (len >= rcvbuf->page_len || len <= 0) {
	if (len >= rcvbuf->page_len || len <= 0) {
		dprintk(KERN_WARNING "nfs: server returned giant symlink!\n");
		dprintk("nfs: server returned giant symlink!\n");
		return -ENAMETOOLONG;
		return -ENAMETOOLONG;
	}
	}
	hdrlen = (char *) xdr->p - (char *) iov->iov_base;
	hdrlen = (char *) xdr->p - (char *) iov->iov_base;
	recvd = req->rq_rcv_buf.len - hdrlen;
	recvd = req->rq_rcv_buf.len - hdrlen;
	if (recvd < len) {
	if (recvd < len) {
		printk(KERN_WARNING "NFS: server cheating in readlink reply: "
		dprintk("NFS: server cheating in readlink reply: "
				"count %u > recvd %u\n", len, recvd);
				"count %u > recvd %u\n", len, recvd);
		return -EIO;
		return -EIO;
	}
	}
@@ -3643,7 +3643,7 @@ static int decode_getacl(struct xdr_stream *xdr, struct rpc_rqst *req,
		hdrlen = (u8 *)xdr->p - (u8 *)iov->iov_base;
		hdrlen = (u8 *)xdr->p - (u8 *)iov->iov_base;
		recvd = req->rq_rcv_buf.len - hdrlen;
		recvd = req->rq_rcv_buf.len - hdrlen;
		if (attrlen > recvd) {
		if (attrlen > recvd) {
			printk(KERN_WARNING "NFS: server cheating in getattr"
			dprintk("NFS: server cheating in getattr"
					" acl reply: attrlen %u > recvd %u\n",
					" acl reply: attrlen %u > recvd %u\n",
					attrlen, recvd);
					attrlen, recvd);
			return -EINVAL;
			return -EINVAL;
@@ -3688,8 +3688,7 @@ static int decode_setclientid(struct xdr_stream *xdr, struct nfs_client *clp)
	READ_BUF(8);
	READ_BUF(8);
	READ32(opnum);
	READ32(opnum);
	if (opnum != OP_SETCLIENTID) {
	if (opnum != OP_SETCLIENTID) {
		printk(KERN_NOTICE
		dprintk("nfs: decode_setclientid: Server returned operation"
				"nfs4_decode_setclientid: Server returned operation"
			       	" %d\n", opnum);
			       	" %d\n", opnum);
		return -EIO;
		return -EIO;
	}
	}