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

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

?? dir.c

?? UnixBSD、SunOs、FreeBSD、NetBSD、OpenBSD和NeXTStep文件系統源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
	for (n = 0; n <= npages; n++) {		char *dir_end;		page = ufs_get_page(dir, n);		err = PTR_ERR(page);		if (IS_ERR(page))			goto out;		lock_page(page);		kaddr = page_address(page);		dir_end = kaddr + ufs_last_byte(dir, n);		de = (struct ufs_dir_entry *)kaddr;		kaddr += PAGE_CACHE_SIZE - reclen;		while ((char *)de <= kaddr) {			if ((char *)de == dir_end) {				/* We hit i_size */				name_len = 0;				rec_len = chunk_size;				de->d_reclen = cpu_to_fs16(sb, chunk_size);				de->d_ino = 0;				goto got_it;			}			if (de->d_reclen == 0) {				ufs_error(dir->i_sb, __func__,					  "zero-length directory entry");				err = -EIO;				goto out_unlock;			}			err = -EEXIST;			if (ufs_match(sb, namelen, name, de))				goto out_unlock;			name_len = UFS_DIR_REC_LEN(ufs_get_de_namlen(sb, de));			rec_len = fs16_to_cpu(sb, de->d_reclen);			if (!de->d_ino && rec_len >= reclen)				goto got_it;			if (rec_len >= name_len + reclen)				goto got_it;			de = (struct ufs_dir_entry *) ((char *) de + rec_len);		}		unlock_page(page);		ufs_put_page(page);	}	BUG();	return -EINVAL;got_it:	pos = page_offset(page) +			(char*)de - (char*)page_address(page);	err = __ufs_write_begin(NULL, page->mapping, pos, rec_len,				AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);	if (err)		goto out_unlock;	if (de->d_ino) {		struct ufs_dir_entry *de1 =			(struct ufs_dir_entry *) ((char *) de + name_len);		de1->d_reclen = cpu_to_fs16(sb, rec_len - name_len);		de->d_reclen = cpu_to_fs16(sb, name_len);		de = de1;	}	ufs_set_de_namlen(sb, de, namelen);	memcpy(de->d_name, name, namelen + 1);	de->d_ino = cpu_to_fs32(sb, inode->i_ino);	ufs_set_de_type(sb, de, inode->i_mode);	err = ufs_commit_chunk(page, pos, rec_len);	dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC;	mark_inode_dirty(dir);	/* OFFSET_CACHE */out_put:	ufs_put_page(page);out:	return err;out_unlock:	unlock_page(page);	goto out_put;}static inline unsignedufs_validate_entry(struct super_block *sb, char *base,		   unsigned offset, unsigned mask){	struct ufs_dir_entry *de = (struct ufs_dir_entry*)(base + offset);	struct ufs_dir_entry *p = (struct ufs_dir_entry*)(base + (offset&mask));	while ((char*)p < (char*)de) {		if (p->d_reclen == 0)			break;		p = ufs_next_entry(sb, p);	}	return (char *)p - base;}/* * This is blatantly stolen from ext2fs */static intufs_readdir(struct file *filp, void *dirent, filldir_t filldir){	loff_t pos = filp->f_pos;	struct inode *inode = filp->f_path.dentry->d_inode;	struct super_block *sb = inode->i_sb;	unsigned int offset = pos & ~PAGE_CACHE_MASK;	unsigned long n = pos >> PAGE_CACHE_SHIFT;	unsigned long npages = ufs_dir_pages(inode);	unsigned chunk_mask = ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1);	int need_revalidate = filp->f_version != inode->i_version;	unsigned flags = UFS_SB(sb)->s_flags;	UFSD("BEGIN\n");	if (pos > inode->i_size - UFS_DIR_REC_LEN(1))		return 0;	for ( ; n < npages; n++, offset = 0) {		char *kaddr, *limit;		struct ufs_dir_entry *de;		struct page *page = ufs_get_page(inode, n);		if (IS_ERR(page)) {			ufs_error(sb, __func__,				  "bad page in #%lu",				  inode->i_ino);			filp->f_pos += PAGE_CACHE_SIZE - offset;			return -EIO;		}		kaddr = page_address(page);		if (unlikely(need_revalidate)) {			if (offset) {				offset = ufs_validate_entry(sb, kaddr, offset, chunk_mask);				filp->f_pos = (n<<PAGE_CACHE_SHIFT) + offset;			}			filp->f_version = inode->i_version;			need_revalidate = 0;		}		de = (struct ufs_dir_entry *)(kaddr+offset);		limit = kaddr + ufs_last_byte(inode, n) - UFS_DIR_REC_LEN(1);		for ( ;(char*)de <= limit; de = ufs_next_entry(sb, de)) {			if (de->d_reclen == 0) {				ufs_error(sb, __func__,					"zero-length directory entry");				ufs_put_page(page);				return -EIO;			}			if (de->d_ino) {				int over;				unsigned char d_type = DT_UNKNOWN;				offset = (char *)de - kaddr;				UFSD("filldir(%s,%u)\n", de->d_name,				      fs32_to_cpu(sb, de->d_ino));				UFSD("namlen %u\n", ufs_get_de_namlen(sb, de));				if ((flags & UFS_DE_MASK) == UFS_DE_44BSD)					d_type = de->d_u.d_44.d_type;				over = filldir(dirent, de->d_name,					       ufs_get_de_namlen(sb, de),						(n<<PAGE_CACHE_SHIFT) | offset,					       fs32_to_cpu(sb, de->d_ino), d_type);				if (over) {					ufs_put_page(page);					return 0;				}			}			filp->f_pos += fs16_to_cpu(sb, de->d_reclen);		}		ufs_put_page(page);	}	return 0;}/* * ufs_delete_entry deletes a directory entry by merging it with the * previous entry. */int ufs_delete_entry(struct inode *inode, struct ufs_dir_entry *dir,		     struct page * page){	struct super_block *sb = inode->i_sb;	struct address_space *mapping = page->mapping;	char *kaddr = page_address(page);	unsigned from = ((char*)dir - kaddr) & ~(UFS_SB(sb)->s_uspi->s_dirblksize - 1);	unsigned to = ((char*)dir - kaddr) + fs16_to_cpu(sb, dir->d_reclen);	loff_t pos;	struct ufs_dir_entry *pde = NULL;	struct ufs_dir_entry *de = (struct ufs_dir_entry *) (kaddr + from);	int err;	UFSD("ENTER\n");	UFSD("ino %u, reclen %u, namlen %u, name %s\n",	      fs32_to_cpu(sb, de->d_ino),	      fs16_to_cpu(sb, de->d_reclen),	      ufs_get_de_namlen(sb, de), de->d_name);	while ((char*)de < (char*)dir) {		if (de->d_reclen == 0) {			ufs_error(inode->i_sb, __func__,				  "zero-length directory entry");			err = -EIO;			goto out;		}		pde = de;		de = ufs_next_entry(sb, de);	}	if (pde)		from = (char*)pde - (char*)page_address(page);	pos = page_offset(page) + from;	lock_page(page);	err = __ufs_write_begin(NULL, mapping, pos, to - from,				AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);	BUG_ON(err);	if (pde)		pde->d_reclen = cpu_to_fs16(sb, to - from);	dir->d_ino = 0;	err = ufs_commit_chunk(page, pos, to - from);	inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC;	mark_inode_dirty(inode);out:	ufs_put_page(page);	UFSD("EXIT\n");	return err;}int ufs_make_empty(struct inode * inode, struct inode *dir){	struct super_block * sb = dir->i_sb;	struct address_space *mapping = inode->i_mapping;	struct page *page = grab_cache_page(mapping, 0);	const unsigned int chunk_size = UFS_SB(sb)->s_uspi->s_dirblksize;	struct ufs_dir_entry * de;	char *base;	int err;	if (!page)		return -ENOMEM;	err = __ufs_write_begin(NULL, mapping, 0, chunk_size,				AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);	if (err) {		unlock_page(page);		goto fail;	}	kmap(page);	base = (char*)page_address(page);	memset(base, 0, PAGE_CACHE_SIZE);	de = (struct ufs_dir_entry *) base;	de->d_ino = cpu_to_fs32(sb, inode->i_ino);	ufs_set_de_type(sb, de, inode->i_mode);	ufs_set_de_namlen(sb, de, 1);	de->d_reclen = cpu_to_fs16(sb, UFS_DIR_REC_LEN(1));	strcpy (de->d_name, ".");	de = (struct ufs_dir_entry *)		((char *)de + fs16_to_cpu(sb, de->d_reclen));	de->d_ino = cpu_to_fs32(sb, dir->i_ino);	ufs_set_de_type(sb, de, dir->i_mode);	de->d_reclen = cpu_to_fs16(sb, chunk_size - UFS_DIR_REC_LEN(1));	ufs_set_de_namlen(sb, de, 2);	strcpy (de->d_name, "..");	kunmap(page);	err = ufs_commit_chunk(page, 0, chunk_size);fail:	page_cache_release(page);	return err;}/* * routine to check that the specified directory is empty (for rmdir) */int ufs_empty_dir(struct inode * inode){	struct super_block *sb = inode->i_sb;	struct page *page = NULL;	unsigned long i, npages = ufs_dir_pages(inode);	for (i = 0; i < npages; i++) {		char *kaddr;		struct ufs_dir_entry *de;		page = ufs_get_page(inode, i);		if (IS_ERR(page))			continue;		kaddr = page_address(page);		de = (struct ufs_dir_entry *)kaddr;		kaddr += ufs_last_byte(inode, i) - UFS_DIR_REC_LEN(1);		while ((char *)de <= kaddr) {			if (de->d_reclen == 0) {				ufs_error(inode->i_sb, __func__,					"zero-length directory entry: "					"kaddr=%p, de=%p\n", kaddr, de);				goto not_empty;			}			if (de->d_ino) {				u16 namelen=ufs_get_de_namlen(sb, de);				/* check for . and .. */				if (de->d_name[0] != '.')					goto not_empty;				if (namelen > 2)					goto not_empty;				if (namelen < 2) {					if (inode->i_ino !=					    fs32_to_cpu(sb, de->d_ino))						goto not_empty;				} else if (de->d_name[1] != '.')					goto not_empty;			}			de = ufs_next_entry(sb, de);		}		ufs_put_page(page);	}	return 1;not_empty:	ufs_put_page(page);	return 0;}const struct file_operations ufs_dir_operations = {	.read		= generic_read_dir,	.readdir	= ufs_readdir,	.fsync		= file_fsync,	.llseek		= generic_file_llseek,};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色999日韩国产欧美一区二区| av电影天堂一区二区在线| 亚洲欧美aⅴ...| 国产精品久久久久一区 | 中文字幕一区免费在线观看| 精品国产伦理网| 精品久久久久一区| 久久久精品免费网站| 国产日韩一级二级三级| 国产精品三级电影| 亚洲视频在线观看三级| 伊人婷婷欧美激情| 午夜久久久久久| 美国十次了思思久久精品导航| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产在线播精品第三| 国产一区视频网站| k8久久久一区二区三区 | 亚洲五码中文字幕| 男人的j进女人的j一区| 国产一区二区三区在线观看免费视频 | 日韩一区二区在线免费观看| 日韩欧美高清在线| 国产精品剧情在线亚洲| 夜夜嗨av一区二区三区网页 | 日韩一卡二卡三卡四卡| 久久一日本道色综合| 日韩毛片视频在线看| 午夜伊人狠狠久久| 国产最新精品精品你懂的| 成人av在线影院| 欧美日韩一区二区电影| 久久久综合网站| 亚洲伊人色欲综合网| 久草热8精品视频在线观看| 99在线精品免费| 日韩亚洲国产中文字幕欧美| 国产精品你懂的在线| 婷婷中文字幕一区三区| 成人精品电影在线观看| 555夜色666亚洲国产免| 成人免费小视频| 六月丁香婷婷色狠狠久久| av电影天堂一区二区在线| 日韩精品一区二区在线观看| 亚洲免费观看高清完整版在线观看| 人人狠狠综合久久亚洲| 色婷婷av一区二区三区之一色屋| 日韩欧美一级二级| 亚洲一区av在线| 成人91在线观看| 精品国产免费久久| 午夜成人免费电影| 日本高清不卡视频| 国产精品毛片久久久久久| 秋霞成人午夜伦在线观看| 色久优优欧美色久优优| 久久久久久久久久久久电影| 日韩成人精品在线| 欧美日韩亚洲综合在线 | 国产日韩v精品一区二区| 午夜免费欧美电影| 日本乱人伦aⅴ精品| 欧美国产欧美综合| 国产成人在线电影| 日韩一级完整毛片| 视频在线观看一区| 欧美日韩一区二区在线观看视频 | 日韩一级二级三级| 日韩电影免费在线观看网站| 在线观看亚洲专区| 一区二区免费视频| 在线视频欧美区| 亚洲美女屁股眼交3| 成人国产在线观看| 国产精品久久久久久久久免费相片| 国内欧美视频一区二区| 日韩一级大片在线| 精品午夜一区二区三区在线观看| 在线不卡a资源高清| 日韩vs国产vs欧美| 欧美一区二区三区播放老司机| 爽爽淫人综合网网站| 欧美乱熟臀69xxxxxx| 日本不卡一二三| 精品福利二区三区| 国产精品99久| 中文字幕欧美一| 欧美特级限制片免费在线观看| 一区二区三区成人| 日韩一区二区三区在线| 黄网站免费久久| 国产精品色噜噜| 日本高清不卡一区| 美女网站色91| 日本一区二区免费在线观看视频| 国产+成+人+亚洲欧洲自线| 中文字幕在线播放不卡一区| 在线亚洲高清视频| 美女性感视频久久| 中文字幕一区二区三| 欧美性高清videossexo| 麻豆精品一区二区| 国产精品丝袜久久久久久app| 91亚洲精品一区二区乱码| 亚洲国产综合91精品麻豆| 日韩精品中文字幕在线不卡尤物| 成人性色生活片免费看爆迷你毛片| 日韩毛片一二三区| 精品裸体舞一区二区三区| 本田岬高潮一区二区三区| 亚洲电影一级黄| 国产日产精品1区| 欧美日精品一区视频| 国产福利一区二区三区视频| 一区二区高清在线| 国产亚洲欧洲一区高清在线观看| 91丨九色丨黑人外教| 久久se精品一区精品二区| 亚洲精品自拍动漫在线| 26uuu另类欧美亚洲曰本| 欧美偷拍一区二区| 国产.欧美.日韩| 日韩精品久久理论片| 成人欧美一区二区三区1314 | 国产91对白在线观看九色| 视频在线观看一区二区三区| 综合网在线视频| 久久久影院官网| 欧美精品 国产精品| 91性感美女视频| 国产91精品一区二区麻豆网站 | 91国在线观看| 成人小视频免费观看| 精品一区二区三区的国产在线播放| 亚洲精品国产品国语在线app| 久久久久久久久岛国免费| 3d动漫精品啪啪一区二区竹菊| 色婷婷激情综合| 99久久精品99国产精品| 成人中文字幕在线| 国产一区二区三区av电影 | 国产精品一二二区| 久久精品免费看| 蜜臀av一级做a爰片久久| 香蕉久久夜色精品国产使用方法| 亚洲欧美精品午睡沙发| 国产精品国产三级国产普通话蜜臀 | 欧美电视剧在线观看完整版| 欧美日韩免费一区二区三区| 欧美性受xxxx黑人xyx性爽| 99视频一区二区三区| 成人小视频在线| 成人a免费在线看| 成人免费观看视频| 成人av在线资源网站| 99精品视频中文字幕| 色视频欧美一区二区三区| 色婷婷亚洲婷婷| 91福利视频久久久久| 欧美日韩在线三级| 欧美一区二区三区思思人| 精品国产一区二区三区四区四| 日韩一级大片在线| 久久久精品综合| 成人欧美一区二区三区黑人麻豆 | 日本一区二区三区dvd视频在线| 国产欧美日韩不卡免费| 亚洲欧洲另类国产综合| 亚洲男人的天堂av| 日韩一区精品字幕| 精品一区二区三区视频| av午夜一区麻豆| 欧美偷拍一区二区| 精品国产第一区二区三区观看体验| 久久久久久日产精品| 亚洲三级电影网站| 三级影片在线观看欧美日韩一区二区 | 一区二区三国产精华液| 亚洲国产综合色| 国产在线麻豆精品观看| www.在线成人| 在线成人午夜影院| 久久久www成人免费无遮挡大片| 日韩毛片一二三区| 日本系列欧美系列| 成人福利视频网站| 在线观看国产日韩| 精品国产1区2区3区| 亚洲天堂a在线| 蜜桃传媒麻豆第一区在线观看| 成人久久视频在线观看| 欧美人牲a欧美精品| 国产欧美日韩另类一区| 午夜电影网一区| 99麻豆久久久国产精品免费优播| 337p亚洲精品色噜噜狠狠| 国产精品久久久久久久久晋中| 日韩av电影一区| 99vv1com这只有精品|