ufs_symlink.c
来自「elinux jffs初始版本 具体了解JFFS的文件系统!」· C语言 代码 · 共 184 行
C
184 行
/* * linux/fs/ufs/ufs_symlink.c * * Copyright (C) 1996 * Adrian Rodriguez (adrian@franklins-tower.rutgers.edu) * Laboratory for Computer Science Research Computing Facility * Rutgers, The State University of New Jersey * * $Id: ufs_symlink.c,v 1.1.1.1 1998/07/10 11:59:02 bjornw Exp $ * */#include <linux/fs.h>#include <linux/sched.h>#include <asm/segment.h>extern int ufs_bmap (struct inode *, int);static intufs_readlink(struct inode * inode, char * buffer, int buflen){ unsigned long int block; struct buffer_head * bh = NULL; char * link; int i; char c; if (inode->i_sb->u.ufs_sb.s_flags & (UFS_DEBUG|UFS_DEBUG_LINKS)) { printk("ufs_readlink: called on ino %lu dev %u/%u\n", inode->i_ino, MAJOR(inode->i_dev), MINOR(inode->i_dev)); } if (!S_ISLNK(inode->i_mode)) { iput (inode); return -EINVAL; } if (buflen > inode->i_sb->s_blocksize - 1) buflen = inode->i_sb->s_blocksize - 1; if (inode->i_blocks) { /* XXX - error checking */ block = ufs_bmap(inode, 0); if (inode->i_sb->u.ufs_sb.s_flags &(UFS_DEBUG|UFS_DEBUG_LINKS)) { printk("ufs_readlink: bmap got %lu for ino %lu\n", block, inode->i_ino); } bh = bread(inode->i_dev, block, BLOCK_SIZE); if (!bh) { iput (inode); printk("ufs_readlink: can't read block 0 for ino %lu on dev %u/%u\n", inode->i_ino, MAJOR(inode->i_dev), MINOR(inode->i_dev)); return 0; } link = bh->b_data; } else { link = (char *)&(inode->u.ufs_i.ui_db[0]); } i = 0; while (i < buflen && (c = link[i])) { i++; put_user (c, buffer++); } iput (inode); if (bh) brelse (bh); return i;}/* * XXX - blatantly stolen from ext2fs */static intufs_follow_link(struct inode * dir, struct inode * inode, int flag, int mode, struct inode ** res_inode){ unsigned long int block; int error; struct buffer_head * bh; char * link; bh = NULL; if (inode->i_sb->u.ufs_sb.s_flags & (UFS_DEBUG|UFS_DEBUG_LINKS)) { printk("ufs_follow_link: called on ino %lu dev %u/%u\n", dir->i_ino, MAJOR(dir->i_dev), MINOR(dir->i_dev)); } *res_inode = NULL; if (!dir) { dir = current->fs->root; dir->i_count++; } if (!inode) { iput (dir); return -ENOENT; } if (!S_ISLNK(inode->i_mode)) { iput (dir); *res_inode = inode; return 0; } if (current->link_count > 5) { iput (dir); iput (inode); return -ELOOP; } if (inode->i_blocks) { /* read the link from disk */ /* XXX - error checking */ block = ufs_bmap(inode, 0); bh = bread(inode->i_dev, block, BLOCK_SIZE); if (bh == NULL) { printk("ufs_follow_link: can't read block 0 for ino %lu on dev %u/%u\n", inode->i_ino, MAJOR(inode->i_dev), MINOR(inode->i_dev)); iput(dir); iput(inode); return(-EIO); } link = bh->b_data; } else { /* fast symlink */ link = (char *)&(inode->u.ufs_i.ui_db[0]); } current->link_count++; error = open_namei (link, flag, mode, res_inode, dir); current->link_count--; iput (inode); if (bh) { brelse (bh); } return(error);}static struct file_operations ufs_symlink_operations = { NULL, /* lseek */ NULL, /* read */ NULL, /* write */ NULL, /* readdir */ NULL, /* select */ NULL, /* ioctl */ NULL, /* mmap */ NULL, /* open */ NULL, /* release */ NULL, /* fsync */ /* XXX - is this ok? */ NULL, /* fasync */ NULL, /* check_media_change */ NULL, /* revalidate */};struct inode_operations ufs_symlink_inode_operations = { &ufs_symlink_operations, /* default directory file operations */ NULL, /* create */ NULL, /* lookup */ NULL, /* link */ NULL, /* unlink */ NULL, /* symlink */ NULL, /* mkdir */ NULL, /* rmdir */ NULL, /* mknod */ NULL, /* rename */ &ufs_readlink, /* readlink */ &ufs_follow_link, /* follow_link */ NULL, /* readpage */ NULL, /* writepage */ NULL, /* bmap */ NULL, /* truncate */ NULL, /* permission */ NULL, /* smap */};/* * Local Variables: *** * c-indent-level: 8 *** * c-continued-statement-offset: 8 *** * c-brace-offset: -8 *** * c-argdecl-indent: 0 *** * c-label-offset: -8 *** * End: *** */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?