]> Git Repo - linux.git/blobdiff - fs/fuse/dir.c
i2c: ocores: refactor setup for polling
[linux.git] / fs / fuse / dir.c
index e909678afa2d06770946b39903e86ef0ee8cb6b4..dd0f64f7bc060d85158aaacd85036f2679898e78 100644 (file)
@@ -149,21 +149,6 @@ static void fuse_lookup_init(struct fuse_conn *fc, struct fuse_args *args,
        args->out.args[0].value = outarg;
 }
 
-u64 fuse_get_attr_version(struct fuse_conn *fc)
-{
-       u64 curr_version;
-
-       /*
-        * The spin lock isn't actually needed on 64bit archs, but we
-        * don't yet care too much about such optimizations.
-        */
-       spin_lock(&fc->lock);
-       curr_version = fc->attr_version;
-       spin_unlock(&fc->lock);
-
-       return curr_version;
-}
-
 /*
  * Check whether the dentry is still valid
  *
@@ -222,9 +207,9 @@ static int fuse_dentry_revalidate(struct dentry *entry, unsigned int flags)
                                fuse_queue_forget(fc, forget, outarg.nodeid, 1);
                                goto invalid;
                        }
-                       spin_lock(&fc->lock);
+                       spin_lock(&fi->lock);
                        fi->nlookup++;
-                       spin_unlock(&fc->lock);
+                       spin_unlock(&fi->lock);
                }
                kfree(forget);
                if (ret == -ENOMEM)
@@ -400,6 +385,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
        struct fuse_create_in inarg;
        struct fuse_open_out outopen;
        struct fuse_entry_out outentry;
+       struct fuse_inode *fi;
        struct fuse_file *ff;
 
        /* Userspace expects S_IFREG in create mode */
@@ -451,7 +437,7 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
                          &outentry.attr, entry_attr_timeout(&outentry), 0);
        if (!inode) {
                flags &= ~(O_CREAT | O_EXCL | O_TRUNC);
-               fuse_sync_release(ff, flags);
+               fuse_sync_release(NULL, ff, flags);
                fuse_queue_forget(fc, forget, outentry.nodeid, 1);
                err = -ENOMEM;
                goto out_err;
@@ -462,7 +448,8 @@ static int fuse_create_open(struct inode *dir, struct dentry *entry,
        fuse_dir_changed(dir);
        err = finish_open(file, entry, generic_file_open);
        if (err) {
-               fuse_sync_release(ff, flags);
+               fi = get_fuse_inode(inode);
+               fuse_sync_release(fi, ff, flags);
        } else {
                file->private_data = ff;
                fuse_finish_open(inode, file);
@@ -671,8 +658,8 @@ static int fuse_unlink(struct inode *dir, struct dentry *entry)
                struct inode *inode = d_inode(entry);
                struct fuse_inode *fi = get_fuse_inode(inode);
 
-               spin_lock(&fc->lock);
-               fi->attr_version = ++fc->attr_version;
+               spin_lock(&fi->lock);
+               fi->attr_version = atomic64_inc_return(&fc->attr_version);
                /*
                 * If i_nlink == 0 then unlink doesn't make sense, yet this can
                 * happen if userspace filesystem is careless.  It would be
@@ -681,7 +668,7 @@ static int fuse_unlink(struct inode *dir, struct dentry *entry)
                 */
                if (inode->i_nlink > 0)
                        drop_nlink(inode);
-               spin_unlock(&fc->lock);
+               spin_unlock(&fi->lock);
                fuse_invalidate_attr(inode);
                fuse_dir_changed(dir);
                fuse_invalidate_entry_cache(entry);
@@ -825,10 +812,10 @@ static int fuse_link(struct dentry *entry, struct inode *newdir,
        if (!err) {
                struct fuse_inode *fi = get_fuse_inode(inode);
 
-               spin_lock(&fc->lock);
-               fi->attr_version = ++fc->attr_version;
+               spin_lock(&fi->lock);
+               fi->attr_version = atomic64_inc_return(&fc->attr_version);
                inc_nlink(inode);
-               spin_unlock(&fc->lock);
+               spin_unlock(&fi->lock);
                fuse_invalidate_attr(inode);
                fuse_update_ctime(inode);
        } else if (err == -EINTR) {
@@ -1356,15 +1343,14 @@ static void iattr_to_fattr(struct fuse_conn *fc, struct iattr *iattr,
  */
 void fuse_set_nowrite(struct inode *inode)
 {
-       struct fuse_conn *fc = get_fuse_conn(inode);
        struct fuse_inode *fi = get_fuse_inode(inode);
 
        BUG_ON(!inode_is_locked(inode));
 
-       spin_lock(&fc->lock);
+       spin_lock(&fi->lock);
        BUG_ON(fi->writectr < 0);
        fi->writectr += FUSE_NOWRITE;
-       spin_unlock(&fc->lock);
+       spin_unlock(&fi->lock);
        wait_event(fi->page_waitq, fi->writectr == FUSE_NOWRITE);
 }
 
@@ -1385,11 +1371,11 @@ static void __fuse_release_nowrite(struct inode *inode)
 
 void fuse_release_nowrite(struct inode *inode)
 {
-       struct fuse_conn *fc = get_fuse_conn(inode);
+       struct fuse_inode *fi = get_fuse_inode(inode);
 
-       spin_lock(&fc->lock);
+       spin_lock(&fi->lock);
        __fuse_release_nowrite(inode);
-       spin_unlock(&fc->lock);
+       spin_unlock(&fi->lock);
 }
 
 static void fuse_setattr_fill(struct fuse_conn *fc, struct fuse_args *args,
@@ -1524,7 +1510,7 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
                goto error;
        }
 
-       spin_lock(&fc->lock);
+       spin_lock(&fi->lock);
        /* the kernel maintains i_mtime locally */
        if (trust_local_cmtime) {
                if (attr->ia_valid & ATTR_MTIME)
@@ -1542,10 +1528,10 @@ int fuse_do_setattr(struct dentry *dentry, struct iattr *attr,
                i_size_write(inode, outarg.attr.size);
 
        if (is_truncate) {
-               /* NOTE: this may release/reacquire fc->lock */
+               /* NOTE: this may release/reacquire fi->lock */
                __fuse_release_nowrite(inode);
        }
-       spin_unlock(&fc->lock);
+       spin_unlock(&fi->lock);
 
        /*
         * Only call invalidate_inode_pages2() after removing
This page took 0.046205 seconds and 4 git commands to generate.