亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? super.c

?? Sanos Operating System Kernel ----------------------------- Sanos is an OS kernel for use in PC base
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// super.c
//
// Disk filesystem superblock routines
//
// Copyright (C) 2002 Michael Ringgaard. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 
// 1. Redistributions of source code must retain the above copyright 
//    notice, this list of conditions and the following disclaimer.  
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.  
// 3. Neither the name of the project nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission. 
// 
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
// SUCH DAMAGE.
// 

#include <os/krnl.h>

#define SECTORSIZE   512

#define DEFAULT_BLOCKSIZE       4096
#define DEFAULT_INODE_RATIO     4096
#define DEFAULT_CACHE_BUFFERS   1024
#define DEFAULT_RESERVED_BLOCKS 16
#define DEFAULT_RESERVED_INODES 16

#define FORMAT_BLOCKSIZE        (64 * K)

static void mark_group_desc_dirty(struct filsys *fs, int group)
{
  mark_buffer_updated(fs->cache, fs->groupdesc_buffers[group / fs->groupdescs_per_block]);
}

static int log2(int n)
{
  int l = 0;
  n >>= 1;
  while (n) 
  {
    l++;
    n >>= 1;
  }

  return l;
}

static void dfs_sync(void *arg)
{
  struct filsys *fs = (struct filsys *) arg;

  // Write super block
  if (fs->super_dirty) 
  {
    dev_write(fs->devno, fs->super, SECTORSIZE, 1);
    fs->super_dirty = 0;
  }
}

static int parse_options(char *opts, struct fsoptions *fsopts)
{
  fsopts->cache = get_num_option(opts, "cache", 0);
  fsopts->blocksize = get_num_option(opts, "blocksize", DEFAULT_BLOCKSIZE);
  fsopts->inode_ratio = get_num_option(opts, "inoderatio", DEFAULT_INODE_RATIO);
  fsopts->quick = get_option(opts, "quick", NULL, 0, NULL) != NULL;
  fsopts->reserved_blocks = get_num_option(opts, "resvblks", DEFAULT_RESERVED_BLOCKS);
  fsopts->reserved_inodes = get_num_option(opts, "resvinodes", DEFAULT_RESERVED_INODES);

  return 0;
}

static struct filsys *create_filesystem(char *devname, struct fsoptions *fsopts)
{
  struct filsys *fs;
  devno_t devno;
  unsigned int sectcount;
  unsigned int blocks;
  unsigned int first_block;
  struct groupdesc *gd;
  struct buf *buf;
  unsigned int i, j;
  ino_t ino;
  struct inode *root;
  char *buffer;

  // Check device
  devno = dev_open(devname);
  if (devno == NODEV) return NULL;
  if (device(devno)->driver->type != DEV_TYPE_BLOCK) return NULL;
  sectcount = dev_ioctl(devno, IOCTL_GETDEVSIZE, NULL, 0);
  if (sectcount < 0) return NULL;

  // Allocate file system
  fs = (struct filsys *) kmalloc(sizeof(struct filsys));
  memset(fs, 0, sizeof(struct filsys));

  // Allocate super block
  fs->super = (struct superblock *) kmalloc(SECTORSIZE);
  memset(fs->super, 0, SECTORSIZE);
  fs->super_dirty = 1;

  // Set device number and block size
  fs->devno = devno;
  fs->blocksize = fsopts->blocksize;

  // Set signature, version and block size in super block
  fs->super->signature = DFS_SIGNATURE;
  fs->super->version = DFS_VERSION;
  fs->super->log_block_size = log2(fsopts->blocksize);

  // Each group has as many blocks as can be represented by the block bitmap block
  fs->super->blocks_per_group = fs->blocksize * 8;

  // Get the device size in sectors from the device and convert it to blocks
  fs->super->block_count =  sectcount / (fs->blocksize / SECTORSIZE);

  // Set cache size
  if (fsopts->cache == 0)
    fs->super->cache_buffers = DEFAULT_CACHE_BUFFERS;
  else
    fs->super->cache_buffers = fsopts->cache;
  if (fs->super->cache_buffers > fs->super->block_count) fs->super->cache_buffers = fs->super->block_count;

  // The number of inodes in a group is computed as a ratio of the size of the group.
  // If the device has only one group the inode count is based on size of device.
  // The number of inodes per block is then rounded up to fit a whole number of blocks.
  fs->inodes_per_block = fs->blocksize / sizeof(struct inodedesc);
  if (fs->super->blocks_per_group < fs->super->block_count)
    fs->super->inodes_per_group = fs->blocksize * fs->super->blocks_per_group / fsopts->inode_ratio;
  else
    fs->super->inodes_per_group = fs->blocksize * fs->super->block_count / fsopts->inode_ratio;
  if (fs->super->inodes_per_group > fs->blocksize * 8) fs->super->inodes_per_group = fs->blocksize * 8;
  fs->super->inodes_per_group = (fs->super->inodes_per_group + fs->inodes_per_block - 1) / fs->inodes_per_block * fs->inodes_per_block;
  fs->inode_blocks_per_group = (fs->super->inodes_per_group * sizeof(struct inodedesc) + fs->blocksize - 1) / fs->blocksize;

  // Calculate the number of block pointers per block directory page
  fs->log_blkptrs_per_block = fs->super->log_block_size - 2;

  // Calculate the number of group descriptors and the number of blocks to store them
  fs->super->group_count = (fs->super->block_count + fs->super->blocks_per_group - 1) / fs->super->blocks_per_group;
  fs->groupdescs_per_block = fs->blocksize / sizeof(struct groupdesc);
  fs->groupdesc_blocks = (fs->super->group_count * sizeof(struct groupdesc) + fs->blocksize - 1) / fs->blocksize;

  // The reserved blocks are allocated right after the super block
  fs->super->first_reserved_block = 1;
  if (fs->blocksize <= SECTORSIZE) fs->super->first_reserved_block++;
  fs->super->reserved_blocks = fsopts->reserved_blocks;
  
  // The group descriptor table starts after the superblock and reserved blocks
  fs->super->groupdesc_table_block = fs->super->first_reserved_block + fs->super->reserved_blocks;

  // If the last group is too small to hold the bitmaps and inode table skip it
  blocks =  fs->super->block_count % fs->super->blocks_per_group;
  if (blocks > 0 && blocks < fs->inode_blocks_per_group + 2) fs->super->group_count--;
  if (fs->super->group_count == 0) 
  {
    kprintf("dfs: filesystem too small\n");
    return NULL;
  }

  // Initialize buffer cache
  fs->cache = init_buffer_pool(devno, fs->super->cache_buffers, fs->blocksize, dfs_sync, fs);
  if (!fs->cache) return NULL;
  fs->cache->nosync = 1;

  // Zero all blocks on disk
  if (!fsopts->quick)
  {
    int percent;
    int prev_percent;
    int blocks_per_io;

    blocks_per_io = FORMAT_BLOCKSIZE / fs->blocksize;
    buffer = (char *) kmalloc(FORMAT_BLOCKSIZE);
    memset(buffer, 0, FORMAT_BLOCKSIZE);

    prev_percent = -1;
    for (i = fs->super->groupdesc_table_block + fs->groupdesc_blocks; i < fs->super->block_count; i += blocks_per_io)
    {
      int rc;

      percent = (i / 100) * 100 / (fs->super->block_count / 100);
      if (percent != prev_percent) kprintf("%d%% complete\r", percent);
      prev_percent = percent;
      
      if (i + blocks_per_io > fs->super->block_count)
        rc = dev_write(fs->devno, buffer, (fs->super->block_count - i) * fs->blocksize, i);
      else
        rc = dev_write(fs->devno, buffer, FORMAT_BLOCKSIZE, i);

      if (rc < 0)
      {
	kprintf("dfs: error %d in format\n", rc);
	return NULL;
      }
    }
    kprintf("100%% complete\r");

    kfree(buffer);
  }

  // Allocate group descriptors
  fs->groupdesc_buffers = (struct buf **) kmalloc(sizeof(struct buf *) * fs->groupdesc_blocks);
  fs->groups = (struct group *) kmalloc(sizeof(struct group) * fs->super->group_count);

  for (i = 0; i < fs->groupdesc_blocks; i++)
  {
    fs->groupdesc_buffers[i] = alloc_buffer(fs->cache, fs->super->groupdesc_table_block + i);
    if (!fs->groupdesc_buffers[i]) return NULL;
  }

  for (i = 0; i < fs->super->group_count; i++)
  {
    gd = (struct groupdesc *) fs->groupdesc_buffers[i / fs->groupdescs_per_block]->data;
    gd += (i % fs->groupdescs_per_block);

    fs->groups[i].desc = gd;
    fs->groups[i].first_free_block = 0;
    fs->groups[i].first_free_inode = 0;
  }

  // Reserve inode for root directory
  fs->super->reserved_inodes = fsopts->reserved_inodes;

  // Set inode count based on group count
  fs->super->inode_count = fs->super->inodes_per_group * fs->super->group_count;

  // All blocks and inodes initially free
  fs->super->free_inode_count = fs->super->inode_count;
  fs->super->free_block_count = fs->super->block_count;

  // Initialize block bitmaps

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩高清不卡一区二区三区| 亚洲人成网站影音先锋播放| xfplay精品久久| 7799精品视频| 欧美三级三级三级| 欧美日韩在线播放三区| 欧美日韩亚洲另类| 69堂成人精品免费视频| 91精品国产综合久久蜜臀| 日韩精品最新网址| 日韩一区二区在线观看视频播放| 欧美狂野另类xxxxoooo| 欧美日韩国产高清一区| 日韩欧美你懂的| 久久久久久免费| 一区在线播放视频| 亚洲午夜在线视频| 久久精品国产亚洲5555| 国产剧情一区二区| 91丨porny丨首页| 欧美日韩国产在线观看| 日韩国产欧美视频| 久久国产精品区| 国产成人午夜片在线观看高清观看| 丁香另类激情小说| 国产欧美日韩综合| 亚洲视频一区在线| 五月激情综合网| 国产91精品露脸国语对白| 一本色道久久综合亚洲91| 欧美精品在线观看播放| 久久在线观看免费| 亚洲综合色在线| 国产专区欧美精品| 色欧美乱欧美15图片| 日韩一区二区三区三四区视频在线观看| 久久亚洲精精品中文字幕早川悠里 | 欧美日韩国产高清一区二区| 欧美一区2区视频在线观看| 欧美一区二区三区婷婷月色| 国产偷国产偷精品高清尤物| 亚洲精品一二三区| 精品一区二区三区的国产在线播放| 国产91精品一区二区麻豆亚洲| 欧美日韩一区二区三区不卡| 亚洲欧洲综合另类| 青青草国产精品亚洲专区无| 99视频一区二区| 精品三级在线观看| 亚洲一卡二卡三卡四卡五卡| 国产大陆精品国产| 欧美一区二区高清| 一区二区三区91| 成人av电影在线网| 26uuuu精品一区二区| 日韩av中文字幕一区二区| 91视频精品在这里| 国产精品久久久久久久久果冻传媒 | 亚洲国产精品影院| 久久99精品一区二区三区| 91麻豆国产福利在线观看| 久久久激情视频| 另类人妖一区二区av| 在线精品视频免费观看| 中文字幕中文乱码欧美一区二区| 精品一区二区免费看| 日韩一区二区三区免费观看| 亚洲国产精品视频| 色94色欧美sute亚洲线路一久| 中文一区在线播放| 成人午夜激情在线| 国产精品毛片久久久久久| 国产老肥熟一区二区三区| 久久网站热最新地址| 精东粉嫩av免费一区二区三区| 麻豆国产91在线播放| 92精品国产成人观看免费| 国产精品久久久久久久第一福利 | 91超碰这里只有精品国产| 亚洲欧美区自拍先锋| 91美女片黄在线| 国产精品成人午夜| 色综合久久66| 亚洲v中文字幕| 在线播放视频一区| 日产精品久久久久久久性色| 91精品啪在线观看国产60岁| 免费高清不卡av| 26uuu国产日韩综合| 成人免费看片app下载| 综合av第一页| 欧美艳星brazzers| 久久精品国产亚洲高清剧情介绍| 欧美成人女星排名| 成人听书哪个软件好| 亚洲欧美aⅴ...| 3d成人h动漫网站入口| 韩国欧美国产1区| 国产精品理论片在线观看| 在线亚洲+欧美+日本专区| 日韩在线一区二区| 国产日产欧产精品推荐色| 91在线一区二区| 秋霞午夜av一区二区三区| 久久久久国产精品麻豆ai换脸| youjizz国产精品| 亚洲一区二区三区不卡国产欧美| 51精品视频一区二区三区| 国产精品资源网站| 一区二区不卡在线播放 | 欧美体内she精视频| 日韩1区2区3区| 欧美国产乱子伦| 亚洲国产精品综合小说图片区| 69av一区二区三区| 国产一区二区三区黄视频| 中文字幕二三区不卡| 欧美无人高清视频在线观看| 国产一区福利在线| 亚洲午夜精品一区二区三区他趣| 337p粉嫩大胆色噜噜噜噜亚洲| 91麻豆福利精品推荐| 精品无人码麻豆乱码1区2区| 亚洲影视在线观看| 久久婷婷综合激情| 91麻豆精品国产91久久久使用方法 | 日本中文字幕一区二区视频| 国产精品久久久久久户外露出| 3d成人动漫网站| 欧美综合一区二区| 成人丝袜高跟foot| 韩国精品在线观看| 久久先锋影音av| 在线精品视频免费播放| 国产成人精品三级| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩午夜精品视频| 99久久99久久精品免费观看| 国产在线精品一区在线观看麻豆| 午夜精品久久久久久久99水蜜桃 | 久久久国产综合精品女国产盗摄| 欧美三级在线播放| av电影一区二区| 国产白丝网站精品污在线入口| 极品美女销魂一区二区三区 | 欧美午夜精品一区二区三区| 国产精品白丝jk黑袜喷水| 日韩成人伦理电影在线观看| 亚洲chinese男男1069| 亚洲精品高清视频在线观看| 中文字幕一区在线| 欧美极品xxx| 国产精品视频你懂的| 中文无字幕一区二区三区| 久久精品一区二区三区不卡 | 在线不卡免费av| 欧美日韩免费观看一区二区三区| 日本韩国精品在线| 欧美在线一二三四区| 欧美日韩一区二区在线视频| 欧美亚男人的天堂| 欧美日韩精品一区二区天天拍小说 | 成年人午夜久久久| 国产成人精品网址| 99视频国产精品| 色哟哟国产精品| 欧美色网站导航| 欧美日韩卡一卡二| 日韩免费电影网站| 国产欧美日韩在线看| 国产精品久久久久久久久果冻传媒| 国产精品国产三级国产普通话99| 一区二区中文视频| 亚洲午夜三级在线| 免费观看30秒视频久久| 国产一区二区中文字幕| 成人理论电影网| 色噜噜偷拍精品综合在线| 欧美精品久久99久久在免费线| 9191国产精品| 国产欧美日韩精品一区| 亚洲欧美日韩精品久久久久| 亚洲成人精品一区| 国产乱理伦片在线观看夜一区| kk眼镜猥琐国模调教系列一区二区 | 中文字幕免费不卡在线| 一区二区三区四区精品在线视频| 天天做天天摸天天爽国产一区| 国产一区二区调教| 在线观看一区日韩| 久久综合久久久久88| 亚洲免费在线看| 精品一区二区免费视频| 色哟哟一区二区| 亚洲精品在线三区| 洋洋成人永久网站入口| 黄色日韩网站视频| 欧美综合一区二区| 亚洲国产精品ⅴa在线观看| 日韩极品在线观看|