Commit 38baba9e authored by Al Viro's avatar Al Viro

9p: add fid-based variant of v9fs_xattr_set()

... making v9fs_xattr_set() a wrapper for it.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 8add862f
...@@ -110,20 +110,27 @@ ssize_t v9fs_xattr_get(struct dentry *dentry, const char *name, ...@@ -110,20 +110,27 @@ ssize_t v9fs_xattr_get(struct dentry *dentry, const char *name,
*/ */
int v9fs_xattr_set(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) 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; u64 offset = 0;
int retval, msize, write_count; int retval, msize, write_count;
struct p9_fid *fid = NULL;
p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n", p9_debug(P9_DEBUG_VFS, "name = %s value_len = %zu flags = %d\n",
name, value_len, flags); name, value_len, flags);
fid = v9fs_fid_clone(dentry); /* Clone it */
if (IS_ERR(fid)) { fid = p9_client_walk(fid, 0, NULL, 1);
retval = PTR_ERR(fid); if (IS_ERR(fid))
fid = NULL; return PTR_ERR(fid);
goto error;
}
/* /*
* On success fid points to xattr * On success fid points to xattr
*/ */
...@@ -131,7 +138,8 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name, ...@@ -131,7 +138,8 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name,
if (retval < 0) { if (retval < 0) {
p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n", p9_debug(P9_DEBUG_VFS, "p9_client_xattrcreate failed %d\n",
retval); retval);
goto error; p9_client_clunk(fid);
return retval;
} }
msize = fid->clnt->msize; msize = fid->clnt->msize;
while (value_len) { while (value_len) {
...@@ -144,17 +152,12 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name, ...@@ -144,17 +152,12 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name,
if (write_count < 0) { if (write_count < 0) {
/* error in xattr write */ /* error in xattr write */
retval = write_count; retval = write_count;
goto error; break;
} }
offset += write_count; offset += write_count;
value_len -= write_count; value_len -= write_count;
} }
/* Total read xattr bytes */ return p9_client_clunk(fid);
retval = offset;
error:
if (fid)
retval = p9_client_clunk(fid);
return retval;
} }
ssize_t v9fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size) ssize_t v9fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
......
...@@ -27,6 +27,8 @@ extern ssize_t v9fs_fid_xattr_get(struct p9_fid *, const char *, ...@@ -27,6 +27,8 @@ extern ssize_t v9fs_fid_xattr_get(struct p9_fid *, const char *,
void *, size_t); void *, size_t);
extern ssize_t v9fs_xattr_get(struct dentry *, const char *, extern ssize_t v9fs_xattr_get(struct dentry *, const char *,
void *, size_t); 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 *, extern int v9fs_xattr_set(struct dentry *, const char *,
const void *, size_t, int); const void *, size_t, int);
extern ssize_t v9fs_listxattr(struct dentry *, char *, size_t); extern ssize_t v9fs_listxattr(struct dentry *, char *, size_t);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment