From: Juan Perez-Sanchez <lithoxs@gmail.com>
To: linux-8086 <linux-8086@vger.kernel.org>
Subject: [PATCH 1 OF 5] Preparation for named pipes
Date: Mon, 16 Mar 2015 01:07:00 -0600 [thread overview]
Message-ID: <CAD6VGuas9TEVXMTmMdz_iuNokxFOhfO6nUC9bJHrgsNipg0hdA@mail.gmail.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 828 bytes --]
In file fs/inode.c, function read_inode() dereferenced a pointer and
later checked that the pointer was not NULL. Now, it first makes the
check.
Remove a very small usage of members i_pipe and i_sock in inode
structures, as well as those members in preparation for the
implementation of named pipes and sockets.
In file fs/minix/namei.c, in many functions, release resources in the
inverse order as they were allocated.
In fs/pipe.c, pipe buffers are now allocated in the pipe_open
function, instead of inode creation function get_pipe_inode().
In init/main.c, after failing to find the init program, opened
/dev/tty0 as console and starts /bin/sh, but in ELKS, the console is
in /dev/tty1, not /dev/tty0. Also, fixed the order of search of the
init program.
Code size was reduced by 32 bytes and bss reduced by 192 bytes.
[-- Attachment #2: elks-3m.patch --]
[-- Type: text/x-patch, Size: 6355 bytes --]
diff -Nur elks.orig/fs/inode.c elks/fs/inode.c
--- elks.orig/fs/inode.c 2015-03-08 17:08:12.000000000 -0600
+++ elks/fs/inode.c 2015-03-11 17:04:40.000000000 -0600
@@ -175,10 +175,10 @@
static void read_inode(register struct inode *inode)
{
struct super_block *sb = inode->i_sb;
- register struct super_operations *sop = sb->s_op;
+ register struct super_operations *sop;
lock_inode(inode);
- if (sb && sop && sop->read_inode)
+ if (sb && (sop = sb->s_op) && sop->read_inode)
sop->read_inode(inode);
unlock_inode(inode);
}
@@ -325,7 +325,7 @@
return;
}
#ifdef NOT_YET
- if (inode->i_pipe)
+ if((inode->i_mode & S_IFMT) == S_IFIFO)
wake_up_interruptible(&PIPE_WAIT(*inode));
#endif
goto ini_loop;
@@ -339,7 +339,7 @@
}
wake_up(&inode_wait);
- if (inode->i_pipe && inode->u.pipe_i.base) {
+ if (((inode->i_mode & S_IFMT) == S_IFIFO) && inode->u.pipe_i.base) {
/* Free up any memory allocated to the pipe */
free_pipe_mem(inode->u.pipe_i.base);
inode->u.pipe_i.base = NULL;
@@ -437,16 +437,6 @@
inode->i_gid = (__u8) current->egid;
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
- if (!(PIPE_BASE(*inode) = get_pipe_mem())) {
- iput(inode);
- return NULL;
- }
- inode->i_pipe = 1;
- PIPE_START(*inode) = PIPE_LEN(*inode) = 0;
- PIPE_RD_OPENERS(*inode) = PIPE_WR_OPENERS(*inode) = 0;
- PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 0;
- PIPE_LOCK(*inode) = 0;
-
#if 0
inode->i_blksize = PAGE_SIZE;
#endif
diff -Nur elks.orig/fs/minix/namei.c elks/fs/minix/namei.c
--- elks.orig/fs/minix/namei.c 2015-03-08 17:08:12.000000000 -0600
+++ elks/fs/minix/namei.c 2015-03-11 17:04:40.000000000 -0600
@@ -264,10 +264,10 @@
return error;
}
de->inode = inode->i_ino;
+ *result = inode;
mark_buffer_dirty(bh, 1);
brelse(bh);
iput(dir);
- *result = inode;
return 0;
}
@@ -298,7 +298,6 @@
inode->i_rdev = to_kdev_t(rdev);
error = minix_add_entry(dir, name, len, &bh, &de);
-#if 1
if (error) {
inode->i_nlink--;
inode->i_dirt = 1;
@@ -309,22 +308,9 @@
de->inode = inode->i_ino;
mark_buffer_dirty(bh, 1);
brelse(bh);
- iput(dir);
iput(inode);
- return 0;
-#else /* MJN3: If the ordering of the iput()s isn't important, do this. */
- if (error) {
- inode->i_nlink--;
- inode->i_dirt = 1;
- } else {
- de->inode = inode->i_ino;
- mark_buffer_dirty(bh, 1);
- brelse(bh);
- }
iput(dir);
- iput(inode);
return error;
-#endif
}
int minix_mkdir(register struct inode *dir, char *name, size_t len, int mode)
@@ -360,9 +346,9 @@
debug("m_mkdir: starting minix_bread\n");
dir_block = minix_bread(inode, 0, 1);
if (!dir_block) {
- iput(dir);
inode->i_nlink--;
iput(inode);
+ iput(dir);
return -ENOSPC;
}
debug("m_mkdir: read succeeded\n");
@@ -381,9 +367,9 @@
debug("m_mkdir: dir_block update succeeded\n");
error = minix_add_entry(dir, name, len, &bh, &de);
if (error) {
- iput(dir);
inode->i_nlink = 0;
iput(inode);
+ iput(dir);
return error;
}
map_buffer(bh);
@@ -391,10 +377,10 @@
mark_buffer_dirty(bh, 1);
dir->i_nlink++;
dir->i_dirt = 1;
- iput(dir);
- iput(inode);
unmap_brelse(bh);
debug("m_mkdir: done!\n");
+ iput(inode);
+ iput(dir);
return 0;
}
@@ -592,9 +578,9 @@
}
name_block = minix_bread(inode, 0, 1);
if (!name_block) {
- iput(dir);
inode->i_nlink--;
iput(inode);
+ iput(dir);
return -ENOSPC;
}
map_buffer(name_block);
@@ -624,8 +610,8 @@
de->inode = inode->i_ino;
mark_buffer_dirty(bh, 1);
brelse(bh);
- iput(dir);
iput(inode);
+ iput(dir);
return 0;
}
@@ -660,10 +646,10 @@
de->inode = oldinode->i_ino;
mark_buffer_dirty(bh, 1);
brelse(bh);
- iput(dir);
oldinode->i_nlink++;
oldinode->i_ctime = CURRENT_TIME;
oldinode->i_dirt = 1;
+ iput(dir);
iput(oldinode);
return 0;
}
diff -Nur elks.orig/fs/pipe.c elks/fs/pipe.c
--- elks.orig/fs/pipe.c 2015-03-08 17:08:12.000000000 -0600
+++ elks/fs/pipe.c 2015-03-11 17:04:40.000000000 -0600
@@ -243,6 +243,17 @@
if (filp->f_mode & FMODE_WRITE)
(inode->u.pipe_i.writers)++;
+ if(!PIPE_BASE(*inode)) {
+ if(!(PIPE_BASE(*inode) = get_pipe_mem()))
+ return -ENOMEM;
+#if 0
+ /* next fields already set to zero by get_empty_inode() */
+ PIPE_START(*inode) = PIPE_LEN(*inode) = 0;
+ PIPE_RD_OPENERS(*inode) = PIPE_WR_OPENERS(*inode) = 0;
+ PIPE_READERS(*inode) = PIPE_WRITERS(*inode) = 0;
+ PIPE_LOCK(*inode) = 0;
+#endif
+ }
return 0;
}
diff -Nur elks.orig/include/linuxmt/fs.h elks/include/linuxmt/fs.h
--- elks.orig/include/linuxmt/fs.h 2015-03-08 17:08:12.000000000 -0600
+++ elks/include/linuxmt/fs.h 2015-03-11 17:04:40.000000000 -0600
@@ -234,11 +234,6 @@
unsigned char i_lock;
unsigned char i_dirt;
-#ifdef CONFIG_PIPE
- unsigned char i_pipe;
-#endif
-
- unsigned char i_sock;
short i_sem;
union {
diff -Nur elks.orig/init/main.c elks/init/main.c
--- elks.orig/init/main.c 2015-03-08 17:08:12.000000000 -0600
+++ elks/init/main.c 2015-03-11 17:06:59.000000000 -0600
@@ -103,14 +103,14 @@
* So, I've modified the ELKS kernel to follow this tradition.
*/
- run_init_process("/etc/init", args);
run_init_process("/sbin/init", args);
+ run_init_process("/etc/init", args);
run_init_process("/bin/init", args);
#ifdef CONFIG_CONSOLE_SERIAL
- num = sys_open("/dev/ttyS0", 2, 0);
+ num = sys_open("/dev/ttyS0", 2, 0);
#else
- num = sys_open("/dev/tty0", 2, 0);
+ num = sys_open("/dev/tty1", 2, 0);
#endif
if (num < 0)
printk("Unable to open /dev/tty (error %u)\n", -num);
diff -Nur elks.orig/net/socket.c elks/net/socket.c
--- elks.orig/net/socket.c 2015-03-08 17:08:12.000000000 -0600
+++ elks/net/socket.c 2015-03-11 17:04:40.000000000 -0600
@@ -105,7 +105,6 @@
inode->i_mode = S_IFSOCK;
inode->i_op = &sock_inode_operations;
inode->i_gid = (__u8) current->egid;
- inode->i_sock = 1;
sock = &inode->u.socket_i;
sock->state = SS_UNCONNECTED;
@@ -145,7 +144,7 @@
return NULL;
inode = file->f_inode;
- if (!inode || !inode->i_sock)
+ if (!inode || ((inode->i_mode & S_IFMT) != S_IFSOCK))
return NULL;
if (pfile)
reply other threads:[~2015-03-16 7:07 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
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=CAD6VGuas9TEVXMTmMdz_iuNokxFOhfO6nUC9bJHrgsNipg0hdA@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).