fs/9p: Move writeback fid to v9fs_inode
Subsystems (2)
PATCH 1/1 fs/9p: Move writeback fid to v9fs_inode
Add v_mutex to synchronize writeback_fid initialization
Signed-off-by Aneesh Kumar K.V <[email protected]>
--- fs/9p/v9fs.h | 2 ++ fs/9p/vfs_addr.c | 14 +++++++++----- fs/9p/vfs_file.c | 15 +++++++++++---- fs/9p/vfs_inode.c | 25 +++++++++++++++++-------- fs/9p/vfs_inode_dotl.c | 20 +++++++++++++------- 5 files changed, 52 insertions(+), 24 deletions(-)
fs/9p/v9fs.h +2 -0
@@ -122,6 +122,8 @@ struct v9fs_inode {struct fscache_cookie *fscache;struct p9_qid *fscache_key;#endif +struct p9_fid *writeback_fid; +struct mutex v_mutex;struct inode vfs_inode; };
fs/9p/vfs_addr.c +9 -5
@@ -163,8 +163,10 @@ static int v9fs_vfs_writepage_locked(struct page *page)int retval, len;loff_t offset, size;mm_segment_t old_fs; +struct v9fs_inode *v9inode;struct inode *inode = page->mapping->host; + v9inode =V9FS_I (inode); size =i_size_read (inode);if (page->index == size >>PAGE_CACHE_SHIFT ) len = size & ~PAGE_CACHE_MASK ;
@@ -178,11 +180,11 @@ static int v9fs_vfs_writepage_locked(struct page *page) old_fs =get_fs ();set_fs (get_ds ()); -/* We should have i_private always set */ -BUG_ON (!inode->i_private); +/* We should have writeback_fid always set */ +BUG_ON (!v9inode->writeback_fid); retval =v9fs_file_write_internal (inode, - (struct p9_fid *)inode->i_private, + v9inode->writeback_fid, (__force const char __user *)buffer, len, &offset,0 );if (retval >0 )
@@ -274,23 +276,25 @@ static int v9fs_write_begin(struct file *filp, struct address_space *mapping, {int retval =0 ;struct page *page; +struct v9fs_inode *v9inode;pgoff_t index = pos >>PAGE_CACHE_SHIFT ;struct inode *inode = mapping->host; + v9inode =V9FS_I (inode); start: page =grab_cache_page_write_begin (mapping, index, flags);if (!page) { retval = -ENOMEM ; goto out; } -BUG_ON (!inode->i_private); +BUG_ON (!v9inode->writeback_fid);if (PageUptodate (page)) goto out;if (len ==PAGE_CACHE_SIZE ) goto out; - retval =v9fs_fid_readpage (inode->i_private, page); + retval =v9fs_fid_readpage (v9inode->writeback_fid, page);page_cache_release (page);if (!retval) goto start;
fs/9p/vfs_file.c +11 -4
@@ -56,11 +56,13 @@ static const struct vm_operations_struct v9fs_file_vm_ops;int v9fs_file_open (struct inode *inode,struct file *file) {int err; +struct v9fs_inode *v9inode;struct v9fs_session_info *v9ses;struct p9_fid *fid;int omode;P9_DPRINTK (P9_DEBUG_VFS ,"inode: %p file: %p\n" , inode, file); + v9inode =V9FS_I (inode); v9ses =v9fs_inode2v9ses (inode);if (v9fs_proto_dotl (v9ses)) omode = file->f_flags;
@@ -88,9 +90,10 @@ int v9fs_file_open(struct inode *inode, struct file *file) } file->private_data = fid; -if (v9ses->cache && !inode->i_private) { +mutex_lock (&v9inode->v_mutex); +if (v9ses->cache && !v9inode->writeback_fid) {/* -* clone a fid and add it to inode->i_private +* clone a fid and add it to writeback_fid * we do it during open time instead of * page dirty time via write_begin/page_mkwrite * because we want write after unlink usecase
@@ -99,10 +102,12 @@ int v9fs_file_open(struct inode *inode, struct file *file) fid =v9fs_writeback_fid (file->f_path.dentry);if (IS_ERR (fid)) { err =PTR_ERR (fid); +mutex_unlock (&v9inode->v_mutex); goto out_error; } - inode->i_private = (void *) fid; + v9inode->writeback_fid = (void *) fid; } +mutex_unlock (&v9inode->v_mutex);#ifdef CONFIG_9P_FSCACHE if (v9ses->cache)v9fs_cache_inode_set_cookie (inode, file);
@@ -550,6 +555,7 @@ v9fs_file_mmap(struct file *file, struct vm_area_struct *vma)static int v9fs_vm_page_mkwrite (struct vm_area_struct *vma,struct vm_fault *vmf) { +struct v9fs_inode *v9inode;struct page *page = vmf->page;struct file *filp = vma->vm_file;struct inode *inode = filp->f_path.dentry->d_inode;
@@ -558,9 +564,10 @@ v9fs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)P9_DPRINTK (P9_DEBUG_VFS ,"page %p fid %lx\n" , page, (unsigned long )filp->private_data); + v9inode =V9FS_I (inode);/* make sure the cache has finished storing the page */ v9fs_fscache_wait_on_page_write (inode, page); -BUG_ON (!inode->i_private); +BUG_ON (!v9inode->writeback_fid);lock_page (page);if (page->mapping != inode->i_mapping) goto out_unlock;
fs/9p/vfs_inode.c +17 -8
@@ -219,6 +219,8 @@ struct inode *v9fs_alloc_inode(struct super_block *sb) v9inode->fscache_key =NULL ;spin_lock_init (&v9inode->fscache_lock);#endif + v9inode->writeback_fid =NULL ; +mutex_init (&v9inode->v_mutex);return &v9inode->vfs_inode; }
@@ -413,6 +415,8 @@ error:*/ void v9fs_evict_inode (struct inode *inode) { +struct v9fs_inode *v9inode =V9FS_I (inode); +truncate_inode_pages (inode->i_mapping,0 );end_writeback (inode);filemap_fdatawrite (inode->i_mapping);
@@ -420,10 +424,10 @@ void v9fs_evict_inode(struct inode *inode)#ifdef CONFIG_9P_FSCACHE v9fs_cache_inode_put_cookie (inode);#endif -/* clunk the fid stashed in inode->i_private */ -if (inode->i_private) { -p9_client_clunk ((struct p9_fid *)inode->i_private); - inode->i_private =NULL ; +/* clunk the fid stashed in writeback_fid */ +if (v9inode->writeback_fid) { +p9_client_clunk (v9inode->writeback_fid); + v9inode->writeback_fid =NULL ; } }
@@ -606,9 +610,10 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,int err;u32 perm;int flags; +struct file *filp; +struct v9fs_inode *v9inode;struct v9fs_session_info *v9ses;struct p9_fid *fid, *inode_fid; -struct file *filp; err =0 ; fid =NULL ;
@@ -630,9 +635,11 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode,/* if we are opening a file, assign the open fid to the file */ if (nd && nd->flags &LOOKUP_OPEN ) { -if (v9ses->cache && !dentry->d_inode->i_private) { + v9inode =V9FS_I (dentry->d_inode); +mutex_lock (&v9inode->v_mutex); +if (v9ses->cache && !v9inode->writeback_fid) {/* -* clone a fid and add it to inode->i_private +* clone a fid and add it to writeback_fid * we do it during open time instead of * page dirty time via write_begin/page_mkwrite * because we want write after unlink usecase
@@ -641,10 +648,12 @@ v9fs_vfs_create(struct inode *dir, struct dentry *dentry, int mode, inode_fid =v9fs_writeback_fid (dentry);if (IS_ERR (inode_fid)) { err =PTR_ERR (inode_fid); +mutex_unlock (&v9inode->v_mutex); goto error; } - dentry->d_inode->i_private = (void *) inode_fid; + v9inode->writeback_fid = (void *) inode_fid; } +mutex_unlock (&v9inode->v_mutex); filp =lookup_instantiate_filp (nd, dentry, generic_file_open);if (IS_ERR (filp)) { err =PTR_ERR (filp);
fs/9p/vfs_inode_dotl.c +13 -7
@@ -159,16 +159,17 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode, struct nameidata *nd) {int err =0 ; -char *name =NULL ;gid_t gid;int flags;mode_t mode; -struct v9fs_session_info *v9ses; -struct p9_fid *fid =NULL ; -struct p9_fid *dfid, *ofid, *inode_fid; +char *name =NULL ;struct file *filp;struct p9_qid qid;struct inode *inode; +struct p9_fid *fid =NULL ; +struct v9fs_inode *v9inode; +struct p9_fid *dfid, *ofid, *inode_fid; +struct v9fs_session_info *v9ses;struct posix_acl *pacl =NULL , *dacl =NULL ; v9ses =v9fs_inode2v9ses (dir);
@@ -241,9 +242,12 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,/* Now set the ACL based on the default value */ v9fs_set_create_acl (dentry, dacl, pacl); -if (v9ses->cache && !inode->i_private) { + + v9inode =V9FS_I (inode); +mutex_lock (&v9inode->v_mutex); +if (v9ses->cache && !v9inode->writeback_fid) {/* -* clone a fid and add it to inode->i_private +* clone a fid and add it to writeback_fid * we do it during open time instead of * page dirty time via write_begin/page_mkwrite * because we want write after unlink usecase
@@ -252,10 +256,12 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode, inode_fid =v9fs_writeback_fid (dentry);if (IS_ERR (inode_fid)) { err =PTR_ERR (inode_fid); +mutex_unlock (&v9inode->v_mutex); goto error; } - inode->i_private = (void *) inode_fid; + v9inode->writeback_fid = (void *) inode_fid; } +mutex_unlock (&v9inode->v_mutex);/* Since we are opening a file, assign the open fid to the file */ filp =lookup_instantiate_filp (nd, dentry, generic_file_open);if (IS_ERR (filp)) {
Signature · 1 line
1.7.1