lvfs_linux.c
来自「lustre 1.6.5 source code」· C语言 代码 · 共 511 行 · 第 1/2 页
C
511 行
GOTO(out_err, err); RETURN(dchild);out_err: dput(dchild); dchild = ERR_PTR(err);out_up: return dchild;}EXPORT_SYMBOL(simple_mknod);/* utility to make a directory */struct dentry *simple_mkdir(struct dentry *dir, char *name, int mode, int fix){ struct dentry *dchild; int err = 0; ENTRY; ASSERT_KERNEL_CTXT("kernel doing mkdir outside kernel context\n"); CDEBUG(D_INODE, "creating directory %.*s\n", (int)strlen(name), name); dchild = ll_lookup_one_len(name, dir, strlen(name)); if (IS_ERR(dchild)) GOTO(out_up, dchild); if (dchild->d_inode) { int old_mode = dchild->d_inode->i_mode; if (!S_ISDIR(old_mode)) { CERROR("found %s (%lu/%u) is mode %o\n", name, dchild->d_inode->i_ino, dchild->d_inode->i_generation, old_mode); GOTO(out_err, err = -ENOTDIR); } /* Fixup directory permissions if necessary */ if (fix && (old_mode & S_IALLUGO) != (mode & S_IALLUGO)) { CDEBUG(D_CONFIG, "fixing permissions on %s from %o to %o\n", name, old_mode, mode); dchild->d_inode->i_mode = (mode & S_IALLUGO) | (old_mode & ~S_IALLUGO); mark_inode_dirty(dchild->d_inode); } GOTO(out_up, dchild); } err = vfs_mkdir(dir->d_inode, dchild, mode); if (err) GOTO(out_err, err); RETURN(dchild);out_err: dput(dchild); dchild = ERR_PTR(err);out_up: return dchild;}EXPORT_SYMBOL(simple_mkdir);/* utility to rename a file */int lustre_rename(struct dentry *dir, char *oldname, char *newname){ struct dentry *dchild_old, *dchild_new; int err = 0; ENTRY; ASSERT_KERNEL_CTXT("kernel doing rename outside kernel context\n"); CDEBUG(D_INODE, "renaming file %.*s to %.*s\n", (int)strlen(oldname), oldname, (int)strlen(newname), newname); dchild_old = ll_lookup_one_len(oldname, dir, strlen(oldname)); if (IS_ERR(dchild_old)) RETURN(PTR_ERR(dchild_old)); if (!dchild_old->d_inode) GOTO(put_old, err = -ENOENT); dchild_new = ll_lookup_one_len(newname, dir, strlen(newname)); if (IS_ERR(dchild_new)) GOTO(put_old, err = PTR_ERR(dchild_new)); err = vfs_rename(dir->d_inode, dchild_old, dir->d_inode, dchild_new); dput(dchild_new);put_old: dput(dchild_old); RETURN(err);}EXPORT_SYMBOL(lustre_rename);/* * Read a file from within kernel context. Prior to calling this * function we should already have done a push_ctxt(). */int lustre_fread(struct file *file, void *buf, int len, loff_t *off){ ASSERT_KERNEL_CTXT("kernel doing read outside kernel context\n"); if (!file || !file->f_op || !file->f_op->read || !off) RETURN(-ENOSYS); return file->f_op->read(file, buf, len, off);}EXPORT_SYMBOL(lustre_fread);/* * Write a file from within kernel context. Prior to calling this * function we should already have done a push_ctxt(). */int lustre_fwrite(struct file *file, const void *buf, int len, loff_t *off){ ENTRY; ASSERT_KERNEL_CTXT("kernel doing write outside kernel context\n"); if (!file) RETURN(-ENOENT); if (!file->f_op) RETURN(-ENOSYS); if (!off) RETURN(-EINVAL); if (!file->f_op->write) RETURN(-EROFS); RETURN(file->f_op->write(file, buf, len, off));}EXPORT_SYMBOL(lustre_fwrite);/* * Sync a file from within kernel context. Prior to calling this * function we should already have done a push_ctxt(). */int lustre_fsync(struct file *file){ ENTRY; ASSERT_KERNEL_CTXT("kernel doing sync outside kernel context\n"); if (!file || !file->f_op || !file->f_op->fsync) RETURN(-ENOSYS); RETURN(file->f_op->fsync(file, file->f_dentry, 0));}EXPORT_SYMBOL(lustre_fsync);struct l_file *l_dentry_open(struct lvfs_run_ctxt *ctxt, struct l_dentry *de, int flags){ mntget(ctxt->pwdmnt); return dentry_open(de, ctxt->pwdmnt, flags);}EXPORT_SYMBOL(l_dentry_open);#ifdef HAVE_VFS_READDIR_U64_INOstatic int l_filldir(void *__buf, const char *name, int namlen, loff_t offset, u64 ino, unsigned int d_type)#elsestatic int l_filldir(void *__buf, const char *name, int namlen, loff_t offset, ino_t ino, unsigned int d_type)#endif{ struct l_linux_dirent *dirent; struct l_readdir_callback *buf = (struct l_readdir_callback *)__buf; dirent = buf->lrc_dirent; if (dirent) dirent->lld_off = offset; OBD_ALLOC(dirent, sizeof(*dirent)); if (!dirent) return -ENOMEM; list_add_tail(&dirent->lld_list, buf->lrc_list); buf->lrc_dirent = dirent; dirent->lld_ino = ino; LASSERT(sizeof(dirent->lld_name) >= namlen + 1); memcpy(dirent->lld_name, name, namlen); return 0;}long l_readdir(struct file *file, struct list_head *dentry_list){ struct l_linux_dirent *lastdirent; struct l_readdir_callback buf; int error; buf.lrc_dirent = NULL; buf.lrc_list = dentry_list; error = vfs_readdir(file, l_filldir, &buf); if (error < 0) return error; lastdirent = buf.lrc_dirent; if (lastdirent) lastdirent->lld_off = file->f_pos; return 0; }EXPORT_SYMBOL(l_readdir);#ifdef LUSTRE_KERNEL_VERSION#ifndef HAVE_CLEAR_RDONLY_ON_PUT#error rdonly patchset must be updated [cfs bz11248]#endifvoid dev_set_rdonly(lvfs_sbdev_type dev);int dev_check_rdonly(lvfs_sbdev_type dev);void __lvfs_set_rdonly(lvfs_sbdev_type dev, lvfs_sbdev_type jdev){ lvfs_sbdev_sync(dev); if (jdev && (jdev != dev)) { CDEBUG(D_IOCTL | D_HA, "set journal dev %lx rdonly\n", (long)jdev); dev_set_rdonly(jdev); } CDEBUG(D_IOCTL | D_HA, "set dev %lx rdonly\n", (long)dev); dev_set_rdonly(dev);}int lvfs_check_rdonly(lvfs_sbdev_type dev){ return dev_check_rdonly(dev);}EXPORT_SYMBOL(__lvfs_set_rdonly);EXPORT_SYMBOL(lvfs_check_rdonly);#endif /* LUSTRE_KERNEL_VERSION */int lvfs_check_io_health(struct obd_device *obd, struct file *file){ char *write_page = NULL; loff_t offset = 0; int rc = 0; ENTRY; OBD_ALLOC(write_page, CFS_PAGE_SIZE); if (!write_page) RETURN(-ENOMEM); rc = fsfilt_write_record(obd, file, write_page, CFS_PAGE_SIZE, &offset, 1); OBD_FREE(write_page, CFS_PAGE_SIZE); CDEBUG(D_INFO, "write 1 page synchronously for checking io rc %d\n",rc); RETURN(rc); }EXPORT_SYMBOL(lvfs_check_io_health);MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");MODULE_DESCRIPTION("Lustre VFS Filesystem Helper v0.1");MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?