9p: add fid-based variant of v9fs_xattr_set()
Al Viro [Thu, 31 Jan 2013 17:34:58 +0000 (12:34 -0500)]
... making v9fs_xattr_set() a wrapper for it.

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

fs/9p/xattr.c
fs/9p/xattr.h

index 29653b7..c45e016 100644 (file)
@@ -111,19 +111,26 @@ ssize_t v9fs_xattr_get(struct dentry *dentry, const char *name,
 int v9fs_xattr_set(struct dentry *dentry, const char *name,
                   const void *value, size_t value_len, int flags)
 {
+       struct p9_fid *fid = v9fs_fid_lookup(dentry);
+       if (IS_ERR(fid))
+               return PTR_ERR(fid);
+       return v9fs_fid_xattr_set(fid, name, value, value_len, flags);
+}
+
+int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name,
+                  const void *value, size_t value_len, int flags)
+{
        u64 offset = 0;
        int retval, msize, write_count;
-       struct p9_fid *fid = NULL;
 
        p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n",
                 name, value_len, flags);
 
-       fid = v9fs_fid_clone(dentry);
-       if (IS_ERR(fid)) {
-               retval = PTR_ERR(fid);
-               fid = NULL;
-               goto error;
-       }
+       /* Clone it */
+       fid = p9_client_walk(fid, 0, NULL, 1);
+       if (IS_ERR(fid))
+               return PTR_ERR(fid);
+
        /*
         * On success fid points to xattr
         */
@@ -131,7 +138,8 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name,
        if (retval < 0) {
                p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n",
                         retval);
-               goto error;
+               p9_client_clunk(fid);
+               return retval;
        }
        msize = fid->clnt->msize;
        while (value_len) {
@@ -144,17 +152,12 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name,
                if (write_count < 0) {
                        /* error in xattr write */
                        retval = write_count;
-                       goto error;
+                       break;
                }
                offset += write_count;
                value_len -= write_count;
        }
-       /* Total read xattr bytes */
-       retval = offset;
-error:
-       if (fid)
-               retval = p9_client_clunk(fid);
-       return retval;
+       return p9_client_clunk(fid);
 }
 
 ssize_t v9fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
index eaa837c..eec348a 100644 (file)
@@ -27,6 +27,8 @@ extern ssize_t v9fs_fid_xattr_get(struct p9_fid *, const char *,
                                  void *, size_t);
 extern ssize_t v9fs_xattr_get(struct dentry *, const char *,
                              void *, size_t);
+extern int v9fs_fid_xattr_set(struct p9_fid *, const char *,
+                         const void *, size_t, int);
 extern int v9fs_xattr_set(struct dentry *, const char *,
                          const void *, size_t, int);
 extern ssize_t v9fs_listxattr(struct dentry *, char *, size_t);