aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/dev.c2
-rw-r--r--kernel/dir.c34
2 files changed, 25 insertions, 11 deletions
diff --git a/kernel/dev.c b/kernel/dev.c
index f0733d0..d8535e7 100644
--- a/kernel/dev.c
+++ b/kernel/dev.c
@@ -482,7 +482,7 @@ static ssize_t fuse_dev_write(struct file *file, const char *buf,
goto out;
}
- if (oh.error <= -512 || oh.error > 0) {
+ if (oh.error <= -1000 || oh.error > 0) {
printk("fuse_dev_write: bad error value\n");
return -EINVAL;
}
diff --git a/kernel/dir.c b/kernel/dir.c
index 34ab665..d5d79b1 100644
--- a/kernel/dir.c
+++ b/kernel/dir.c
@@ -751,7 +751,8 @@ static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
struct fuse_conn *fc = INO_FC(inode);
struct fuse_in in = FUSE_IN_INIT;
struct fuse_out out = FUSE_OUT_INIT;
- struct fuse_getlistxattr_in inarg;
+ struct fuse_getxattr_in inarg;
+ struct fuse_getxattr_out outarg;
memset(&inarg, 0, sizeof(inarg));
inarg.size = size;
@@ -763,13 +764,19 @@ static ssize_t fuse_getxattr(struct dentry *entry, const char *name,
in.args[0].value = &inarg;
in.args[1].size = strlen(name) + 1;
in.args[1].value = name;
- out.argvar = 1;
+ /* This is really two different operations rolled into one */
out.numargs = 1;
- out.args[0].size = size;
- out.args[0].value = value;
+ if(size) {
+ out.argvar = 1;
+ out.args[0].size = size;
+ out.args[0].value = value;
+ } else {
+ out.args[0].size = sizeof(outarg);
+ out.args[0].value = &outarg;
+ }
request_send(fc, &in, &out);
if(!out.h.error)
- return out.args[0].size;
+ return size ? out.args[0].size : outarg.size;
else
return out.h.error;
}
@@ -780,7 +787,8 @@ static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
struct fuse_conn *fc = INO_FC(inode);
struct fuse_in in = FUSE_IN_INIT;
struct fuse_out out = FUSE_OUT_INIT;
- struct fuse_getlistxattr_in inarg;
+ struct fuse_getxattr_in inarg;
+ struct fuse_getxattr_out outarg;
memset(&inarg, 0, sizeof(inarg));
inarg.size = size;
@@ -790,13 +798,19 @@ static ssize_t fuse_listxattr(struct dentry *entry, char *list, size_t size)
in.numargs = 1;
in.args[0].size = sizeof(inarg);
in.args[0].value = &inarg;
- out.argvar = 1;
+ /* This is really two different operations rolled into one */
out.numargs = 1;
- out.args[0].size = size;
- out.args[0].value = list;
+ if(size) {
+ out.argvar = 1;
+ out.args[0].size = size;
+ out.args[0].value = list;
+ } else {
+ out.args[0].size = sizeof(outarg);
+ out.args[0].value = &outarg;
+ }
request_send(fc, &in, &out);
if(!out.h.error)
- return out.args[0].size;
+ return size ? out.args[0].size : outarg.size;
else
return out.h.error;
}