All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 5 OF 5] Code size reduction.
@ 2015-03-16  7:32 Juan Perez-Sanchez
  2015-03-17  0:30 ` Jody Bruchon
  0 siblings, 1 reply; 2+ messages in thread
From: Juan Perez-Sanchez @ 2015-03-16  7:32 UTC (permalink / raw)
  To: linux-8086

[-- 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;
 }

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH 5 OF 5] Code size reduction.
  2015-03-16  7:32 [PATCH 5 OF 5] Code size reduction Juan Perez-Sanchez
@ 2015-03-17  0:30 ` Jody Bruchon
  0 siblings, 0 replies; 2+ messages in thread
From: Jody Bruchon @ 2015-03-17  0:30 UTC (permalink / raw)
  To: linux-8086

On 3/16/2015 3:32 AM, Juan Perez-Sanchez wrote:
> 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.

All five of your patches are applied. Thanks for this! The fact that 
much generic pipe code has been removed from Minix filesystem code 
should make that code easier to understand as well.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-03-17  0:30 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-03-16  7:32 [PATCH 5 OF 5] Code size reduction Juan Perez-Sanchez
2015-03-17  0:30 ` Jody Bruchon

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.