From: Juan Perez-Sanchez <lithoxs@gmail.com>
To: linux-8086 <linux-8086@vger.kernel.org>
Subject: [PATCH 5 OF 5] Code size reduction.
Date: Mon, 16 Mar 2015 01:32:46 -0600 [thread overview]
Message-ID: <CAD6VGub0N_XnjckU1jaxkkGb-a1ASXBx5_JDs9Y0RUKHUJjeSg@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 237 bytes --]
Hi,
The technique suggested by A. Rubini in his book "Linux Device
Drivers, 3rd. Ed.", Chap. 02, section "Error Handling During
Initialization" was used in several functions in file fs/minix/namei.c
Code size was reduced by 144 bytes.
[-- Attachment #2: elks-3q.patch --]
[-- Type: text/x-patch, Size: 5407 bytes --]
diff -Nur elks.orig/fs/minix/namei.c elks/fs/minix/namei.c
--- elks.orig/fs/minix/namei.c 2015-03-08 13:03:06.893560923 -0600
+++ elks/fs/minix/namei.c 2015-03-08 12:52:19.873523734 -0600
@@ -248,27 +248,29 @@
int error;
*result = NULL;
+ error = -ENOENT;
if (!dir)
- return -ENOENT;
+ goto create2;
+ error = -ENOSPC;
inode = minix_new_inode(dir, (__u16)mode);
- if (!inode) {
- iput(dir);
- return -ENOSPC;
- }
+ if (!inode)
+ goto create1;
error = minix_add_entry(dir, name, len, &bh, &de);
- if (error) {
+ if(!error) {
+ de->inode = inode->i_ino;
+ mark_buffer_dirty(bh, 1);
+ brelse(bh);
+ *result = inode;
+ }
+ else {
inode->i_nlink--;
inode->i_dirt = 1;
iput(inode);
- iput(dir);
- return error;
}
- de->inode = inode->i_ino;
- *result = inode;
- mark_buffer_dirty(bh, 1);
- brelse(bh);
+ create1:
iput(dir);
- return 0;
+ create2:
+ return error;
}
int minix_mknod(register struct inode *dir, char *name, size_t len,
@@ -284,31 +286,30 @@
bh = minix_find_entry(dir, name, len, &de);
if (bh) {
brelse(bh);
- iput(dir);
- return -EEXIST;
+ error = -EEXIST;
+ goto mknod1;
}
+ error = -ENOSPC;
inode = minix_new_inode(dir, (__u16)mode);
- if (!inode) {
- iput(dir);
- return -ENOSPC;
- }
+ if (!inode)
+ goto mknod1;
if (S_ISBLK(mode) || S_ISCHR(mode))
inode->i_rdev = to_kdev_t(rdev);
error = minix_add_entry(dir, name, len, &bh, &de);
- if (error) {
+ if(!error) {
+ de->inode = inode->i_ino;
+ mark_buffer_dirty(bh, 1);
+ brelse(bh);
+ }
+ else {
inode->i_nlink--;
inode->i_dirt = 1;
- iput(inode);
- iput(dir);
- return error;
}
- de->inode = inode->i_ino;
- mark_buffer_dirty(bh, 1);
- brelse(bh);
iput(inode);
+ mknod1:
iput(dir);
return error;
}
@@ -321,35 +322,31 @@
struct buffer_head *bh;
struct minix_dir_entry *de;
- if (!dir || !dir->i_sb) {
- iput(dir);
- return -EINVAL;
- }
+ error = -EINVAL;
+ if (!dir || !dir->i_sb)
+ goto mkdir2;
+
+ error = -EEXIST;
bh = minix_find_entry(dir, name, len, &de);
if (bh) {
brelse(bh);
- iput(dir);
- return -EEXIST;
- }
- if (dir->i_nlink >= MINIX_LINK_MAX) {
- iput(dir);
- return -EMLINK;
+ goto mkdir2;
}
+ error = -EMLINK;
+ if (dir->i_nlink >= MINIX_LINK_MAX)
+ goto mkdir2;
+ error = -ENOSPC;
inode = minix_new_inode(dir, (__u16)(S_IFDIR|(mode & 0777 & ~current->fs.umask)));
- if (!inode) {
- iput(dir);
- return -ENOSPC;
- }
+ if (!inode)
+ goto mkdir2;
debug("m_mkdir: new_inode succeeded\n");
inode->i_size = 2 * dir->i_sb->u.minix_sb.s_dirsize;
debug("m_mkdir: starting minix_bread\n");
dir_block = minix_bread(inode, 0, 1);
if (!dir_block) {
inode->i_nlink--;
- iput(inode);
- iput(dir);
- return -ENOSPC;
+ goto mkdir1;
}
debug("m_mkdir: read succeeded\n");
map_buffer(dir_block);
@@ -368,9 +365,7 @@
error = minix_add_entry(dir, name, len, &bh, &de);
if (error) {
inode->i_nlink = 0;
- iput(inode);
- iput(dir);
- return error;
+ goto mkdir1;
}
map_buffer(bh);
de->inode = inode->i_ino;
@@ -378,9 +373,11 @@
dir->i_nlink++;
dir->i_dirt = 1;
unmap_brelse(bh);
- debug("m_mkdir: done!\n");
+ mkdir1:
iput(inode);
+ mkdir2:
iput(dir);
+ debug("m_mkdir: done!\n");
return 0;
}
@@ -572,17 +569,12 @@
register struct buffer_head *name_block;
int i;
- if (!(inode = minix_new_inode(dir, S_IFLNK | 0777))) {
- iput(dir);
- return -ENOSPC;
- }
+ i = -ENOSPC;
+ if (!(inode = minix_new_inode(dir, S_IFLNK | 0777)))
+ goto symlink3;
name_block = minix_bread(inode, 0, 1);
- if (!name_block) {
- inode->i_nlink--;
- iput(inode);
- iput(dir);
- return -ENOSPC;
- }
+ if (!name_block)
+ goto symlink1;
map_buffer(name_block);
if((i = strlen_fromfs(symname)) > 1023)
i = 1023;
@@ -601,18 +593,19 @@
i = minix_add_entry(dir, name, len, &bh, &de);
if (i) {
err_symlink:
- inode->i_nlink--;
inode->i_dirt = 1;
- iput(inode);
- iput(dir);
- return i;
+ symlink1:
+ inode->i_nlink--;
+ goto symlink2;
}
de->inode = inode->i_ino;
mark_buffer_dirty(bh, 1);
brelse(bh);
+ symlink2:
iput(inode);
+ symlink3:
iput(dir);
- return 0;
+ return i;
}
int minix_link(register struct inode *oldinode, register struct inode *dir,
@@ -622,14 +615,12 @@
struct minix_dir_entry *de;
struct buffer_head *bh;
- if (S_ISDIR(oldinode->i_mode)) {
- error = -EPERM;
+ error = -EPERM;
+ if (S_ISDIR(oldinode->i_mode))
goto mlink_err;
- }
- if (oldinode->i_nlink >= MINIX_LINK_MAX) {
- error = -EMLINK;
+ error = -EMLINK;
+ if (oldinode->i_nlink >= MINIX_LINK_MAX)
goto mlink_err;
- }
bh = minix_find_entry(dir, name, len, &de);
if (bh) {
brelse(bh);
@@ -637,19 +628,16 @@
goto mlink_err;
}
error = minix_add_entry(dir, name, len, &bh, &de);
- if (error) {
- mlink_err:
- iput(dir);
- iput(oldinode);
- return error;
- }
+ if (error)
+ goto mlink_err;
de->inode = oldinode->i_ino;
mark_buffer_dirty(bh, 1);
brelse(bh);
oldinode->i_nlink++;
oldinode->i_ctime = CURRENT_TIME;
oldinode->i_dirt = 1;
+ mlink_err:
iput(dir);
iput(oldinode);
- return 0;
+ return error;
}
next reply other threads:[~2015-03-16 7:32 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-03-16 7:32 Juan Perez-Sanchez [this message]
2015-03-17 0:30 ` [PATCH 5 OF 5] Code size reduction Jody Bruchon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAD6VGub0N_XnjckU1jaxkkGb-a1ASXBx5_JDs9Y0RUKHUJjeSg@mail.gmail.com \
--to=lithoxs@gmail.com \
--cc=linux-8086@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).