aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <miklos@szeredi.hu>2005-08-25 15:19:06 +0000
committerGravatar Miklos Szeredi <miklos@szeredi.hu>2005-08-25 15:19:06 +0000
commitecce1bf2ff73eb37048a784df0fa97ad041c6bdd (patch)
tree21d192874d6e9ad229f3fbd74abd9e6cb0abe61b /lib
parentb0c52c59f710b4619949adfc359dabfca005fe0d (diff)
fix
Diffstat (limited to 'lib')
-rw-r--r--lib/fuse.c16
-rw-r--r--lib/fuse_lowlevel.c23
2 files changed, 30 insertions, 9 deletions
diff --git a/lib/fuse.c b/lib/fuse.c
index 237dee1..7f8ed3d 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -612,13 +612,16 @@ static void fuse_forget(fuse_req_t req, fuse_ino_t ino, unsigned long nlookup)
fuse_reply_none(req);
}
-static void fuse_getattr(fuse_req_t req, fuse_ino_t ino)
+static void fuse_getattr(fuse_req_t req, fuse_ino_t ino,
+ struct fuse_file_info *fi)
{
struct fuse *f = req_fuse_prepare(req);
struct stat buf;
char *path;
int err;
+ (void) fi;
+
err = -ENOENT;
pthread_rwlock_rdlock(&f->tree_lock);
path = get_path(f, ino);
@@ -661,12 +664,15 @@ static int do_chown(struct fuse *f, const char *path, struct stat *attr,
return err;
}
-static int do_truncate(struct fuse *f, const char *path, struct stat *attr)
+static int do_truncate(struct fuse *f, const char *path, struct stat *attr,
+ struct fuse_file_info *fi)
{
int err;
err = -ENOSYS;
- if (f->op.truncate)
+ if (fi && f->op.ftruncate)
+ err = f->op.ftruncate(path, attr->st_size, fi);
+ else if (f->op.truncate)
err = f->op.truncate(path, attr->st_size);
return err;
@@ -686,7 +692,7 @@ static int do_utime(struct fuse *f, const char *path, struct stat *attr)
}
static void fuse_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr,
- int valid)
+ int valid, struct fuse_file_info *fi)
{
struct fuse *f = req_fuse_prepare(req);
struct stat buf;
@@ -705,7 +711,7 @@ static void fuse_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr,
if (!err && (valid & (FUSE_SET_ATTR_UID | FUSE_SET_ATTR_GID)))
err = do_chown(f, path, attr, valid);
if (!err && (valid & FUSE_SET_ATTR_SIZE))
- err = do_truncate(f, path, attr);
+ err = do_truncate(f, path, attr, fi);
if (!err && (valid & (FUSE_SET_ATTR_ATIME | FUSE_SET_ATTR_MTIME)) == (FUSE_SET_ATTR_ATIME | FUSE_SET_ATTR_MTIME))
err = do_utime(f, path, attr);
if (!err)
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 893f723..3bbc296 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -74,6 +74,7 @@ static const char *opname(enum fuse_opcode opcode)
case FUSE_SETLKW: return "SETLKW";
case FUSE_ACCESS: return "ACCESS";
case FUSE_CREATE: return "CREATE";
+ case FUSE_FSETATTR: return "FSETATTR";
default: return "???";
}
}
@@ -394,23 +395,33 @@ static void do_forget(fuse_req_t req, fuse_ino_t nodeid,
static void do_getattr(fuse_req_t req, fuse_ino_t nodeid)
{
if (req->f->op.getattr)
- req->f->op.getattr(req, nodeid);
+ req->f->op.getattr(req, nodeid, NULL);
else
fuse_reply_err(req, ENOSYS);
}
static void do_setattr(fuse_req_t req, fuse_ino_t nodeid,
- struct fuse_setattr_in *arg)
+ struct fuse_setattr_in *arg, struct fuse_file_info *fi)
{
if (req->f->op.setattr) {
struct stat stbuf;
memset(&stbuf, 0, sizeof(stbuf));
convert_attr(&arg->attr, &stbuf);
- req->f->op.setattr(req, nodeid, &stbuf, arg->valid);
+ req->f->op.setattr(req, nodeid, &stbuf, arg->valid, fi);
} else
fuse_reply_err(req, ENOSYS);
}
+static void do_fsetattr(fuse_req_t req, fuse_ino_t nodeid,
+ struct fuse_fsetattr_in *arg)
+{
+ struct fuse_file_info fi;
+
+ memset(&fi, 0, sizeof(fi));
+ fi.fh = arg->fh;
+ do_setattr(req, nodeid, &arg->setattr, &fi);
+}
+
static void do_access(fuse_req_t req, fuse_ino_t nodeid,
struct fuse_access_in *arg)
{
@@ -813,7 +824,11 @@ static void fuse_ll_process(void *data, const char *buf, size_t len,
break;
case FUSE_SETATTR:
- do_setattr(req, in->nodeid, (struct fuse_setattr_in *) inarg);
+ do_setattr(req, in->nodeid, (struct fuse_setattr_in *) inarg, NULL);
+ break;
+
+ case FUSE_FSETATTR:
+ do_fsetattr(req, in->nodeid, (struct fuse_fsetattr_in *) inarg);
break;
case FUSE_READLINK: