super.c ( File view )

  • 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
   ȡ豸ϵij͸i  ڵṹϢø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顣
// ͷ豸ʹõijs_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

Want complete source code? Download it here

Point(s): 1

Download
0 lines left, continue to read
Sponsored links

File list

Tips: You can preview the content of files by clicking file names^_^
Name Size Date
linux0.00 B0% 04-10-07
<boot>0.00 B04-10-07 15:01
bootsect.s12.49 kB08-01-04 21:38
head.s13.22 kB08-01-04 21:38
setup.s12.42 kB08-01-04 21:38
<fs>0.00 B04-10-07 15:01
bitmap.c8.46 kB02-09-04 13:12
block_dev.c3.95 kB02-09-04 13:12
buffer.c17.71 kB02-09-04 13:12
char_dev.c4.09 kB02-09-04 13:12
exec.c18.90 kB02-09-04 13:12
fcntl.c3.33 kB02-09-04 13:12
file_dev.c4.82 kB02-09-04 13:12
file_table.c209.00 B02-09-04 13:12
inode.c14.92 kB02-09-04 13:12
ioctl.c1.94 kB02-09-04 13:12
Makefile6.80 kB08-01-04 21:45
namei.c37.20 kB02-09-04 13:12
open.c10.00 kB02-09-04 13:12
pipe.c5.42 kB02-09-04 13:12
read_write.c5.86 kB02-09-04 13:12
stat.c2.69 kB02-09-04 13:12
super.c13.57 kB02-09-04 13:12
truncate.c2.46 kB02-09-04 13:12
<include>0.00 B04-10-07 15:01
a.out.h8.22 kB02-09-04 13:14
<asm>0.00 B04-10-07 15:01
io.h772.00 B02-09-04 13:14
memory.h1.03 kB08-01-04 22:13
segment.h2.50 kB02-09-04 13:14
system.h4.08 kB02-09-04 13:14
const.h589.00 B02-09-04 13:14
ctype.h1.68 kB02-09-04 13:14
errno.h2.30 kB02-09-04 13:14
fcntl.h3.30 kB02-09-04 13:14
<linux>0.00 B04-10-07 15:01
config.h2.16 kB02-09-04 13:14
fs.h9.72 kB02-09-04 13:14
hdreg.h2.94 kB02-09-04 13:14
head.h760.00 B02-09-04 13:14
kernel.h1.44 kB02-09-04 13:14
mm.h473.00 B02-09-04 13:14
sched.h13.25 kB02-09-04 13:14
sys.h5.41 kB02-09-04 13:14
tty.h3.93 kB02-09-04 13:14
signal.h4.01 kB02-09-04 13:14
stdarg.h1.77 kB02-09-04 13:14
stddef.h378.00 B02-09-04 13:14
string.h21.75 kB02-09-04 13:14
<sys>0.00 B04-10-07 15:01
stat.h2.37 kB02-09-04 13:14
times.h377.00 B02-09-04 13:14
types.h1.10 kB02-09-04 13:14
utsname.h423.00 B02-09-04 13:14
wait.h1.48 kB02-09-04 13:14
termios.h13.58 kB02-09-04 13:14
time.h1.81 kB02-09-04 13:14
unistd.h9.21 kB02-09-04 13:14
utime.h392.00 B02-09-04 13:14
<init>0.00 B04-10-07 15:01
main.c12.52 kB02-09-04 13:12
<kernel>0.00 B04-10-07 15:01
asm.s5.10 kB08-01-04 22:48
<blk_drv>0.00 B04-10-07 15:01
blk.h5.69 kB02-09-04 13:14
floppy.c23.49 kB02-09-04 13:12
hd.c17.14 kB02-09-04 13:12
ll_rw_blk.c7.59 kB02-09-04 13:12
Makefile4.25 kB08-01-04 22:53
ramdisk.c6.13 kB02-09-04 13:12
<chr_drv>0.00 B04-10-07 15:01
console.c30.91 kB02-09-04 13:12
keyboard.S21.04 kB08-01-04 22:59
Makefile4.81 kB08-01-04 22:59
rs_io.s5.75 kB08-01-04 22:59
serial.c2.91 kB02-09-04 13:12
tty_io.c18.40 kB02-09-04 13:12
tty_ioctl.c10.70 kB02-09-04 13:12
exit.c8.08 kB02-09-04 13:12
fork.c6.78 kB15-07-07 22:10
<math>0.00 B04-10-07 15:01
Makefile3.21 kB08-01-04 23:01
math_emulate.c2.08 kB02-09-04 13:12
mktime.c2.72 kB02-09-04 13:12
panic.c952.00 B02-09-04 13:12
printk.c1.75 kB02-09-04 13:12
sched.c18.57 kB16-07-07 21:23
signal.c5.61 kB02-09-04 13:12
sys.c7.62 kB02-09-04 13:12
system_call.s12.53 kB08-01-04 22:48
traps.c8.29 kB04-10-07 14:57
vsprintf.c9.96 kB02-09-04 13:12
<lib>0.00 B04-10-07 15:01
close.c397.00 B02-09-04 13:12
ctype.c1.72 kB02-09-04 13:12
dup.c401.00 B02-09-04 13:12
errno.c66.00 B02-09-04 13:12
execve.c607.00 B02-09-04 13:12
Makefile4.83 kB08-01-04 22:30
malloc.c13.50 kB02-09-04 13:12
open.c1.22 kB02-09-04 13:12
setsid.c382.00 B02-09-04 13:12
string.c199.00 B02-09-04 13:12
wait.c774.00 B02-09-04 13:12
write.c545.00 B02-09-04 13:12
_exit.c616.00 B02-09-04 13:12
Makefile8.58 kB08-01-04 22:21
<mm>0.00 B04-10-07 15:01
Makefile2.91 kB08-01-04 22:34
memory.c25.10 kB02-09-04 13:12
page.s842.00 B08-01-04 22:34
<tools>0.00 B04-10-07 15:01
build.c8.12 kB02-09-04 13:12
...
Sponsored links

super.c (286.77 kB)

Need 1 point
Your Point(s)

Your Point isn't enough.

Get point immediately by PayPal

More(Debit card / Credit card / PayPal Credit / Online Banking)

Submit your source codes. Get more point

LOGIN

Don't have an account? Register now
Need any help?
Mail to: support@codeforge.com

切换到中文版?

CodeForge Chinese Version
CodeForge English Version

Where are you going?

^_^"Oops ...

Sorry!This guy is mysterious, its blog hasn't been opened, try another, please!
OK

Warm tip!

CodeForge to FavoriteFavorite by Ctrl+D