Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 218954
b: refs/heads/master
c: 329176c
h: refs/heads/master
v: v3
  • Loading branch information
M. Mohan Kumar authored and Eric Van Hensbergen committed Oct 28, 2010
1 parent a5dc7e5 commit 2bd420d
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 4 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 368c09d2a303c39e9f37193b23e945e6754cf0a7
refs/heads/master: 329176cc2c50e63c580ddaabb385876db5af1360
60 changes: 57 additions & 3 deletions trunk/fs/9p/vfs_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -1527,7 +1527,7 @@ static int v9fs_readlink(struct dentry *dentry, char *buffer, int buflen)
if (IS_ERR(fid))
return PTR_ERR(fid);

if (!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses))
if (!v9fs_proto_dotu(v9ses))
return -EBADF;

st = p9_client_stat(fid);
Expand Down Expand Up @@ -1995,6 +1995,60 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode,
return err;
}

static int
v9fs_vfs_readlink_dotl(struct dentry *dentry, char *buffer, int buflen)
{
int retval;
struct p9_fid *fid;
char *target = NULL;

P9_DPRINTK(P9_DEBUG_VFS, " %s\n", dentry->d_name.name);
retval = -EPERM;
fid = v9fs_fid_lookup(dentry);
if (IS_ERR(fid))
return PTR_ERR(fid);

retval = p9_client_readlink(fid, &target);
if (retval < 0)
return retval;

strncpy(buffer, target, buflen);
P9_DPRINTK(P9_DEBUG_VFS, "%s -> %s\n", dentry->d_name.name, buffer);

retval = strnlen(buffer, buflen);
return retval;
}

/**
* v9fs_vfs_follow_link_dotl - follow a symlink path
* @dentry: dentry for symlink
* @nd: nameidata
*
*/

static void *
v9fs_vfs_follow_link_dotl(struct dentry *dentry, struct nameidata *nd)
{
int len = 0;
char *link = __getname();

P9_DPRINTK(P9_DEBUG_VFS, "%s n", dentry->d_name.name);

if (!link)
link = ERR_PTR(-ENOMEM);
else {
len = v9fs_vfs_readlink_dotl(dentry, link, PATH_MAX);
if (len < 0) {
__putname(link);
link = ERR_PTR(len);
} else
link[min(len, PATH_MAX-1)] = 0;
}
nd_set_link(nd, link);

return NULL;
}

static const struct inode_operations v9fs_dir_inode_operations_dotu = {
.create = v9fs_vfs_create,
.lookup = v9fs_vfs_lookup,
Expand Down Expand Up @@ -2064,8 +2118,8 @@ static const struct inode_operations v9fs_symlink_inode_operations = {
};

static const struct inode_operations v9fs_symlink_inode_operations_dotl = {
.readlink = generic_readlink,
.follow_link = v9fs_vfs_follow_link,
.readlink = v9fs_vfs_readlink_dotl,
.follow_link = v9fs_vfs_follow_link_dotl,
.put_link = v9fs_vfs_put_link,
.getattr = v9fs_vfs_getattr_dotl,
.setattr = v9fs_vfs_setattr_dotl,
Expand Down
2 changes: 2 additions & 0 deletions trunk/include/net/9p/9p.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ enum p9_msg_t {
P9_RMKNOD,
P9_TRENAME = 20,
P9_RRENAME,
P9_TREADLINK = 22,
P9_RREADLINK,
P9_TGETATTR = 24,
P9_RGETATTR,
P9_TSETATTR = 26,
Expand Down
1 change: 1 addition & 0 deletions trunk/include/net/9p/client.h
Original file line number Diff line number Diff line change
Expand Up @@ -262,5 +262,6 @@ int p9_is_proto_dotu(struct p9_client *clnt);
int p9_is_proto_dotl(struct p9_client *clnt);
struct p9_fid *p9_client_xattrwalk(struct p9_fid *, const char *, u64 *);
int p9_client_xattrcreate(struct p9_fid *, const char *, u64, int);
int p9_client_readlink(struct p9_fid *fid, char **target);

#endif /* NET_9P_CLIENT_H */
26 changes: 26 additions & 0 deletions trunk/net/9p/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -1870,3 +1870,29 @@ int p9_client_getlock_dotl(struct p9_fid *fid, struct p9_getlock *glock)
return err;
}
EXPORT_SYMBOL(p9_client_getlock_dotl);

int p9_client_readlink(struct p9_fid *fid, char **target)
{
int err;
struct p9_client *clnt;
struct p9_req_t *req;

err = 0;
clnt = fid->clnt;
P9_DPRINTK(P9_DEBUG_9P, ">>> TREADLINK fid %d\n", fid->fid);

req = p9_client_rpc(clnt, P9_TREADLINK, "d", fid->fid);
if (IS_ERR(req))
return PTR_ERR(req);

err = p9pdu_readf(req->rc, clnt->proto_version, "s", target);
if (err) {
p9pdu_dump(1, req->rc);
goto error;
}
P9_DPRINTK(P9_DEBUG_9P, "<<< RREADLINK target %s\n", *target);
error:
p9_free_req(clnt, req);
return err;
}
EXPORT_SYMBOL(p9_client_readlink);

0 comments on commit 2bd420d

Please sign in to comment.