super.c ( File view )
Description:linux 0.11 kernel source code, with English Notes, so that learning good things linux kernel...
- By 2010-08-31
- View(s):24
- Download(s):2
- Point(s): 1
/* * linux/fs/super.c * * (C) 1991 Linus Torvalds */ /* * super.c contains code to handle the super-block tables. */ #include// ںͷļԺӲͣHD_TYPEѡ #include // ȳͷļṹtask_structʼ0 ݣ // һЩйúͻȡǶʽຯ䡣 #include // ںͷļһЩں˳úԭζ塣 #include // ϵͳͷļû/жŵȵǶʽꡣ #include // ͷļϵͳиֳš(Linus minix ) #include // ļ״̬ͷļļļϵͳ״̬ṹstat{ }ͳ int sync_dev (int dev); // ָ豸ִиٻ豸ݵͬ(fs/buffer.c,59) void wait_for_keypress (void); // ȴ(kernel/chr_drv/tty_io.c, 140) /* set_bit uses setb, as gas doesn't recognize setc */ /* set_bit()ʹsetb ָΪgas ʶָsetc */ //// ָλƫƴλֵ(0 1)ظñλֵ(ӦȡΪtest_bit()) mount_root i ڵṹ32 ֽڶļ64 гʼļϵͳ̵Ļʾ̣سʼ飨8 ȡ豸ϵiji ڵṹϢøi ڵôΪ4 Ϊ1 ĵǰĿ¼Ŀ¼i ڵ㡣λͼͳƿ̿ʾi ڵλͼͳƿi ڵʾ // Ƕʽꡣbitnr DZλƫֵaddr DzԱλʼַ // %0 - ax(__res)%1 - 0%2 - bitnr%3 - addr #define set_bit(bitnr,addr) ({ \ register int __res __asm__( "ax"); \ __asm__( "bt %2,%3;setb %%al": "=a" (__res): "a" (0), "r" (bitnr), "m" (*(addr))); \ __res; }) struct super_block super_block[NR_SUPER]; // ṹ飨8 /* this is initialized in init/main.c */ /* ROOT_DEV init/main.c бʼ */ int ROOT_DEV = 0; //// ָij顣 static void lock_super (struct super_block *sb) { cli (); // жϡ while (sb->s_lock) // óѾ˯ߵȴ sleep_on (&(sb->s_wait)); sb->s_lock = 1; // ó־ sti (); // жϡ } //// ָʹulock_super static void free_super (struct super_block *sb) { cli (); // жϡ sb->s_lock = 0; // λ־ wake_up (&(sb->s_wait)); // ѵȴóĽ̡ sti (); // жϡ } //// ˯ߵȴ static void wait_on_super (struct super_block *sb) { cli (); // жϡ while (sb->s_lock) // Ѿ˯ߵȴ sleep_on (&(sb->s_wait)); sti (); // жϡ } //// ȡָ豸ij顣ظóṹָ롣 struct super_block * get_super (int dev) { struct super_block *s; // ûָ豸ؿָ롣 if (!dev) return NULL; // s ָ鿪ʼ飬Ѱָ豸ij顣 s = 0 + super_block; while (s < NR_SUPER + super_block) // ǰָ豸ij飬ȵȴóѾĻ // ڵȴڼ䣬óпܱ豸ʹã˴ʱжһǷָ豸ij飬 // ظóָ롣¶Գһ飬s ָ // ʼ if (s->s_dev == dev) { wait_on_super (s); if (s->s_dev == dev) return s; s = 0 + super_block; // ǰǣһûҵָij飬ؿָ롣 } else s++; return NULL; } //// ͷָ豸ij顣 // ͷ豸ʹõijs_dev=0ͷŸ豸i ڵλͼλͼռ // ĸٻ顣ӦļϵͳǸļϵͳi ڵѾװļ // ϵͳͷŸó顣 void put_super (int dev) { struct super_block *sb; struct m_inode *inode; int i; // ָ豸Ǹļϵͳ豸ʾϢϵͳ̸ıˣսɡء if (dev == ROOT_DEV) { printk ("root diskette changed: prepare for armageddon\n\r"); return; } // Ҳָ豸ij飬ء if (!(sb = get_super (dev))) return; // óָļϵͳi ڵϰװļϵͳʾϢء if (sb->s_imount) { printk ("Mounted disk changed - tssk, tssk\n\r"); return; } // ҵָ豸ijó飬ȻøóӦ豸ֶΪ0Ҳ // ó顣 lock_super (sb); sb->s_dev = 0; // ȻͷŸ豸i ڵλͼλͼڻռõĻ顣 for (i = 0; i < I_MAP_SLOTS; i++) brelse (sb->s_imap[i]); for (i = 0; i < Z_MAP_SLOTS; i++) brelse (sb->s_zmap[i]); // Ըóء free_super (sb); return; } //// 豸϶ȡ鵽С // 豸ijѾڸٻвЧֱӷظóָ롣 static struct super_block * read_super (int dev) { struct super_block *s; struct buffer_head *bh; int i, block; // ûָ豸ؿָ롣 if (!dev) return NULL; // ȼ豸ǷɸƬҲǷ豸̣ٻйظ // 豸лʧЧҪʧЧͷԭصļϵͳ check_disk_change (dev); // 豸ijѾڸٻУֱӷظóָ롣 if (s = get_super (dev)) return s; // ڳҳһ(Ҳs_dev=0 )Ѿռؿָ롣 for (s = 0 + super_block;; s++) { if (s >= NR_SUPER + super_block) return NULL; if (!s->s_dev) break; } // ҵͽóָ豸Ըóڴвֳʼ s->s_dev = dev; s->s_isup = NULL; s->s_imount = NULL; s->s_time = 0; s->s_rd_only = 0; s->s_dirt = 0; // Ȼó飬豸϶ȡϢbh ָĻСʧܣ // ͷѡijеؿָ˳ lock_super (s); if (!(bh = bread (dev, 1))) { s->s_dev = 0; free_super (s); return NULL; } // 豸϶ȡijϢƵӦṹСͷŴŶȡϢĸٻ顣 *((struct d_super_block *) s) = *((struct d_super_block *) bh->b_data); brelse (bh); // ȡijļϵͳħֶݲԣ˵豸ϲȷļϵͳͬ // һͷѡijеؿָ˳ // ڸðlinux ںˣֻ֧minix ļϵͳ汾1.0ħ0x137f if (s->s_magic != SUPER_MAGIC) { s->s_dev = 0; free_super (s); return NULL; } // 濪ʼȡ豸i ڵλͼλͼݡȳʼڴ泬ṹλͼռ䡣 for (i = 0; i < I_MAP_SLOTS; i++) s->s_imap[i] = NULL; for (i = 0; i < Z_MAP_SLOTS; i++) s->s_zmap[i] = NULL; // Ȼ豸϶ȡi ڵλͼλͼϢڳӦֶС block = 2; for (i = 0; i < s->s_imap_blocks; i++) if (s->s_imap[i] = bread (dev, block)) block++; else break; for (i = 0; i < s->s_zmap_blocks; i++) if (s->s_zmap[i] = bread (dev, block)) block++; else break; // λͼλͼӦռе˵ļϵͳλͼϢ⣬ // ʼʧܡֻͷǰԴؿָ벢˳ if (block != 2 + s->s_imap_blocks + s->s_zmap_blocks) { // ͷi ڵλͼλͼռõĸٻ for (i = 0; i < I_MAP_SLOTS; i++) brelse (s->s_imap[i]); for (i = 0; i < Z_MAP_SLOTS; i++) brelse (s->s_zmap[i]); //ͷѡijеóؿָ˳ s->s_dev = 0; free_super (s); return NULL; } // һгɹi ڵĺ豸еi ڵѾȫʹã // ᷵0 ֵ0 i ڵDzõģォλͼеλΪ1Էֹļ // ϵͳ0 i ڵ㡣ͬĵҲλͼλΪ1 s->s_imap[0]->b_data[0] |= 1; s->s_zmap[0]->b_data[0] |= 1; // ó飬سָ롣 free_super (s); return s; } //// жļϵͳϵͳú // dev_name 豸ļ int sys_umount (char *dev_name) { struct m_inode *inode; struct super_block *sb; int dev; // ȸ豸ļҵӦi ڵ㣬ȡе豸š if (!(inode = namei (dev_name))) return -ENOENT; dev = inode->i_zone[0]; // ǿ豸ļͷŸi ڵdev_iس롣 if (!S_ISBLK (inode->i_mode)) { iput (inode); return -ENOTBLK; } // ͷ豸ļi ڵ㡣 iput (inode); // 豸Ǹļϵͳܱжأسš if (dev == ROOT_DEV) return -EBUSY; // ȡ豸ijʧܣ߸豸ļϵͳûаװس롣 if (!(sb = get_super (dev)) || !(sb->s_imount)) return -ENOENT; // ָıװi ڵûλ䰲װ־ʾϢ if (!sb->s_imount->i_mount) printk ("Mounted inode has i_mount=0\n"); // i ڵǷнʹø豸ϵļæ롣 for (inode = inode_table + 0; inode < inode_table + NR_INODE; inode++) if (inode->i_dev == dev && inode->i_count) return -EBUSY; // λװi ڵİװ־ͷŸi ڵ㡣 sb->s_imount->i_mount = 0; iput (sb->s_imount); // óбװi ڵֶΪգͷ豸ļϵͳĸi ڵ㣬óбװϵͳ // i ڵָΪա sb->s_imount = NULL; iput (sb->s_isup); sb->s_isup = NULL; // ͷŸ豸ijԼλͼռõĻ飬Ը豸ִиٻ豸ݵͬ put_super (dev); sync_dev (dev); return 0; } //// װļϵͳú // dev_name 豸ļdir_name ǰװĿ¼rw_flag װļĶд־ // صĵطһĿ¼ҶӦi ڵûбռá int sys_mount (char *dev_name, char *dir_name, int rw_flag) { struct m_inode *dev_i, *dir_i; struct super_block *sb; int dev; // ȸ豸ļҵӦi ڵ㣬ȡе豸š // ڿ豸ļ豸i ڵi_zone[0]С if (!(dev_i = namei (dev_name))) return -ENOENT; dev = dev_i->i_zone[0]; // ǿ豸ļͷŸȡõi ڵdev_iس롣 if (!S_ISBLK (dev_i->i_mode)) { iput (dev_i); return -EPERM; } // ͷŸ豸ļi ڵdev_i iput (dev_i); // ݸĿ¼ļҵӦi ڵdir_i if (!(dir_i = namei (dir_name))) return -ENOENT; // i ڵü ... ... (Not finished, please download and read the complete file)
...
Expand> <Close
Sponsored links
File list
Tips: You can preview the content of files by clicking file names^_^Name | Size | Date |
---|---|---|
linux | 0.00 B | 0% 04-10-07 |
<boot> | 0.00 B | 04-10-07 15:01 |
bootsect.s | 12.49 kB | 08-01-04 21:38 |
head.s | 13.22 kB | 08-01-04 21:38 |
setup.s | 12.42 kB | 08-01-04 21:38 |
<fs> | 0.00 B | 04-10-07 15:01 |
bitmap.c | 8.46 kB | 02-09-04 13:12 |
block_dev.c | 3.95 kB | 02-09-04 13:12 |
buffer.c | 17.71 kB | 02-09-04 13:12 |
char_dev.c | 4.09 kB | 02-09-04 13:12 |
exec.c | 18.90 kB | 02-09-04 13:12 |
fcntl.c | 3.33 kB | 02-09-04 13:12 |
file_dev.c | 4.82 kB | 02-09-04 13:12 |
file_table.c | 209.00 B | 02-09-04 13:12 |
inode.c | 14.92 kB | 02-09-04 13:12 |
ioctl.c | 1.94 kB | 02-09-04 13:12 |
Makefile | 6.80 kB | 08-01-04 21:45 |
namei.c | 37.20 kB | 02-09-04 13:12 |
open.c | 10.00 kB | 02-09-04 13:12 |
pipe.c | 5.42 kB | 02-09-04 13:12 |
read_write.c | 5.86 kB | 02-09-04 13:12 |
stat.c | 2.69 kB | 02-09-04 13:12 |
super.c | 13.57 kB | 02-09-04 13:12 |
truncate.c | 2.46 kB | 02-09-04 13:12 |
<include> | 0.00 B | 04-10-07 15:01 |
a.out.h | 8.22 kB | 02-09-04 13:14 |
<asm> | 0.00 B | 04-10-07 15:01 |
io.h | 772.00 B | 02-09-04 13:14 |
memory.h | 1.03 kB | 08-01-04 22:13 |
segment.h | 2.50 kB | 02-09-04 13:14 |
system.h | 4.08 kB | 02-09-04 13:14 |
const.h | 589.00 B | 02-09-04 13:14 |
ctype.h | 1.68 kB | 02-09-04 13:14 |
errno.h | 2.30 kB | 02-09-04 13:14 |
fcntl.h | 3.30 kB | 02-09-04 13:14 |
<linux> | 0.00 B | 04-10-07 15:01 |
config.h | 2.16 kB | 02-09-04 13:14 |
fs.h | 9.72 kB | 02-09-04 13:14 |
hdreg.h | 2.94 kB | 02-09-04 13:14 |
head.h | 760.00 B | 02-09-04 13:14 |
kernel.h | 1.44 kB | 02-09-04 13:14 |
mm.h | 473.00 B | 02-09-04 13:14 |
sched.h | 13.25 kB | 02-09-04 13:14 |
sys.h | 5.41 kB | 02-09-04 13:14 |
tty.h | 3.93 kB | 02-09-04 13:14 |
signal.h | 4.01 kB | 02-09-04 13:14 |
stdarg.h | 1.77 kB | 02-09-04 13:14 |
stddef.h | 378.00 B | 02-09-04 13:14 |
string.h | 21.75 kB | 02-09-04 13:14 |
<sys> | 0.00 B | 04-10-07 15:01 |
stat.h | 2.37 kB | 02-09-04 13:14 |
times.h | 377.00 B | 02-09-04 13:14 |
types.h | 1.10 kB | 02-09-04 13:14 |
utsname.h | 423.00 B | 02-09-04 13:14 |
wait.h | 1.48 kB | 02-09-04 13:14 |
termios.h | 13.58 kB | 02-09-04 13:14 |
time.h | 1.81 kB | 02-09-04 13:14 |
unistd.h | 9.21 kB | 02-09-04 13:14 |
utime.h | 392.00 B | 02-09-04 13:14 |
<init> | 0.00 B | 04-10-07 15:01 |
main.c | 12.52 kB | 02-09-04 13:12 |
<kernel> | 0.00 B | 04-10-07 15:01 |
asm.s | 5.10 kB | 08-01-04 22:48 |
<blk_drv> | 0.00 B | 04-10-07 15:01 |
blk.h | 5.69 kB | 02-09-04 13:14 |
floppy.c | 23.49 kB | 02-09-04 13:12 |
hd.c | 17.14 kB | 02-09-04 13:12 |
ll_rw_blk.c | 7.59 kB | 02-09-04 13:12 |
Makefile | 4.25 kB | 08-01-04 22:53 |
ramdisk.c | 6.13 kB | 02-09-04 13:12 |
<chr_drv> | 0.00 B | 04-10-07 15:01 |
console.c | 30.91 kB | 02-09-04 13:12 |
keyboard.S | 21.04 kB | 08-01-04 22:59 |
Makefile | 4.81 kB | 08-01-04 22:59 |
rs_io.s | 5.75 kB | 08-01-04 22:59 |
serial.c | 2.91 kB | 02-09-04 13:12 |
tty_io.c | 18.40 kB | 02-09-04 13:12 |
tty_ioctl.c | 10.70 kB | 02-09-04 13:12 |
exit.c | 8.08 kB | 02-09-04 13:12 |
fork.c | 6.78 kB | 15-07-07 22:10 |
<math> | 0.00 B | 04-10-07 15:01 |
Makefile | 3.21 kB | 08-01-04 23:01 |
math_emulate.c | 2.08 kB | 02-09-04 13:12 |
mktime.c | 2.72 kB | 02-09-04 13:12 |
panic.c | 952.00 B | 02-09-04 13:12 |
printk.c | 1.75 kB | 02-09-04 13:12 |
sched.c | 18.57 kB | 16-07-07 21:23 |
signal.c | 5.61 kB | 02-09-04 13:12 |
sys.c | 7.62 kB | 02-09-04 13:12 |
system_call.s | 12.53 kB | 08-01-04 22:48 |
traps.c | 8.29 kB | 04-10-07 14:57 |
vsprintf.c | 9.96 kB | 02-09-04 13:12 |
<lib> | 0.00 B | 04-10-07 15:01 |
close.c | 397.00 B | 02-09-04 13:12 |
ctype.c | 1.72 kB | 02-09-04 13:12 |
dup.c | 401.00 B | 02-09-04 13:12 |
errno.c | 66.00 B | 02-09-04 13:12 |
execve.c | 607.00 B | 02-09-04 13:12 |
Makefile | 4.83 kB | 08-01-04 22:30 |
malloc.c | 13.50 kB | 02-09-04 13:12 |
open.c | 1.22 kB | 02-09-04 13:12 |
setsid.c | 382.00 B | 02-09-04 13:12 |
string.c | 199.00 B | 02-09-04 13:12 |
wait.c | 774.00 B | 02-09-04 13:12 |
write.c | 545.00 B | 02-09-04 13:12 |
_exit.c | 616.00 B | 02-09-04 13:12 |
Makefile | 8.58 kB | 08-01-04 22:21 |
<mm> | 0.00 B | 04-10-07 15:01 |
Makefile | 2.91 kB | 08-01-04 22:34 |
memory.c | 25.10 kB | 02-09-04 13:12 |
page.s | 842.00 B | 08-01-04 22:34 |
<tools> | 0.00 B | 04-10-07 15:01 |
build.c | 8.12 kB | 02-09-04 13:12 |
Sponsored links