Commit 4fd5ec50 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
  9p: Optimize TCREATE by eliminating a redundant fid clone.
  9p: cleanup: remove unneeded assignment
  9p: Add mksock support
  fs/9p: Make sure we properly instantiate dentry.
  9p: add 9P2000.L rename operation
  9p: add 9P2000.L statfs operation
  9p: VFS switches for 9p2000.L: VFS switches
  9p: VFS switches for 9p2000.L: protocol and client changes
parents 6e188240 6d27e64d
...@@ -40,7 +40,9 @@ ...@@ -40,7 +40,9 @@
extern struct file_system_type v9fs_fs_type; extern struct file_system_type v9fs_fs_type;
extern const struct address_space_operations v9fs_addr_operations; extern const struct address_space_operations v9fs_addr_operations;
extern const struct file_operations v9fs_file_operations; extern const struct file_operations v9fs_file_operations;
extern const struct file_operations v9fs_file_operations_dotl;
extern const struct file_operations v9fs_dir_operations; extern const struct file_operations v9fs_dir_operations;
extern const struct file_operations v9fs_dir_operations_dotl;
extern const struct dentry_operations v9fs_dentry_operations; extern const struct dentry_operations v9fs_dentry_operations;
extern const struct dentry_operations v9fs_cached_dentry_operations; extern const struct dentry_operations v9fs_cached_dentry_operations;
......
...@@ -203,3 +203,11 @@ const struct file_operations v9fs_dir_operations = { ...@@ -203,3 +203,11 @@ const struct file_operations v9fs_dir_operations = {
.open = v9fs_file_open, .open = v9fs_file_open,
.release = v9fs_dir_release, .release = v9fs_dir_release,
}; };
const struct file_operations v9fs_dir_operations_dotl = {
.read = generic_read_dir,
.llseek = generic_file_llseek,
.readdir = v9fs_dir_readdir,
.open = v9fs_file_open,
.release = v9fs_dir_release,
};
...@@ -296,3 +296,14 @@ const struct file_operations v9fs_file_operations = { ...@@ -296,3 +296,14 @@ const struct file_operations v9fs_file_operations = {
.mmap = generic_file_readonly_mmap, .mmap = generic_file_readonly_mmap,
.fsync = v9fs_file_fsync, .fsync = v9fs_file_fsync,
}; };
const struct file_operations v9fs_file_operations_dotl = {
.llseek = generic_file_llseek,
.read = v9fs_file_read,
.write = v9fs_file_write,
.open = v9fs_file_open,
.release = v9fs_dir_release,
.lock = v9fs_file_lock,
.mmap = generic_file_readonly_mmap,
.fsync = v9fs_file_fsync,
};
...@@ -44,9 +44,12 @@ ...@@ -44,9 +44,12 @@
#include "cache.h" #include "cache.h"
static const struct inode_operations v9fs_dir_inode_operations; static const struct inode_operations v9fs_dir_inode_operations;
static const struct inode_operations v9fs_dir_inode_operations_ext; static const struct inode_operations v9fs_dir_inode_operations_dotu;
static const struct inode_operations v9fs_dir_inode_operations_dotl;
static const struct inode_operations v9fs_file_inode_operations; static const struct inode_operations v9fs_file_inode_operations;
static const struct inode_operations v9fs_file_inode_operations_dotl;
static const struct inode_operations v9fs_symlink_inode_operations; static const struct inode_operations v9fs_symlink_inode_operations;
static const struct inode_operations v9fs_symlink_inode_operations_dotl;
/** /**
* unixmode2p9mode - convert unix mode bits to plan 9 * unixmode2p9mode - convert unix mode bits to plan 9
...@@ -273,25 +276,44 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode) ...@@ -273,25 +276,44 @@ struct inode *v9fs_get_inode(struct super_block *sb, int mode)
init_special_inode(inode, inode->i_mode, inode->i_rdev); init_special_inode(inode, inode->i_mode, inode->i_rdev);
break; break;
case S_IFREG: case S_IFREG:
if (v9fs_proto_dotl(v9ses)) {
inode->i_op = &v9fs_file_inode_operations_dotl;
inode->i_fop = &v9fs_file_operations_dotl;
} else {
inode->i_op = &v9fs_file_inode_operations; inode->i_op = &v9fs_file_inode_operations;
inode->i_fop = &v9fs_file_operations; inode->i_fop = &v9fs_file_operations;
}
break; break;
case S_IFLNK: case S_IFLNK:
if (!v9fs_proto_dotu(v9ses)) { if (!v9fs_proto_dotu(v9ses) && !v9fs_proto_dotl(v9ses)) {
P9_DPRINTK(P9_DEBUG_ERROR, P9_DPRINTK(P9_DEBUG_ERROR, "extended modes used with "
"extended modes used w/o 9P2000.u\n"); "legacy protocol.\n");
err = -EINVAL; err = -EINVAL;
goto error; goto error;
} }
if (v9fs_proto_dotl(v9ses))
inode->i_op = &v9fs_symlink_inode_operations_dotl;
else
inode->i_op = &v9fs_symlink_inode_operations; inode->i_op = &v9fs_symlink_inode_operations;
break; break;
case S_IFDIR: case S_IFDIR:
inc_nlink(inode); inc_nlink(inode);
if (v9fs_proto_dotu(v9ses)) if (v9fs_proto_dotl(v9ses))
inode->i_op = &v9fs_dir_inode_operations_ext; inode->i_op = &v9fs_dir_inode_operations_dotl;
else if (v9fs_proto_dotu(v9ses))
inode->i_op = &v9fs_dir_inode_operations_dotu;
else else
inode->i_op = &v9fs_dir_inode_operations; inode->i_op = &v9fs_dir_inode_operations;
if (v9fs_proto_dotl(v9ses))
inode->i_fop = &v9fs_dir_operations_dotl;
else
inode->i_fop = &v9fs_dir_operations; inode->i_fop = &v9fs_dir_operations;
break; break;
default: default:
P9_DPRINTK(P9_DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n", P9_DPRINTK(P9_DEBUG_ERROR, "BAD mode 0x%x S_IFMT 0x%x\n",
...@@ -432,14 +454,12 @@ static int v9fs_remove(struct inode *dir, struct dentry *file, int rmdir) ...@@ -432,14 +454,12 @@ static int v9fs_remove(struct inode *dir, struct dentry *file, int rmdir)
{ {
int retval; int retval;
struct inode *file_inode; struct inode *file_inode;
struct v9fs_session_info *v9ses;
struct p9_fid *v9fid; struct p9_fid *v9fid;
P9_DPRINTK(P9_DEBUG_VFS, "inode: %p dentry: %p rmdir: %d\n", dir, file, P9_DPRINTK(P9_DEBUG_VFS, "inode: %p dentry: %p rmdir: %d\n", dir, file,
rmdir); rmdir);
file_inode = file->d_inode; file_inode = file->d_inode;
v9ses = v9fs_inode2v9ses(file_inode);
v9fid = v9fs_fid_clone(file); v9fid = v9fs_fid_clone(file);
if (IS_ERR(v9fid)) if (IS_ERR(v9fid))
return PTR_ERR(v9fid); return PTR_ERR(v9fid);
...@@ -482,12 +502,11 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, ...@@ -482,12 +502,11 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
ofid = NULL; ofid = NULL;
fid = NULL; fid = NULL;
name = (char *) dentry->d_name.name; name = (char *) dentry->d_name.name;
dfid = v9fs_fid_clone(dentry->d_parent); dfid = v9fs_fid_lookup(dentry->d_parent);
if (IS_ERR(dfid)) { if (IS_ERR(dfid)) {
err = PTR_ERR(dfid); err = PTR_ERR(dfid);
P9_DPRINTK(P9_DEBUG_VFS, "fid clone failed %d\n", err); P9_DPRINTK(P9_DEBUG_VFS, "fid lookup failed %d\n", err);
dfid = NULL; return ERR_PTR(err);
goto error;
} }
/* clone a fid to use for creation */ /* clone a fid to use for creation */
...@@ -495,8 +514,7 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, ...@@ -495,8 +514,7 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
if (IS_ERR(ofid)) { if (IS_ERR(ofid)) {
err = PTR_ERR(ofid); err = PTR_ERR(ofid);
P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
ofid = NULL; return ERR_PTR(err);
goto error;
} }
err = p9_client_fcreate(ofid, name, perm, mode, extension); err = p9_client_fcreate(ofid, name, perm, mode, extension);
...@@ -506,14 +524,13 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, ...@@ -506,14 +524,13 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
} }
/* now walk from the parent so we can get unopened fid */ /* now walk from the parent so we can get unopened fid */
fid = p9_client_walk(dfid, 1, &name, 0); fid = p9_client_walk(dfid, 1, &name, 1);
if (IS_ERR(fid)) { if (IS_ERR(fid)) {
err = PTR_ERR(fid); err = PTR_ERR(fid);
P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); P9_DPRINTK(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err);
fid = NULL; fid = NULL;
goto error; goto error;
} else }
dfid = NULL;
/* instantiate inode and assign the unopened fid to the dentry */ /* instantiate inode and assign the unopened fid to the dentry */
inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb); inode = v9fs_inode_from_fid(v9ses, fid, dir->i_sb);
...@@ -536,9 +553,6 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, ...@@ -536,9 +553,6 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
return ofid; return ofid;
error: error:
if (dfid)
p9_client_clunk(dfid);
if (ofid) if (ofid)
p9_client_clunk(ofid); p9_client_clunk(ofid);
...@@ -673,8 +687,8 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry, ...@@ -673,8 +687,8 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
if (IS_ERR(fid)) { if (IS_ERR(fid)) {
result = PTR_ERR(fid); result = PTR_ERR(fid);
if (result == -ENOENT) { if (result == -ENOENT) {
d_add(dentry, NULL); inode = NULL;
return NULL; goto inst_out;
} }
return ERR_PTR(result); return ERR_PTR(result);
...@@ -691,7 +705,8 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry, ...@@ -691,7 +705,8 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
if (result < 0) if (result < 0)
goto error; goto error;
if ((fid->qid.version) && (v9ses->cache)) inst_out:
if (v9ses->cache)
dentry->d_op = &v9fs_cached_dentry_operations; dentry->d_op = &v9fs_cached_dentry_operations;
else else
dentry->d_op = &v9fs_dentry_operations; dentry->d_op = &v9fs_dentry_operations;
...@@ -770,6 +785,13 @@ v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry, ...@@ -770,6 +785,13 @@ v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
goto clunk_olddir; goto clunk_olddir;
} }
if (v9fs_proto_dotl(v9ses)) {
retval = p9_client_rename(oldfid, newdirfid,
(char *) new_dentry->d_name.name);
if (retval != -ENOSYS)
goto clunk_newdir;
}
/* 9P can only handle file rename in the same directory */ /* 9P can only handle file rename in the same directory */
if (memcmp(&olddirfid->qid, &newdirfid->qid, sizeof(newdirfid->qid))) { if (memcmp(&olddirfid->qid, &newdirfid->qid, sizeof(newdirfid->qid))) {
P9_DPRINTK(P9_DEBUG_ERROR, P9_DPRINTK(P9_DEBUG_ERROR,
...@@ -1195,6 +1217,8 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) ...@@ -1195,6 +1217,8 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
sprintf(name, "c %u %u", MAJOR(rdev), MINOR(rdev)); sprintf(name, "c %u %u", MAJOR(rdev), MINOR(rdev));
else if (S_ISFIFO(mode)) else if (S_ISFIFO(mode))
*name = 0; *name = 0;
else if (S_ISSOCK(mode))
*name = 0;
else { else {
__putname(name); __putname(name);
return -EINVAL; return -EINVAL;
...@@ -1206,7 +1230,21 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev) ...@@ -1206,7 +1230,21 @@ v9fs_vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
return retval; return retval;
} }
static const struct inode_operations v9fs_dir_inode_operations_ext = { static const struct inode_operations v9fs_dir_inode_operations_dotu = {
.create = v9fs_vfs_create,
.lookup = v9fs_vfs_lookup,
.symlink = v9fs_vfs_symlink,
.link = v9fs_vfs_link,
.unlink = v9fs_vfs_unlink,
.mkdir = v9fs_vfs_mkdir,
.rmdir = v9fs_vfs_rmdir,
.mknod = v9fs_vfs_mknod,
.rename = v9fs_vfs_rename,
.getattr = v9fs_vfs_getattr,
.setattr = v9fs_vfs_setattr,
};
static const struct inode_operations v9fs_dir_inode_operations_dotl = {
.create = v9fs_vfs_create, .create = v9fs_vfs_create,
.lookup = v9fs_vfs_lookup, .lookup = v9fs_vfs_lookup,
.symlink = v9fs_vfs_symlink, .symlink = v9fs_vfs_symlink,
...@@ -1237,6 +1275,11 @@ static const struct inode_operations v9fs_file_inode_operations = { ...@@ -1237,6 +1275,11 @@ static const struct inode_operations v9fs_file_inode_operations = {
.setattr = v9fs_vfs_setattr, .setattr = v9fs_vfs_setattr,
}; };
static const struct inode_operations v9fs_file_inode_operations_dotl = {
.getattr = v9fs_vfs_getattr,
.setattr = v9fs_vfs_setattr,
};
static const struct inode_operations v9fs_symlink_inode_operations = { static const struct inode_operations v9fs_symlink_inode_operations = {
.readlink = generic_readlink, .readlink = generic_readlink,
.follow_link = v9fs_vfs_follow_link, .follow_link = v9fs_vfs_follow_link,
...@@ -1244,3 +1287,11 @@ static const struct inode_operations v9fs_symlink_inode_operations = { ...@@ -1244,3 +1287,11 @@ static const struct inode_operations v9fs_symlink_inode_operations = {
.getattr = v9fs_vfs_getattr, .getattr = v9fs_vfs_getattr,
.setattr = v9fs_vfs_setattr, .setattr = v9fs_vfs_setattr,
}; };
static const struct inode_operations v9fs_symlink_inode_operations_dotl = {
.readlink = generic_readlink,
.follow_link = v9fs_vfs_follow_link,
.put_link = v9fs_vfs_put_link,
.getattr = v9fs_vfs_getattr,
.setattr = v9fs_vfs_setattr,
};
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include <linux/idr.h> #include <linux/idr.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/statfs.h>
#include <net/9p/9p.h> #include <net/9p/9p.h>
#include <net/9p/client.h> #include <net/9p/client.h>
...@@ -45,7 +46,7 @@ ...@@ -45,7 +46,7 @@
#include "v9fs_vfs.h" #include "v9fs_vfs.h"
#include "fid.h" #include "fid.h"
static const struct super_operations v9fs_super_ops; static const struct super_operations v9fs_super_ops, v9fs_super_ops_dotl;
/** /**
* v9fs_set_super - set the superblock * v9fs_set_super - set the superblock
...@@ -76,6 +77,9 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses, ...@@ -76,6 +77,9 @@ v9fs_fill_super(struct super_block *sb, struct v9fs_session_info *v9ses,
sb->s_blocksize_bits = fls(v9ses->maxdata - 1); sb->s_blocksize_bits = fls(v9ses->maxdata - 1);
sb->s_blocksize = 1 << sb->s_blocksize_bits; sb->s_blocksize = 1 << sb->s_blocksize_bits;
sb->s_magic = V9FS_MAGIC; sb->s_magic = V9FS_MAGIC;
if (v9fs_proto_dotl(v9ses))
sb->s_op = &v9fs_super_ops_dotl;
else
sb->s_op = &v9fs_super_ops; sb->s_op = &v9fs_super_ops;
sb->s_bdi = &v9ses->bdi; sb->s_bdi = &v9ses->bdi;
...@@ -211,6 +215,42 @@ v9fs_umount_begin(struct super_block *sb) ...@@ -211,6 +215,42 @@ v9fs_umount_begin(struct super_block *sb)
v9fs_session_begin_cancel(v9ses); v9fs_session_begin_cancel(v9ses);
} }
static int v9fs_statfs(struct dentry *dentry, struct kstatfs *buf)
{
struct v9fs_session_info *v9ses;
struct p9_fid *fid;
struct p9_rstatfs rs;
int res;
fid = v9fs_fid_lookup(dentry);
if (IS_ERR(fid)) {
res = PTR_ERR(fid);
goto done;
}
v9ses = v9fs_inode2v9ses(dentry->d_inode);
if (v9fs_proto_dotl(v9ses)) {
res = p9_client_statfs(fid, &rs);
if (res == 0) {
buf->f_type = rs.type;
buf->f_bsize = rs.bsize;
buf->f_blocks = rs.blocks;
buf->f_bfree = rs.bfree;
buf->f_bavail = rs.bavail;
buf->f_files = rs.files;
buf->f_ffree = rs.ffree;
buf->f_fsid.val[0] = rs.fsid & 0xFFFFFFFFUL;
buf->f_fsid.val[1] = (rs.fsid >> 32) & 0xFFFFFFFFUL;
buf->f_namelen = rs.namelen;
}
if (res != -ENOSYS)
goto done;
}
res = simple_statfs(dentry, buf);
done:
return res;
}
static const struct super_operations v9fs_super_ops = { static const struct super_operations v9fs_super_ops = {
#ifdef CONFIG_9P_FSCACHE #ifdef CONFIG_9P_FSCACHE
.alloc_inode = v9fs_alloc_inode, .alloc_inode = v9fs_alloc_inode,
...@@ -222,6 +262,17 @@ static const struct super_operations v9fs_super_ops = { ...@@ -222,6 +262,17 @@ static const struct super_operations v9fs_super_ops = {
.umount_begin = v9fs_umount_begin, .umount_begin = v9fs_umount_begin,
}; };
static const struct super_operations v9fs_super_ops_dotl = {
#ifdef CONFIG_9P_FSCACHE
.alloc_inode = v9fs_alloc_inode,
.destroy_inode = v9fs_destroy_inode,
#endif
.statfs = v9fs_statfs,
.clear_inode = v9fs_clear_inode,
.show_options = generic_show_options,
.umount_begin = v9fs_umount_begin,
};
struct file_system_type v9fs_fs_type = { struct file_system_type v9fs_fs_type = {
.name = "9p", .name = "9p",
.get_sb = v9fs_get_sb, .get_sb = v9fs_get_sb,
......
...@@ -86,6 +86,10 @@ do { \ ...@@ -86,6 +86,10 @@ do { \
/** /**
* enum p9_msg_t - 9P message types * enum p9_msg_t - 9P message types
* @P9_TSTATFS: file system status request
* @P9_RSTATFS: file system status response
* @P9_TRENAME: rename request
* @P9_RRENAME: rename response
* @P9_TVERSION: version handshake request * @P9_TVERSION: version handshake request
* @P9_RVERSION: version handshake response * @P9_RVERSION: version handshake response
* @P9_TAUTH: request to establish authentication channel * @P9_TAUTH: request to establish authentication channel
...@@ -125,6 +129,10 @@ do { \ ...@@ -125,6 +129,10 @@ do { \
*/ */
enum p9_msg_t { enum p9_msg_t {
P9_TSTATFS = 8,
P9_RSTATFS,
P9_TRENAME = 20,
P9_RRENAME,
P9_TVERSION = 100, P9_TVERSION = 100,
P9_RVERSION, P9_RVERSION,
P9_TAUTH = 102, P9_TAUTH = 102,
...@@ -350,6 +358,31 @@ struct p9_wstat { ...@@ -350,6 +358,31 @@ struct p9_wstat {
}; };
/* Structures for Protocol Operations */ /* Structures for Protocol Operations */
struct p9_tstatfs {
u32 fid;
};
struct p9_rstatfs {
u32 type;
u32 bsize;
u64 blocks;
u64 bfree;
u64 bavail;
u64 files;
u64 ffree;
u64 fsid;
u32 namelen;
};
struct p9_trename {
u32 fid;
u32 newdirfid;
struct p9_str name;
};
struct p9_rrename {
};
struct p9_tversion { struct p9_tversion {
u32 msize; u32 msize;
struct p9_str version; struct p9_str version;
......
...@@ -195,6 +195,8 @@ struct p9_fid { ...@@ -195,6 +195,8 @@ struct p9_fid {
struct list_head dlist; /* list of all fids attached to a dentry */ struct list_head dlist; /* list of all fids attached to a dentry */
}; };
int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb);
int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name);
int p9_client_version(struct p9_client *); int p9_client_version(struct p9_client *);
struct p9_client *p9_client_create(const char *dev_name, char *options); struct p9_client *p9_client_create(const char *dev_name, char *options);
void p9_client_destroy(struct p9_client *clnt); void p9_client_destroy(struct p9_client *clnt);
......
...@@ -1321,7 +1321,8 @@ static int p9_client_statsize(struct p9_wstat *wst, int proto_version) ...@@ -1321,7 +1321,8 @@ static int p9_client_statsize(struct p9_wstat *wst, int proto_version)
if (wst->muid) if (wst->muid)
ret += strlen(wst->muid); ret += strlen(wst->muid);
if (proto_version == p9_proto_2000u) { if ((proto_version == p9_proto_2000u) ||
(proto_version == p9_proto_2000L)) {
ret += 2+4+4+4; /* extension[s] n_uid[4] n_gid[4] n_muid[4] */ ret += 2+4+4+4; /* extension[s] n_uid[4] n_gid[4] n_muid[4] */
if (wst->extension) if (wst->extension)
ret += strlen(wst->extension); ret += strlen(wst->extension);
...@@ -1364,3 +1365,70 @@ int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst) ...@@ -1364,3 +1365,70 @@ int p9_client_wstat(struct p9_fid *fid, struct p9_wstat *wst)
return err; return err;
} }
EXPORT_SYMBOL(p9_client_wstat); EXPORT_SYMBOL(p9_client_wstat);
int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb)
{
int err;
struct p9_req_t *req;
struct p9_client *clnt;
err = 0;
clnt = fid->clnt;
P9_DPRINTK(P9_DEBUG_9P, ">>> TSTATFS fid %d\n", fid->fid);
req = p9_client_rpc(clnt, P9_TSTATFS, "d", fid->fid);
if (IS_ERR(req)) {
err = PTR_ERR(req);
goto error;
}
err = p9pdu_readf(req->rc, clnt->proto_version, "ddqqqqqqd", &sb->type,
&sb->bsize, &sb->blocks, &sb->bfree, &sb->bavail,
&sb->files, &sb->ffree, &sb->fsid, &sb->namelen);
if (err) {
p9pdu_dump(1, req->rc);
p9_free_req(clnt, req);
goto error;
}
P9_DPRINTK(P9_DEBUG_9P, "<<< RSTATFS fid %d type 0x%lx bsize %ld "
"blocks %llu bfree %llu bavail %llu files %llu ffree %llu "
"fsid %llu namelen %ld\n",
fid->fid, (long unsigned int)sb->type, (long int)sb->bsize,
sb->blocks, sb->bfree, sb->bavail, sb->files, sb->ffree,
sb->fsid, (long int)sb->namelen);
p9_free_req(clnt, req);
error:
return err;
}
EXPORT_SYMBOL(p9_client_statfs);
int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name)
{
int err;
struct p9_req_t *req;
struct p9_client *clnt;
err = 0;
clnt = fid->clnt;
P9_DPRINTK(P9_DEBUG_9P, ">>> TRENAME fid %d newdirfid %d name %s\n",
fid->fid, newdirfid->fid, name);
req = p9_client_rpc(clnt, P9_TRENAME, "dds", fid->fid,
newdirfid->fid, name);
if (IS_ERR(req)) {
err = PTR_ERR(req);
goto error;
}
P9_DPRINTK(P9_DEBUG_9P, "<<< RRENAME fid %d\n", fid->fid);
p9_free_req(clnt, req);
error:
return err;
}
EXPORT_SYMBOL(p9_client_rename);
...@@ -341,7 +341,8 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt, ...@@ -341,7 +341,8 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt,
} }
break; break;
case '?': case '?':
if (proto_version != p9_proto_2000u) if ((proto_version != p9_proto_2000u) &&
(proto_version != p9_proto_2000L))
return 0; return 0;
break; break;
default: default:
...@@ -488,7 +489,8 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, ...@@ -488,7 +489,8 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
} }
break; break;
case '?': case '?':
if (proto_version != p9_proto_2000u) if ((proto_version != p9_proto_2000u) &&
(proto_version != p9_proto_2000L))
return 0; return 0;
break; break;
default: default:
......
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