9p: add fid-based variant of v9fs_xattr_set()
... making v9fs_xattr_set() a wrapper for it. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -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,
|
|||||||
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,
|
|||||||
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 *,
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user