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 + -
显示快捷键?