Commit 0ebc115d 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:
  net/9p: nwname should be an unsigned int
  9p: Fix sparse error
  fs/9p: Fix error reported by coccicheck
  9p: revert tsyncfs related changes
  fs/9p: Use write_inode for data sync on server
  fs/9p: Fix revalidate to return correct value
parents e82e6f16 b76225e2
...@@ -286,11 +286,9 @@ static struct p9_fid *v9fs_fid_clone_with_uid(struct dentry *dentry, uid_t uid) ...@@ -286,11 +286,9 @@ static struct p9_fid *v9fs_fid_clone_with_uid(struct dentry *dentry, uid_t uid)
struct p9_fid *v9fs_writeback_fid(struct dentry *dentry) struct p9_fid *v9fs_writeback_fid(struct dentry *dentry)
{ {
int err, flags; int err;
struct p9_fid *fid; struct p9_fid *fid;
struct v9fs_session_info *v9ses;
v9ses = v9fs_dentry2v9ses(dentry);
fid = v9fs_fid_clone_with_uid(dentry, 0); fid = v9fs_fid_clone_with_uid(dentry, 0);
if (IS_ERR(fid)) if (IS_ERR(fid))
goto error_out; goto error_out;
...@@ -299,17 +297,8 @@ struct p9_fid *v9fs_writeback_fid(struct dentry *dentry) ...@@ -299,17 +297,8 @@ struct p9_fid *v9fs_writeback_fid(struct dentry *dentry)
* dirty pages. We always request for the open fid in read-write * dirty pages. We always request for the open fid in read-write
* mode so that a partial page write which result in page * mode so that a partial page write which result in page
* read can work. * read can work.
*
* we don't have a tsyncfs operation for older version
* of protocol. So make sure the write back fid is
* opened in O_SYNC mode.
*/ */
if (!v9fs_proto_dotl(v9ses)) err = p9_client_open(fid, O_RDWR);
flags = O_RDWR | O_SYNC;
else
flags = O_RDWR;
err = p9_client_open(fid, flags);
if (err < 0) { if (err < 0) {
p9_client_clunk(fid); p9_client_clunk(fid);
fid = ERR_PTR(err); fid = ERR_PTR(err);
......
...@@ -116,7 +116,6 @@ struct v9fs_session_info { ...@@ -116,7 +116,6 @@ struct v9fs_session_info {
struct list_head slist; /* list of sessions registered with v9fs */ struct list_head slist; /* list of sessions registered with v9fs */
struct backing_dev_info bdi; struct backing_dev_info bdi;
struct rw_semaphore rename_sem; struct rw_semaphore rename_sem;
struct p9_fid *root_fid; /* Used for file system sync */
}; };
/* cache_validity flags */ /* cache_validity flags */
......
...@@ -126,7 +126,9 @@ static int v9fs_lookup_revalidate(struct dentry *dentry, struct nameidata *nd) ...@@ -126,7 +126,9 @@ static int v9fs_lookup_revalidate(struct dentry *dentry, struct nameidata *nd)
retval = v9fs_refresh_inode_dotl(fid, inode); retval = v9fs_refresh_inode_dotl(fid, inode);
else else
retval = v9fs_refresh_inode(fid, inode); retval = v9fs_refresh_inode(fid, inode);
if (retval <= 0) if (retval == -ENOENT)
return 0;
if (retval < 0)
return retval; return retval;
} }
out_valid: out_valid:
......
...@@ -811,7 +811,7 @@ v9fs_vfs_follow_link_dotl(struct dentry *dentry, struct nameidata *nd) ...@@ -811,7 +811,7 @@ v9fs_vfs_follow_link_dotl(struct dentry *dentry, struct nameidata *nd)
fid = v9fs_fid_lookup(dentry); fid = v9fs_fid_lookup(dentry);
if (IS_ERR(fid)) { if (IS_ERR(fid)) {
__putname(link); __putname(link);
link = ERR_PTR(PTR_ERR(fid)); link = ERR_CAST(fid);
goto ndset; goto ndset;
} }
retval = p9_client_readlink(fid, &target); retval = p9_client_readlink(fid, &target);
......
...@@ -154,6 +154,7 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, ...@@ -154,6 +154,7 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags,
retval = PTR_ERR(inode); retval = PTR_ERR(inode);
goto release_sb; goto release_sb;
} }
root = d_alloc_root(inode); root = d_alloc_root(inode);
if (!root) { if (!root) {
iput(inode); iput(inode);
...@@ -185,21 +186,10 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, ...@@ -185,21 +186,10 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags,
p9stat_free(st); p9stat_free(st);
kfree(st); kfree(st);
} }
v9fs_fid_add(root, fid);
retval = v9fs_get_acl(inode, fid); retval = v9fs_get_acl(inode, fid);
if (retval) if (retval)
goto release_sb; goto release_sb;
/* v9fs_fid_add(root, fid);
* Add the root fid to session info. This is used
* for file system sync. We want a cloned fid here
* so that we can do a sync_filesystem after a
* shrink_dcache_for_umount
*/
v9ses->root_fid = v9fs_fid_clone(root);
if (IS_ERR(v9ses->root_fid)) {
retval = PTR_ERR(v9ses->root_fid);
goto release_sb;
}
P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n"); P9_DPRINTK(P9_DEBUG_VFS, " simple set mount, return 0\n");
return dget(sb->s_root); return dget(sb->s_root);
...@@ -210,11 +200,15 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags, ...@@ -210,11 +200,15 @@ static struct dentry *v9fs_mount(struct file_system_type *fs_type, int flags,
v9fs_session_close(v9ses); v9fs_session_close(v9ses);
kfree(v9ses); kfree(v9ses);
return ERR_PTR(retval); return ERR_PTR(retval);
release_sb: release_sb:
/* /*
* we will do the session_close and root dentry * we will do the session_close and root dentry release
* release in the below call. * in the below call. But we need to clunk fid, because we haven't
* attached the fid to dentry so it won't get clunked
* automatically.
*/ */
p9_client_clunk(fid);
deactivate_locked_super(sb); deactivate_locked_super(sb);
return ERR_PTR(retval); return ERR_PTR(retval);
} }
...@@ -232,7 +226,7 @@ static void v9fs_kill_super(struct super_block *s) ...@@ -232,7 +226,7 @@ static void v9fs_kill_super(struct super_block *s)
P9_DPRINTK(P9_DEBUG_VFS, " %p\n", s); P9_DPRINTK(P9_DEBUG_VFS, " %p\n", s);
kill_anon_super(s); kill_anon_super(s);
p9_client_clunk(v9ses->root_fid);
v9fs_session_cancel(v9ses); v9fs_session_cancel(v9ses);
v9fs_session_close(v9ses); v9fs_session_close(v9ses);
kfree(v9ses); kfree(v9ses);
...@@ -285,14 +279,6 @@ static int v9fs_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -285,14 +279,6 @@ static int v9fs_statfs(struct dentry *dentry, struct kstatfs *buf)
return res; return res;
} }
static int v9fs_sync_fs(struct super_block *sb, int wait)
{
struct v9fs_session_info *v9ses = sb->s_fs_info;
P9_DPRINTK(P9_DEBUG_VFS, "v9fs_sync_fs: super_block %p\n", sb);
return p9_client_sync_fs(v9ses->root_fid);
}
static int v9fs_drop_inode(struct inode *inode) static int v9fs_drop_inode(struct inode *inode)
{ {
struct v9fs_session_info *v9ses; struct v9fs_session_info *v9ses;
...@@ -307,6 +293,51 @@ static int v9fs_drop_inode(struct inode *inode) ...@@ -307,6 +293,51 @@ static int v9fs_drop_inode(struct inode *inode)
return 1; return 1;
} }
static int v9fs_write_inode(struct inode *inode,
struct writeback_control *wbc)
{
int ret;
struct p9_wstat wstat;
struct v9fs_inode *v9inode;
/*
* send an fsync request to server irrespective of
* wbc->sync_mode.
*/
P9_DPRINTK(P9_DEBUG_VFS, "%s: inode %p\n", __func__, inode);
v9inode = V9FS_I(inode);
if (!v9inode->writeback_fid)
return 0;
v9fs_blank_wstat(&wstat);
ret = p9_client_wstat(v9inode->writeback_fid, &wstat);
if (ret < 0) {
__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
return ret;
}
return 0;
}
static int v9fs_write_inode_dotl(struct inode *inode,
struct writeback_control *wbc)
{
int ret;
struct v9fs_inode *v9inode;
/*
* send an fsync request to server irrespective of
* wbc->sync_mode.
*/
P9_DPRINTK(P9_DEBUG_VFS, "%s: inode %p\n", __func__, inode);
v9inode = V9FS_I(inode);
if (!v9inode->writeback_fid)
return 0;
ret = p9_client_fsync(v9inode->writeback_fid, 0);
if (ret < 0) {
__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
return ret;
}
return 0;
}
static const struct super_operations v9fs_super_ops = { static const struct super_operations v9fs_super_ops = {
.alloc_inode = v9fs_alloc_inode, .alloc_inode = v9fs_alloc_inode,
.destroy_inode = v9fs_destroy_inode, .destroy_inode = v9fs_destroy_inode,
...@@ -314,17 +345,18 @@ static const struct super_operations v9fs_super_ops = { ...@@ -314,17 +345,18 @@ static const struct super_operations v9fs_super_ops = {
.evict_inode = v9fs_evict_inode, .evict_inode = v9fs_evict_inode,
.show_options = generic_show_options, .show_options = generic_show_options,
.umount_begin = v9fs_umount_begin, .umount_begin = v9fs_umount_begin,
.write_inode = v9fs_write_inode,
}; };
static const struct super_operations v9fs_super_ops_dotl = { static const struct super_operations v9fs_super_ops_dotl = {
.alloc_inode = v9fs_alloc_inode, .alloc_inode = v9fs_alloc_inode,
.destroy_inode = v9fs_destroy_inode, .destroy_inode = v9fs_destroy_inode,
.sync_fs = v9fs_sync_fs,
.statfs = v9fs_statfs, .statfs = v9fs_statfs,
.drop_inode = v9fs_drop_inode, .drop_inode = v9fs_drop_inode,
.evict_inode = v9fs_evict_inode, .evict_inode = v9fs_evict_inode,
.show_options = generic_show_options, .show_options = generic_show_options,
.umount_begin = v9fs_umount_begin, .umount_begin = v9fs_umount_begin,
.write_inode = v9fs_write_inode_dotl,
}; };
struct file_system_type v9fs_fs_type = { struct file_system_type v9fs_fs_type = {
......
...@@ -139,8 +139,6 @@ do { \ ...@@ -139,8 +139,6 @@ do { \
*/ */
enum p9_msg_t { enum p9_msg_t {
P9_TSYNCFS = 0,
P9_RSYNCFS,
P9_TLERROR = 6, P9_TLERROR = 6,
P9_RLERROR, P9_RLERROR,
P9_TSTATFS = 8, P9_TSTATFS = 8,
......
...@@ -218,8 +218,8 @@ void p9_client_disconnect(struct p9_client *clnt); ...@@ -218,8 +218,8 @@ void p9_client_disconnect(struct p9_client *clnt);
void p9_client_begin_disconnect(struct p9_client *clnt); void p9_client_begin_disconnect(struct p9_client *clnt);
struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,
char *uname, u32 n_uname, char *aname); char *uname, u32 n_uname, char *aname);
struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames, struct p9_fid *p9_client_walk(struct p9_fid *oldfid, uint16_t nwname,
int clone); char **wnames, int clone);
int p9_client_open(struct p9_fid *fid, int mode); int p9_client_open(struct p9_fid *fid, int mode);
int p9_client_fcreate(struct p9_fid *fid, char *name, u32 perm, int mode, int p9_client_fcreate(struct p9_fid *fid, char *name, u32 perm, int mode,
char *extension); char *extension);
...@@ -230,7 +230,6 @@ int p9_client_create_dotl(struct p9_fid *ofid, char *name, u32 flags, u32 mode, ...@@ -230,7 +230,6 @@ int p9_client_create_dotl(struct p9_fid *ofid, char *name, u32 flags, u32 mode,
gid_t gid, struct p9_qid *qid); gid_t gid, struct p9_qid *qid);
int p9_client_clunk(struct p9_fid *fid); int p9_client_clunk(struct p9_fid *fid);
int p9_client_fsync(struct p9_fid *fid, int datasync); int p9_client_fsync(struct p9_fid *fid, int datasync);
int p9_client_sync_fs(struct p9_fid *fid);
int p9_client_remove(struct p9_fid *fid); int p9_client_remove(struct p9_fid *fid);
int p9_client_read(struct p9_fid *fid, char *data, char __user *udata, int p9_client_read(struct p9_fid *fid, char *data, char __user *udata,
u64 offset, u32 count); u64 offset, u32 count);
......
...@@ -929,15 +929,15 @@ struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid, ...@@ -929,15 +929,15 @@ struct p9_fid *p9_client_attach(struct p9_client *clnt, struct p9_fid *afid,
} }
EXPORT_SYMBOL(p9_client_attach); EXPORT_SYMBOL(p9_client_attach);
struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames, struct p9_fid *p9_client_walk(struct p9_fid *oldfid, uint16_t nwname,
int clone) char **wnames, int clone)
{ {
int err; int err;
struct p9_client *clnt; struct p9_client *clnt;
struct p9_fid *fid; struct p9_fid *fid;
struct p9_qid *wqids; struct p9_qid *wqids;
struct p9_req_t *req; struct p9_req_t *req;
int16_t nwqids, count; uint16_t nwqids, count;
err = 0; err = 0;
wqids = NULL; wqids = NULL;
...@@ -955,7 +955,7 @@ struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames, ...@@ -955,7 +955,7 @@ struct p9_fid *p9_client_walk(struct p9_fid *oldfid, int nwname, char **wnames,
fid = oldfid; fid = oldfid;
P9_DPRINTK(P9_DEBUG_9P, ">>> TWALK fids %d,%d nwname %d wname[0] %s\n", P9_DPRINTK(P9_DEBUG_9P, ">>> TWALK fids %d,%d nwname %ud wname[0] %s\n",
oldfid->fid, fid->fid, nwname, wnames ? wnames[0] : NULL); oldfid->fid, fid->fid, nwname, wnames ? wnames[0] : NULL);
req = p9_client_rpc(clnt, P9_TWALK, "ddT", oldfid->fid, fid->fid, req = p9_client_rpc(clnt, P9_TWALK, "ddT", oldfid->fid, fid->fid,
...@@ -1220,27 +1220,6 @@ int p9_client_fsync(struct p9_fid *fid, int datasync) ...@@ -1220,27 +1220,6 @@ int p9_client_fsync(struct p9_fid *fid, int datasync)
} }
EXPORT_SYMBOL(p9_client_fsync); EXPORT_SYMBOL(p9_client_fsync);
int p9_client_sync_fs(struct p9_fid *fid)
{
int err = 0;
struct p9_req_t *req;
struct p9_client *clnt;
P9_DPRINTK(P9_DEBUG_9P, ">>> TSYNC_FS fid %d\n", fid->fid);
clnt = fid->clnt;
req = p9_client_rpc(clnt, P9_TSYNCFS, "d", fid->fid);
if (IS_ERR(req)) {
err = PTR_ERR(req);
goto error;
}
P9_DPRINTK(P9_DEBUG_9P, "<<< RSYNCFS fid %d\n", fid->fid);
p9_free_req(clnt, req);
error:
return err;
}
EXPORT_SYMBOL(p9_client_sync_fs);
int p9_client_clunk(struct p9_fid *fid) int p9_client_clunk(struct p9_fid *fid)
{ {
int err; int err;
......
...@@ -265,7 +265,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt, ...@@ -265,7 +265,7 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt,
} }
break; break;
case 'T':{ case 'T':{
int16_t *nwname = va_arg(ap, int16_t *); uint16_t *nwname = va_arg(ap, uint16_t *);
char ***wnames = va_arg(ap, char ***); char ***wnames = va_arg(ap, char ***);
errcode = p9pdu_readf(pdu, proto_version, errcode = p9pdu_readf(pdu, proto_version,
...@@ -468,7 +468,8 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, ...@@ -468,7 +468,8 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
case 'E':{ case 'E':{
int32_t cnt = va_arg(ap, int32_t); int32_t cnt = va_arg(ap, int32_t);
const char *k = va_arg(ap, const void *); const char *k = va_arg(ap, const void *);
const char *u = va_arg(ap, const void *); const char __user *u = va_arg(ap,
const void __user *);
errcode = p9pdu_writef(pdu, proto_version, "d", errcode = p9pdu_writef(pdu, proto_version, "d",
cnt); cnt);
if (!errcode && pdu_write_urw(pdu, k, u, cnt)) if (!errcode && pdu_write_urw(pdu, k, u, cnt))
...@@ -495,7 +496,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, ...@@ -495,7 +496,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt,
} }
break; break;
case 'T':{ case 'T':{
int16_t nwname = va_arg(ap, int); uint16_t nwname = va_arg(ap, int);
const char **wnames = va_arg(ap, const char **); const char **wnames = va_arg(ap, const char **);
errcode = p9pdu_writef(pdu, proto_version, "w", errcode = p9pdu_writef(pdu, proto_version, "w",
......
...@@ -66,7 +66,7 @@ p9_payload_gup(struct p9_req_t *req, size_t *pdata_off, int *pdata_len, ...@@ -66,7 +66,7 @@ p9_payload_gup(struct p9_req_t *req, size_t *pdata_off, int *pdata_len,
uint32_t pdata_mapped_pages; uint32_t pdata_mapped_pages;
struct trans_rpage_info *rpinfo; struct trans_rpage_info *rpinfo;
*pdata_off = (size_t)req->tc->pubuf & (PAGE_SIZE-1); *pdata_off = (__force size_t)req->tc->pubuf & (PAGE_SIZE-1);
if (*pdata_off) if (*pdata_off)
first_page_bytes = min(((size_t)PAGE_SIZE - *pdata_off), first_page_bytes = min(((size_t)PAGE_SIZE - *pdata_off),
......
...@@ -326,8 +326,11 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req) ...@@ -326,8 +326,11 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req)
outp = pack_sg_list_p(chan->sg, out, VIRTQUEUE_NUM, outp = pack_sg_list_p(chan->sg, out, VIRTQUEUE_NUM,
pdata_off, rpinfo->rp_data, pdata_len); pdata_off, rpinfo->rp_data, pdata_len);
} else { } else {
char *pbuf = req->tc->pubuf ? req->tc->pubuf : char *pbuf;
req->tc->pkbuf; if (req->tc->pubuf)
pbuf = (__force char *) req->tc->pubuf;
else
pbuf = req->tc->pkbuf;
outp = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM, pbuf, outp = pack_sg_list(chan->sg, out, VIRTQUEUE_NUM, pbuf,
req->tc->pbuf_size); req->tc->pbuf_size);
} }
...@@ -352,8 +355,12 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req) ...@@ -352,8 +355,12 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req)
in = pack_sg_list_p(chan->sg, out+inp, VIRTQUEUE_NUM, in = pack_sg_list_p(chan->sg, out+inp, VIRTQUEUE_NUM,
pdata_off, rpinfo->rp_data, pdata_len); pdata_off, rpinfo->rp_data, pdata_len);
} else { } else {
char *pbuf = req->tc->pubuf ? req->tc->pubuf : char *pbuf;
req->tc->pkbuf; if (req->tc->pubuf)
pbuf = (__force char *) req->tc->pubuf;
else
pbuf = req->tc->pkbuf;
in = pack_sg_list(chan->sg, out+inp, VIRTQUEUE_NUM, in = pack_sg_list(chan->sg, out+inp, VIRTQUEUE_NUM,
pbuf, req->tc->pbuf_size); pbuf, req->tc->pbuf_size);
} }
......
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