[PATCH] FUSE: add fsync operation for directories
[deliverable/linux.git] / fs / fuse / file.c
index 6dcae74ce7fa06e8c788d183e679d0249aba6f91..e225f8c0b2679b0f97f7396095b1d64c8ea2d129 100644 (file)
@@ -156,7 +156,8 @@ static int fuse_flush(struct file *file)
        return err;
 }
 
-static int fuse_fsync(struct file *file, struct dentry *de, int datasync)
+int fuse_fsync_common(struct file *file, struct dentry *de, int datasync,
+                     int isdir)
 {
        struct inode *inode = de->d_inode;
        struct fuse_conn *fc = get_fuse_conn(inode);
@@ -165,7 +166,7 @@ static int fuse_fsync(struct file *file, struct dentry *de, int datasync)
        struct fuse_fsync_in inarg;
        int err;
 
-       if (fc->no_fsync)
+       if ((!isdir && fc->no_fsync) || (isdir && fc->no_fsyncdir))
                return 0;
 
        req = fuse_get_request(fc);
@@ -175,7 +176,7 @@ static int fuse_fsync(struct file *file, struct dentry *de, int datasync)
        memset(&inarg, 0, sizeof(inarg));
        inarg.fh = ff->fh;
        inarg.fsync_flags = datasync ? 1 : 0;
-       req->in.h.opcode = FUSE_FSYNC;
+       req->in.h.opcode = isdir ? FUSE_FSYNCDIR : FUSE_FSYNC;
        req->in.h.nodeid = get_node_id(inode);
        req->inode = inode;
        req->file = file;
@@ -186,12 +187,20 @@ static int fuse_fsync(struct file *file, struct dentry *de, int datasync)
        err = req->out.h.error;
        fuse_put_request(fc, req);
        if (err == -ENOSYS) {
-               fc->no_fsync = 1;
+               if (isdir)
+                       fc->no_fsyncdir = 1;
+               else
+                       fc->no_fsync = 1;
                err = 0;
        }
        return err;
 }
 
+static int fuse_fsync(struct file *file, struct dentry *de, int datasync)
+{
+       return fuse_fsync_common(file, de, datasync, 0);
+}
+
 size_t fuse_send_read_common(struct fuse_req *req, struct file *file,
                             struct inode *inode, loff_t pos, size_t count,
                             int isdir)
This page took 0.024185 seconds and 5 git commands to generate.