fs/9p: Don't clunk dentry fid when we fail to get a writeback inode
Subsystems (2)
PATCH 1/2 fs/9p: Don't clunk dentry fid when we fail to get a writeback inode
The dentry fid get clunked via the dput.
Signed-off-by Aneesh Kumar K.V <[email protected]>
--- fs/9p/vfs_inode_dotl.c | 11 ++++++----- 1 files changed, 6 insertions(+), 5 deletions(-)
fs/9p/vfs_inode_dotl.c +6 -5
@@ -259,7 +259,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,if (IS_ERR (inode_fid)) { err =PTR_ERR (inode_fid);mutex_unlock (&v9inode->v_mutex); - goto error; + goto err_clunk_old_fid; } v9inode->writeback_fid = (void *) inode_fid; }
@@ -267,8 +267,8 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,/* 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)) { -p9_client_clunk (ofid); -return PTR_ERR (filp); + err =PTR_ERR (filp); + goto err_clunk_old_fid; } filp->private_data = ofid;#ifdef CONFIG_9P_FSCACHE
@@ -278,10 +278,11 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode,return 0 ; error: -if (ofid) -p9_client_clunk (ofid);if (fid)p9_client_clunk (fid); +err_clunk_old_fid: +if (ofid) +p9_client_clunk (ofid);return err; }
Signature · 1 line
1.7.4.1
PATCH 2/2 net/9p: p9_idpool_get return -1 on error
We need to return -1 on error. Also handle error properly
Signed-off-by Aneesh Kumar K.V <[email protected]>
--- net/9p/client.c | 20 ++++++++++++-------- net/9p/util.c | 2 +- 2 files changed, 13 insertions(+), 9 deletions(-)
net/9p/client.c +12 -8
@@ -307,12 +307,13 @@ static int p9_tag_init(struct p9_client *c) c->tagpool =p9_idpool_create ();if (IS_ERR (c->tagpool)) { err =PTR_ERR (c->tagpool); - c->tagpool =NULL ; goto error; } - -p9_idpool_get (c->tagpool);/* reserve tag 0 */ - + err =p9_idpool_get (c->tagpool);/* reserve tag 0 */ +if (err <0 ) { +p9_idpool_destroy (c->tagpool); + goto error; + } c->max_tag =0 ; error:return err;
@@ -789,11 +790,13 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)spin_lock_init (&clnt->lock);INIT_LIST_HEAD (&clnt->fidlist); -p9_tag_init (clnt); + err =p9_tag_init (clnt); +if (err <0 ) + goto free_client; err =parse_opts (options, clnt);if (err <0 ) - goto free_client; + goto destroy_tagpool;if (!clnt->trans_mod) clnt->trans_mod =v9fs_get_default_trans ();
@@ -802,13 +805,12 @@ struct p9_client *p9_client_create(const char *dev_name, char *options) err = -EPROTONOSUPPORT ;P9_DPRINTK (P9_DEBUG_ERROR ,"No transport defined or default transport\n" ); - goto free_client; + goto destroy_tagpool; } clnt->fidpool =p9_idpool_create ();if (IS_ERR (clnt->fidpool)) { err =PTR_ERR (clnt->fidpool); - clnt->fidpool =NULL ; goto put_trans; }
@@ -834,6 +836,8 @@ destroy_fidpool:p9_idpool_destroy (clnt->fidpool); put_trans:v9fs_put_trans (clnt->trans_mod); +destroy_tagpool: +p9_idpool_destroy (clnt->tagpool); free_client:kfree (clnt);return ERR_PTR (err);
net/9p/util.c +1 -1
@@ -93,7 +93,7 @@ int p9_idpool_get(struct p9_idpool *p) retry:if (idr_pre_get (&p->pool,GFP_NOFS ) ==0 ) -return 0 ; +return -1 ;spin_lock_irqsave (&p->lock, flags);
Signature · 1 line
1.7.4.1