📄 namei.c
字号:
/* * linux/fs/hpfs/namei.c * * Mikulas Patocka (mikulas@artax.karlin.mff.cuni.cz), 1998-1999 * * adding & removing files & directories */#include <linux/string.h>#include "hpfs_fn.h"int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode){ const char *name = dentry->d_name.name; unsigned len = dentry->d_name.len; struct quad_buffer_head qbh0; struct buffer_head *bh; struct hpfs_dirent *de; struct fnode *fnode; struct dnode *dnode; struct inode *result; fnode_secno fno; dnode_secno dno; int r; struct hpfs_dirent dee; int err; if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err; if (!(fnode = hpfs_alloc_fnode(dir->i_sb, dir->i_hpfs_dno, &fno, &bh))) goto bail; if (!(dnode = hpfs_alloc_dnode(dir->i_sb, fno, &dno, &qbh0, 1))) goto bail1; memset(&dee, 0, sizeof dee); dee.directory = 1; if (!(mode & 0222)) dee.read_only = 1; /*dee.archive = 0;*/ dee.hidden = name[0] == '.'; dee.fnode = fno; dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, CURRENT_TIME); hpfs_lock_inode(dir); r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0); if (r == 1) goto bail2; if (r == -1) { brelse(bh); hpfs_brelse4(&qbh0); hpfs_free_sectors(dir->i_sb, fno, 1); hpfs_free_dnode(dir->i_sb, dno); hpfs_unlock_inode(dir); return -EEXIST; } fnode->len = len; memcpy(fnode->name, name, len > 15 ? 15 : len); fnode->up = dir->i_ino; fnode->dirflag = 1; fnode->btree.n_free_nodes = 7; fnode->btree.n_used_nodes = 1; fnode->btree.first_free = 0x14; fnode->u.external[0].disk_secno = dno; fnode->u.external[0].file_secno = -1; dnode->root_dnode = 1; dnode->up = fno; de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0); de->creation_date = de->write_date = de->read_date = gmt_to_local(dir->i_sb, CURRENT_TIME); if (!(mode & 0222)) de->read_only = 1; de->first = de->directory = 1; /*de->hidden = de->system = 0;*/ de->fnode = fno; mark_buffer_dirty(bh); brelse(bh); hpfs_mark_4buffers_dirty(&qbh0); hpfs_brelse4(&qbh0); dir->i_nlink++; hpfs_lock_iget(dir->i_sb, 1); if ((result = iget(dir->i_sb, fno))) { result->i_hpfs_parent_dir = dir->i_ino; result->i_ctime = result->i_mtime = result->i_atime = local_to_gmt(dir->i_sb, dee.creation_date); result->i_hpfs_ea_size = 0; if (dee.read_only) result->i_mode &= ~0222; if (result->i_uid != current->fsuid || result->i_gid != current->fsgid || result->i_mode != (mode | S_IFDIR)) { result->i_uid = current->fsuid; result->i_gid = current->fsgid; result->i_mode = mode | S_IFDIR; hpfs_write_inode_nolock(result); } d_instantiate(dentry, result); } hpfs_unlock_iget(dir->i_sb); hpfs_unlock_inode(dir); return 0; bail2: hpfs_brelse4(&qbh0); hpfs_free_dnode(dir->i_sb, dno); hpfs_unlock_inode(dir); bail1: brelse(bh); hpfs_free_sectors(dir->i_sb, fno, 1); bail: return -ENOSPC;}int hpfs_create(struct inode *dir, struct dentry *dentry, int mode){ const char *name = dentry->d_name.name; unsigned len = dentry->d_name.len; struct inode *result = NULL; struct buffer_head *bh; struct fnode *fnode; fnode_secno fno; int r; struct hpfs_dirent dee; int err; if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err; if (!(fnode = hpfs_alloc_fnode(dir->i_sb, dir->i_hpfs_dno, &fno, &bh))) goto bail; memset(&dee, 0, sizeof dee); if (!(mode & 0222)) dee.read_only = 1; dee.archive = 1; dee.hidden = name[0] == '.'; dee.fnode = fno; dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, CURRENT_TIME); hpfs_lock_inode(dir); r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0); if (r == 1) goto bail1; if (r == -1) { brelse(bh); hpfs_free_sectors(dir->i_sb, fno, 1); hpfs_unlock_inode(dir); return -EEXIST; } fnode->len = len; memcpy(fnode->name, name, len > 15 ? 15 : len); fnode->up = dir->i_ino; mark_buffer_dirty(bh); brelse(bh); hpfs_lock_iget(dir->i_sb, 2); if ((result = iget(dir->i_sb, fno))) { hpfs_decide_conv(result, (char *)name, len); result->i_hpfs_parent_dir = dir->i_ino; result->i_ctime = result->i_mtime = result->i_atime = local_to_gmt(dir->i_sb, dee.creation_date); result->i_hpfs_ea_size = 0; if (dee.read_only) result->i_mode &= ~0222; if (result->i_blocks == -1) result->i_blocks = 1; if (result->i_size == -1) { result->i_size = 0; result->i_data.a_ops = &hpfs_aops; result->u.hpfs_i.mmu_private = 0; } if (result->i_uid != current->fsuid || result->i_gid != current->fsgid || result->i_mode != (mode | S_IFREG)) { result->i_uid = current->fsuid; result->i_gid = current->fsgid; result->i_mode = mode | S_IFREG; hpfs_write_inode_nolock(result); } d_instantiate(dentry, result); } hpfs_unlock_iget(dir->i_sb); hpfs_unlock_inode(dir); return 0; bail1: brelse(bh); hpfs_free_sectors(dir->i_sb, fno, 1); hpfs_unlock_inode(dir); bail: return -ENOSPC;}int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, int rdev){ const char *name = dentry->d_name.name; unsigned len = dentry->d_name.len; struct buffer_head *bh; struct fnode *fnode; fnode_secno fno; int r; struct hpfs_dirent dee; struct inode *result = NULL; int err; if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err; if (dir->i_sb->s_hpfs_eas < 2) return -EPERM; if (!(fnode = hpfs_alloc_fnode(dir->i_sb, dir->i_hpfs_dno, &fno, &bh))) goto bail; memset(&dee, 0, sizeof dee); if (!(mode & 0222)) dee.read_only = 1; dee.archive = 1; dee.hidden = name[0] == '.'; dee.fnode = fno; dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, CURRENT_TIME); hpfs_lock_inode(dir); r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0); if (r == 1) goto bail1; if (r == -1) { brelse(bh); hpfs_free_sectors(dir->i_sb, fno, 1); hpfs_unlock_inode(dir); return -EEXIST; } fnode->len = len; memcpy(fnode->name, name, len > 15 ? 15 : len); fnode->up = dir->i_ino; mark_buffer_dirty(bh); hpfs_lock_iget(dir->i_sb, 2); if ((result = iget(dir->i_sb, fno))) { result->i_hpfs_parent_dir = dir->i_ino; result->i_ctime = result->i_mtime = result->i_atime = local_to_gmt(dir->i_sb, dee.creation_date); result->i_hpfs_ea_size = 0; /*if (result->i_blocks == -1) result->i_blocks = 1; if (result->i_size == -1) result->i_size = 0;*/ result->i_uid = current->fsuid; result->i_gid = current->fsgid; result->i_nlink = 1; result->i_size = 0; result->i_blocks = 1; init_special_inode(result, mode, rdev); hpfs_write_inode_nolock(result); d_instantiate(dentry, result); } hpfs_unlock_iget(dir->i_sb); hpfs_unlock_inode(dir); brelse(bh); return 0; bail1: brelse(bh); hpfs_free_sectors(dir->i_sb, fno, 1); hpfs_unlock_inode(dir); bail: return -ENOSPC;}extern struct address_space_operations hpfs_symlink_aops;int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *symlink){ const char *name = dentry->d_name.name; unsigned len = dentry->d_name.len; struct buffer_head *bh; struct fnode *fnode; fnode_secno fno; int r; struct hpfs_dirent dee; struct inode *result; int err; if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err; if (dir->i_sb->s_hpfs_eas < 2) return -EPERM; if (!(fnode = hpfs_alloc_fnode(dir->i_sb, dir->i_hpfs_dno, &fno, &bh))) goto bail; memset(&dee, 0, sizeof dee); dee.archive = 1; dee.hidden = name[0] == '.'; dee.fnode = fno; dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, CURRENT_TIME); hpfs_lock_inode(dir); r = hpfs_add_dirent(dir, (char *)name, len, &dee, 0); if (r == 1) goto bail1; if (r == -1) { brelse(bh); hpfs_free_sectors(dir->i_sb, fno, 1); hpfs_unlock_inode(dir); return -EEXIST; } fnode->len = len; memcpy(fnode->name, name, len > 15 ? 15 : len); fnode->up = dir->i_ino; mark_buffer_dirty(bh); brelse(bh); hpfs_lock_iget(dir->i_sb, 2); if ((result = iget(dir->i_sb, fno))) { result->i_hpfs_parent_dir = dir->i_ino; result->i_ctime = result->i_mtime = result->i_atime = local_to_gmt(dir->i_sb, dee.creation_date); result->i_hpfs_ea_size = 0; /*if (result->i_blocks == -1) result->i_blocks = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -