From be29e6a6e682123a009d20b2c5ab0b5393f43a8b Mon Sep 17 00:00:00 2001 From: Richard Yao Date: Tue, 15 Dec 2015 11:48:19 -0500 Subject: [PATCH] kobj_read_file: Return -1 on vn_rdwr() error I noticed that the SPL implementation of kobj_read_file is not correct after comparing it with the userland implementation of kobj_read_file() in zfsonlinux/zfs#4104. Note that we no longer pass RLIM64_INFINITY with this, but our vn_rdwr implementation did not support it anyway, so there is no difference. Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Closes #513 --- include/sys/kobj.h | 4 ++-- module/spl/spl-kobj.c | 11 ++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/include/sys/kobj.h b/include/sys/kobj.h index f95fa80397..334449a8e2 100644 --- a/include/sys/kobj.h +++ b/include/sys/kobj.h @@ -35,8 +35,8 @@ typedef struct _buf buf_t; extern struct _buf *kobj_open_file(const char *name); extern void kobj_close_file(struct _buf *file); -extern int kobj_read_file(struct _buf *file, char *buf, - ssize_t size, offset_t off); +extern int kobj_read_file(struct _buf *file, char *buf, unsigned size, + unsigned off); extern int kobj_get_filesize(struct _buf *file, uint64_t *size); #endif /* SPL_KOBJ_H */ diff --git a/module/spl/spl-kobj.c b/module/spl/spl-kobj.c index 4dd14ba417..b79fcb8283 100644 --- a/module/spl/spl-kobj.c +++ b/module/spl/spl-kobj.c @@ -57,10 +57,15 @@ kobj_close_file(struct _buf *file) EXPORT_SYMBOL(kobj_close_file); int -kobj_read_file(struct _buf *file, char *buf, ssize_t size, offset_t off) +kobj_read_file(struct _buf *file, char *buf, unsigned size, unsigned off) { - return (vn_rdwr(UIO_READ, file->vp, buf, size, off, - UIO_SYSSPACE, 0, RLIM64_INFINITY, 0, NULL)); + ssize_t resid; + + if (vn_rdwr(UIO_READ, file->vp, buf, size, (offset_t)off, + UIO_SYSSPACE, 0, 0, 0, &resid) != 0) + return (-1); + + return (size - resid); } /* kobj_read_file() */ EXPORT_SYMBOL(kobj_read_file);