aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2011-05-19 15:30:01 +0200
committerMiklos Szeredi <mszeredi@suse.cz>2011-05-19 15:30:01 +0200
commit7819846300dc036fb94569feff4f86cd33b459d9 (patch)
tree3952d289b0af4825d25121fce89927bdc7d7635b /lib
parentd915a6b4a84ae6e82f3756df9ca695395e5aacfe (diff)
downloadandroid_external_fuse-7819846300dc036fb94569feff4f86cd33b459d9.tar.gz
android_external_fuse-7819846300dc036fb94569feff4f86cd33b459d9.tar.bz2
android_external_fuse-7819846300dc036fb94569feff4f86cd33b459d9.zip
Add ->forget_multi() operation
Add ->forget_multi() operation to the lowlevel API. The filesystem may implement this to process multiple forget requests in one call
Diffstat (limited to 'lib')
-rw-r--r--lib/fuse.c26
-rw-r--r--lib/fuse_lowlevel.c9
2 files changed, 29 insertions, 6 deletions
diff --git a/lib/fuse.c b/lib/fuse.c
index 02af677..b8cce23 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -2493,17 +2493,34 @@ static void fuse_lib_lookup(fuse_req_t req, fuse_ino_t parent,
reply_entry(req, &e, err);
}
+static void do_forget(struct fuse *f, fuse_ino_t ino, uint64_t nlookup)
+{
+ if (f->conf.debug)
+ fprintf(stderr, "FORGET %llu/%llu\n", (unsigned long long)ino,
+ (unsigned long long) nlookup);
+ forget_node(f, ino, nlookup);
+}
+
static void fuse_lib_forget(fuse_req_t req, fuse_ino_t ino,
unsigned long nlookup)
{
+ do_forget(req_fuse(req), ino, nlookup);
+ fuse_reply_none(req);
+}
+
+static void fuse_lib_forget_multi(fuse_req_t req, size_t count,
+ struct fuse_forget_data *forgets)
+{
struct fuse *f = req_fuse(req);
- if (f->conf.debug)
- fprintf(stderr, "FORGET %llu/%lu\n", (unsigned long long)ino,
- nlookup);
- forget_node(f, ino, nlookup);
+ size_t i;
+
+ for (i = 0; i < count; i++)
+ do_forget(f, forgets[i].ino, forgets[i].nlookup);
+
fuse_reply_none(req);
}
+
static void fuse_lib_getattr(fuse_req_t req, fuse_ino_t ino,
struct fuse_file_info *fi)
{
@@ -3820,6 +3837,7 @@ static struct fuse_lowlevel_ops fuse_path_ops = {
.destroy = fuse_lib_destroy,
.lookup = fuse_lib_lookup,
.forget = fuse_lib_forget,
+ .forget_multi = fuse_lib_forget_multi,
.getattr = fuse_lib_getattr,
.setattr = fuse_lib_setattr,
.access = fuse_lib_access,
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 4643a8a..faa415a 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -906,7 +906,10 @@ static void do_batch_forget(fuse_req_t req, fuse_ino_t nodeid,
(void) nodeid;
- if (req->f->op.forget) {
+ if (req->f->op.forget_multi) {
+ req->f->op.forget_multi(req, arg->count,
+ (struct fuse_forget_data *) param);
+ } else if (req->f->op.forget) {
for (i = 0; i < arg->count; i++) {
struct fuse_forget_one *forget = &param[i];
struct fuse_req *dummy_req;
@@ -922,8 +925,10 @@ static void do_batch_forget(fuse_req_t req, fuse_ino_t nodeid,
req->f->op.forget(dummy_req, forget->nodeid,
forget->nlookup);
}
+ fuse_reply_none(req);
+ } else {
+ fuse_reply_none(req);
}
- fuse_reply_none(req);
}
static void do_getattr(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)