[PATCH 1/1] fs/cifs/dir.c: Error management clean-up

From: Fabian Frederick
Date: Wed Mar 26 2014 - 16:29:36 EST


-Don't kfree NULL values.
-Return immediately where possible.
-Normalize label names.

Signed-off-by: Fabian Frederick <fabf@xxxxxxxxx>
---
fs/cifs/dir.c | 57 +++++++++++++++++++++++++++++++--------------------------
1 file changed, 31 insertions(+), 26 deletions(-)

diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index 3db0c5f..7de6ee0 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -212,10 +212,8 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
*oplock = REQ_OPLOCK;

full_path = build_path_from_dentry(direntry);
- if (full_path == NULL) {
- rc = -ENOMEM;
- goto out;
- }
+ if (full_path == NULL)
+ return -ENOMEM;

if (tcon->unix_ext && cap_unix(tcon->ses) && !tcon->broken_posix_open &&
(CIFS_UNIX_POSIX_PATH_OPS_CAP &
@@ -269,7 +267,7 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
break;

default:
- goto out;
+ goto cifs_create_free_full_path;
}
/*
* fallthrough to retry, using older open call, this is case
@@ -302,13 +300,13 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,

if (!server->ops->open) {
rc = -ENOSYS;
- goto out;
+ goto cifs_create_free_full_path;
}

buf = kmalloc(sizeof(FILE_ALL_INFO), GFP_KERNEL);
if (buf == NULL) {
rc = -ENOMEM;
- goto out;
+ goto cifs_create_free_full_path;
}

/*
@@ -333,7 +331,7 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
rc = server->ops->open(xid, &oparms, oplock, buf);
if (rc) {
cifs_dbg(FYI, "cifs_create returned 0x%x\n", rc);
- goto out;
+ goto cifs_create_free_buf;
}

/*
@@ -401,13 +399,15 @@ cifs_create_set_dentry:
rc);
if (server->ops->close)
server->ops->close(xid, tcon, fid);
- goto out;
+ goto cifs_create_free_buf;
}
d_drop(direntry);
d_add(direntry, newinode);

-out:
+cifs_create_free_buf:
kfree(buf);
+
+cifs_create_free_full_path:
kfree(full_path);
return rc;
}
@@ -467,7 +467,7 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry,
tlink = cifs_sb_tlink(CIFS_SB(inode->i_sb));
if (IS_ERR(tlink)) {
rc = PTR_ERR(tlink);
- goto out_free_xid;
+ goto cifs_ao_free_xid;
}

tcon = tlink_tcon(tlink);
@@ -483,7 +483,7 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry,

if (rc) {
cifs_del_pending_open(&open);
- goto out;
+ goto cifs_ao_put_tlink;
}

if ((oflags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL))
@@ -494,7 +494,7 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry,
if (server->ops->close)
server->ops->close(xid, tcon, &fid);
cifs_del_pending_open(&open);
- goto out;
+ goto cifs_ao_put_tlink;
}

file_info = cifs_new_fileinfo(&fid, file, tlink, oplock);
@@ -506,9 +506,10 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry,
rc = -ENOMEM;
}

-out:
+cifs_ao_put_tlink:
cifs_put_tlink(tlink);
-out_free_xid:
+
+cifs_ao_free_xid:
free_xid(xid);
return rc;
}
@@ -538,7 +539,7 @@ int cifs_create(struct inode *inode, struct dentry *direntry, umode_t mode,
tlink = cifs_sb_tlink(CIFS_SB(inode->i_sb));
rc = PTR_ERR(tlink);
if (IS_ERR(tlink))
- goto out_free_xid;
+ goto cifs_create_free_xid;

tcon = tlink_tcon(tlink);
server = tcon->ses->server;
@@ -552,7 +553,8 @@ int cifs_create(struct inode *inode, struct dentry *direntry, umode_t mode,
server->ops->close(xid, tcon, &fid);

cifs_put_tlink(tlink);
-out_free_xid:
+
+cifs_create_free_xid:
free_xid(xid);
return rc;
}
@@ -591,7 +593,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
full_path = build_path_from_dentry(direntry);
if (full_path == NULL) {
rc = -ENOMEM;
- goto mknod_out;
+ goto cifs_mknod_free_xid;
}

if (tcon->unix_ext) {
@@ -614,18 +616,18 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
cifs_sb->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR);
if (rc)
- goto mknod_out;
+ goto cifs_mknod_free_full_path;

rc = cifs_get_inode_info_unix(&newinode, full_path,
inode->i_sb, xid);

if (rc == 0)
d_instantiate(direntry, newinode);
- goto mknod_out;
+ goto cifs_mknod_free_full_path;
}

if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_UNX_EMUL))
- goto mknod_out;
+ goto cifs_mknod_free_full_path;


cifs_dbg(FYI, "sfu compat create special file\n");
@@ -652,7 +654,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,

rc = CIFS_open(xid, &oparms, &oplock, buf);
if (rc)
- goto mknod_out;
+ goto cifs_mknod_free_full_path;

/*
* BB Do not bother to decode buf since no local inode yet to put
@@ -683,9 +685,11 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,

/* FIXME: add code here to set EAs */

-mknod_out:
+cifs_mknod_free_full_path:
kfree(full_path);
kfree(buf);
+
+cifs_mknod_free_xid:
free_xid(xid);
cifs_put_tlink(tlink);
return rc;
@@ -720,7 +724,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,

rc = check_name(direntry);
if (rc)
- goto lookup_out;
+ goto cifs_lookup_put_tlink;

/* can not grab the rename sem here since it would
deadlock in the cases (beginning of sys_rename itself)
@@ -728,7 +732,7 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
full_path = build_path_from_dentry(direntry);
if (full_path == NULL) {
rc = -ENOMEM;
- goto lookup_out;
+ goto cifs_lookup_put_tlink;
}

if (direntry->d_inode != NULL) {
@@ -765,8 +769,9 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry,
is a common return code */
}

-lookup_out:
kfree(full_path);
+
+cifs_lookup_put_tlink:
cifs_put_tlink(tlink);
free_xid(xid);
return ERR_PTR(rc);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/