X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fsuper25.c;h=f296d10262bcef9b1013de2d5b19999a7fb04ef1;hb=a4346f1ee87f221d8541ad31b2efb3bba41a4df4;hp=557d71550006652cd9b303cc6611e23722ffd668;hpb=ccb42f2458669aaac84a661091b05a59bb781197;p=fs%2Flustre-release.git diff --git a/lustre/llite/super25.c b/lustre/llite/super25.c index 557d715..f296d10 100644 --- a/lustre/llite/super25.c +++ b/lustre/llite/super25.c @@ -3,10 +3,22 @@ * * Lustre Light Super operations * - * This code is issued under the GNU General Public License. - * See the file COPYING in this distribution + * Copyright (c) 2002, 2003 Cluster File Systems, Inc. * - * Copryright (C) 2002 Cluster File Systems, Inc. + * This file is part of Lustre, http://www.lustre.org. + * + * Lustre is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * Lustre is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Lustre; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define DEBUG_SUBSYSTEM S_LLITE @@ -22,11 +34,19 @@ #include #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) +#include kmem_cache_t *ll_file_data_slab; extern struct address_space_operations ll_aops; extern struct address_space_operations ll_dir_aops; struct super_operations ll_super_operations; +/* /proc/lustre/llite root that tracks llite mount points */ +struct proc_dir_entry *proc_lustre_fs_root = NULL; +/* lproc_llite.c */ +extern int lprocfs_register_mountpoint(struct proc_dir_entry *parent, + struct super_block *sb, + char *osc, char *mdc); + extern int ll_init_inodecache(void); extern void ll_destroy_inodecache(void); extern int ll_recover(struct recovd_data *, int); @@ -34,7 +54,7 @@ extern int ll_commitcbd_setup(struct ll_sb_info *); extern int ll_commitcbd_cleanup(struct ll_sb_info *); int ll_read_inode2(struct inode *inode, void *opaque); -extern void ll_proc_namespace(struct super_block* sb, char* osc, char* mdc) +extern int ll_proc_namespace(struct super_block* sb, char* osc, char* mdc); static char *ll_read_opt(const char *opt, char *data) { @@ -43,14 +63,14 @@ static char *ll_read_opt(const char *opt, char *data) ENTRY; CDEBUG(D_SUPER, "option: %s, data %s\n", opt, data); - if ( strncmp(opt, data, strlen(opt)) ) + if (strncmp(opt, data, strlen(opt))) RETURN(NULL); - if ( (value = strchr(data, '=')) == NULL ) + if ((value = strchr(data, '=')) == NULL) RETURN(NULL); value++; OBD_ALLOC(retval, strlen(value) + 1); - if ( !retval ) { + if (!retval) { CERROR("out of memory!\n"); RETURN(NULL); } @@ -65,7 +85,7 @@ static int ll_set_opt(const char *opt, char *data, int fl) ENTRY; CDEBUG(D_SUPER, "option: %s, data %s\n", opt, data); - if ( strncmp(opt, data, strlen(opt)) ) + if (strncmp(opt, data, strlen(opt))) RETURN(0); else RETURN(fl); @@ -84,10 +104,11 @@ static void ll_options(char *options, char **ost, char **mds, int *flags) while ((this_char = strsep (&opt_ptr, ",")) != NULL) { CDEBUG(D_SUPER, "this_char %s\n", this_char); - if ( (!*ost && (*ost = ll_read_opt("osc", this_char)))|| - (!*mds && (*mds = ll_read_opt("mdc", this_char)))|| - (!(*flags & LL_SBI_NOLCK) && ((*flags) = (*flags) | - ll_set_opt("nolock", this_char, LL_SBI_NOLCK))) ) + if ((!*ost && (*ost = ll_read_opt("osc", this_char)))|| + (!*mds && (*mds = ll_read_opt("mdc", this_char)))|| + (!(*flags & LL_SBI_NOLCK) && + ((*flags) = (*flags) | + ll_set_opt("nolock", this_char, LL_SBI_NOLCK)))) continue; } EXIT; @@ -112,6 +133,7 @@ static int ll_fill_super(struct super_block *sb, void *data, int silent) struct ptlrpc_connection *mdc_conn; struct ll_read_inode2_cookie lic; class_uuid_t uuid; + struct obd_uuid param_uuid; ENTRY; @@ -120,8 +142,9 @@ static int ll_fill_super(struct super_block *sb, void *data, int silent) RETURN(-ENOMEM); INIT_LIST_HEAD(&sbi->ll_conn_chain); + INIT_LIST_HEAD(&sbi->ll_orphan_dentry_list); generate_random_uuid(uuid); - class_uuid_unparse(uuid, sbi->ll_sb_uuid); + class_uuid_unparse(uuid, &sbi->ll_sb_uuid); sb->s_fs_info = sbi; @@ -137,13 +160,14 @@ static int ll_fill_super(struct super_block *sb, void *data, int silent) GOTO(out_free, sb = NULL); } - obd = class_uuid2obd(mdc); + strncpy(param_uuid.uuid, mdc, sizeof(param_uuid.uuid)); + obd = class_uuid2obd(¶m_uuid); if (!obd) { CERROR("MDC %s: not setup or attached\n", mdc); GOTO(out_free, sb = NULL); } - err = obd_connect(&sbi->ll_mdc_conn, obd, sbi->ll_sb_uuid, + err = obd_connect(&sbi->ll_mdc_conn, obd, &sbi->ll_sb_uuid, ptlrpc_recovd, ll_recover); if (err) { CERROR("cannot connect to %s: rc = %d\n", mdc, err); @@ -159,7 +183,7 @@ static int ll_fill_super(struct super_block *sb, void *data, int silent) GOTO(out_mdc, sb = NULL); } - err = obd_connect(&sbi->ll_osc_conn, obd, sbi->ll_sb_uuid, + err = obd_connect(&sbi->ll_osc_conn, obd, &sbi->ll_sb_uuid, ptlrpc_recovd, ll_recover); if (err) { CERROR("cannot connect to %s: rc = %d\n", osc, err); @@ -175,7 +199,7 @@ static int ll_fill_super(struct super_block *sb, void *data, int silent) sbi->ll_rootino = rootfid.id; memset(&osfs, 0, sizeof(osfs)); - err = mdc_statfs(&sbi->ll_mdc_conn, &osfs); + err = obd_statfs(&sbi->ll_mdc_conn, &osfs); sb->s_blocksize = osfs.os_bsize; sb->s_blocksize_bits = log2(osfs.os_bsize); sb->s_magic = LL_SUPER_MAGIC; @@ -209,6 +233,7 @@ static int ll_fill_super(struct super_block *sb, void *data, int silent) if (root) { sb->s_root = d_alloc_root(root); + root->i_state &= ~(I_LOCK | I_NEW); } else { CERROR("lustre_lite: bad iget4 for root\n"); GOTO(out_cdb, sb = NULL); @@ -216,7 +241,14 @@ static int ll_fill_super(struct super_block *sb, void *data, int silent) ptlrpc_req_finished(request); request = NULL; - ll_proc_namespace(sb, osc, mdc) + + if (proc_lustre_fs_root) { + err = lprocfs_register_mountpoint(proc_lustre_fs_root, sb, + osc, mdc); + if (err < 0) + CERROR("could not register mount in /proc/lustre"); + } + out_dev: if (mdc) OBD_FREE(mdc, strlen(mdc) + 1); @@ -247,6 +279,7 @@ struct super_block * ll_get_sb(struct file_system_type *fs_type, static void ll_put_super(struct super_block *sb) { struct ll_sb_info *sbi = ll_s2sbi(sb); + struct list_head *tmp, *next; struct ll_fid rootfid; ENTRY; @@ -262,10 +295,20 @@ static void ll_put_super(struct super_block *sb) */ mdc_getstatus(&sbi->ll_mdc_conn, &rootfid); - lprocfs_dereg_mnt(sbi->ll_proc_root); + if (sbi->ll_proc_root) { + lprocfs_remove(sbi->ll_proc_root); sbi->ll_proc_root = NULL; + } obd_disconnect(&sbi->ll_mdc_conn); + + spin_lock(&dcache_lock); + list_for_each_safe(tmp, next, &sbi->ll_orphan_dentry_list){ + struct dentry *dentry = list_entry(tmp, struct dentry, d_hash); + shrink_dcache_parent(dentry); + } + spin_unlock(&dcache_lock); + OBD_FREE(sbi, sizeof(*sbi)); EXIT; @@ -310,6 +353,7 @@ static void ll_clear_inode(struct inode *inode) EXIT; } +#if 0 static void ll_delete_inode(struct inode *inode) { ENTRY; @@ -346,6 +390,7 @@ out: clear_inode(inode); EXIT; } +#endif /* like inode_setattr, but doesn't mark the inode dirty */ static int ll_attr2inode(struct inode * inode, struct iattr * attr, int trunc) @@ -395,11 +440,29 @@ int ll_inode_setattr(struct inode *inode, struct iattr *attr, int do_trunc) */ attr->ia_valid &= ~ATTR_SIZE; if (attr->ia_valid) { - err = mdc_setattr(&sbi->ll_mdc_conn, inode, attr, &request); + err = mdc_setattr(&sbi->ll_mdc_conn, inode, attr, NULL, 0, + &request); if (err) - CERROR("mdc_setattr fails (%d)\n", err); + CERROR("mdc_setattr fails: err = %d\n", err); ptlrpc_req_finished(request); + if (S_ISREG(inode->i_mode) && attr->ia_valid & ATTR_MTIME_SET) { + struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd; + struct obdo oa; + int err2; + + CDEBUG(D_ERROR, "setting mtime on OST\n"); + oa.o_id = lsm->lsm_object_id; + oa.o_mode = S_IFREG; + oa.o_valid = OBD_MD_FLID |OBD_MD_FLTYPE |OBD_MD_FLMTIME; + oa.o_mtime = attr->ia_mtime.tv_sec; + err2 = obd_setattr(&sbi->ll_osc_conn, &oa, lsm, NULL); + if (err2) { + CERROR("obd_setattr fails: rc=%d\n", err); + if (!err) + err = err2; + } + } } RETURN(err); @@ -463,16 +526,22 @@ out: RETURN(rc); } -void ll_update_inode(struct inode *inode, struct mds_body *body) +void ll_update_inode(struct inode *inode, struct mds_body *body, + struct lov_mds_md *lmm) { + struct ll_inode_info *lli = ll_i2info(inode); + + if (lmm != NULL) + obd_unpackmd(ll_i2obdconn(inode), &lli->lli_smd, lmm); + if (body->valid & OBD_MD_FLID) inode->i_ino = body->ino; if (body->valid & OBD_MD_FLATIME) - inode->i_atime = body->atime; + inode->i_atime.tv_sec = body->atime; if (body->valid & OBD_MD_FLMTIME) - inode->i_mtime = body->mtime; + inode->i_mtime.tv_sec = body->mtime; if (body->valid & OBD_MD_FLCTIME) - inode->i_ctime = body->ctime; + inode->i_ctime.tv_sec = body->ctime; if (body->valid & OBD_MD_FLMODE) inode->i_mode = (inode->i_mode & S_IFMT)|(body->mode & ~S_IFMT); if (body->valid & OBD_MD_FLTYPE) @@ -491,6 +560,8 @@ void ll_update_inode(struct inode *inode, struct mds_body *body) inode->i_rdev = to_kdev_t(body->rdev); if (body->valid & OBD_MD_FLSIZE) inode->i_size = body->size; + if (body->valid & OBD_MD_FLBLOCKS) + inode->i_blocks = body->blocks; } int ll_read_inode2(struct inode *inode, void *opaque) @@ -502,22 +573,32 @@ int ll_read_inode2(struct inode *inode, void *opaque) ENTRY; sema_init(&lli->lli_open_sem, 1); - - /* core attributes first */ - ll_update_inode(inode, body); + lli->flags = 0; + init_MUTEX(&lli->lli_getattr_sem); + /* these are 2.4 only, but putting them here for consistency.. */ + spin_lock_init(&lli->lli_read_extent_lock); + INIT_LIST_HEAD(&lli->lli_read_extents); LASSERT(!lli->lli_smd); - if (lic && lic->lic_lmm) - obd_unpackmd(ll_i2obdconn(inode), &lli->lli_smd, lic->lic_lmm); + + /* core attributes first */ + ll_update_inode(inode, body, lic ? lic->lic_lmm : NULL); /* Get the authoritative file size */ if (lli->lli_smd && S_ISREG(inode->i_mode)) { - rc = ll_file_size(inode, lli->lli_smd); - if (rc) { - CERROR("ll_file_size: %d\n", rc); + struct ll_file_data *fd = file->private_data; + struct ldlm_extent extent = {0, OBD_OBJECT_EOF}; + struct lustre_handle lockh = {0, 0}; + + LASSERT(lli->lli_smd->lsm_object_id != 0); + + rc = ll_extent_lock(fd, inode, lsm, LCK_PR, &extent, &lockh); + if (err != ELDLM_OK && err != ELDLM_MATCHED) { ll_clear_inode(inode); make_bad_inode(inode); - RETURN(rc); + } else { + l_extent_unlock(fd, inode, lsm, LCK_PR, &extent, + &lockh); } } @@ -573,7 +654,7 @@ void ll_umount_begin(struct super_block *sb) spin_lock(&conn->c_lock); conn->c_flags |= CONN_INVALID; - invalidate_request_list(&conn->c_sending_head); + /*invalidate_request_list(&conn->c_sending_head);*/ invalidate_request_list(&conn->c_delayed_head); spin_unlock(&conn->c_lock); } @@ -593,6 +674,7 @@ static struct inode *ll_alloc_inode(struct super_block *sb) memset(lli, 0, (char *)&lli->lli_vfs_inode - (char *)lli); sema_init(&lli->lli_open_sem, 1); + init_MUTEX(&lli->lli_size_valid_sem); return &lli->lli_vfs_inode; } @@ -636,23 +718,25 @@ struct super_operations ll_super_operations = alloc_inode: ll_alloc_inode, destroy_inode: ll_destroy_inode, clear_inode: ll_clear_inode, - delete_inode: ll_delete_inode, +// delete_inode: ll_delete_inode, put_super: ll_put_super, statfs: ll_statfs, umount_begin: ll_umount_begin }; + struct file_system_type lustre_lite_fs_type = { .owner = THIS_MODULE, .name = "lustre_lite", .get_sb = ll_get_sb, - .kill_sb = kill_litter_super, + .kill_sb = kill_anon_super, }; static int __init init_lustre_lite(void) { int rc; - printk(KERN_INFO "Lustre Lite 0.5.14, info@clusterfs.com\n"); + printk(KERN_INFO "Lustre Lite Client File System; " + "info@clusterfs.com\n"); rc = ll_init_inodecache(); if (rc) return -ENOMEM; @@ -663,6 +747,10 @@ static int __init init_lustre_lite(void) ll_destroy_inodecache(); return -ENOMEM; } + + proc_lustre_fs_root = proc_lustre_root ? + proc_mkdir("llite", proc_lustre_root) : NULL; + return register_filesystem(&lustre_lite_fs_type); } @@ -671,10 +759,14 @@ static void __exit exit_lustre_lite(void) unregister_filesystem(&lustre_lite_fs_type); ll_destroy_inodecache(); kmem_cache_destroy(ll_file_data_slab); + if (proc_lustre_fs_root) { + lprocfs_remove(proc_lustre_fs_root); + proc_lustre_fs_root = NULL; + } } MODULE_AUTHOR("Cluster File Systems, Inc. "); -MODULE_DESCRIPTION("Lustre Lite Client File System v1.0"); +MODULE_DESCRIPTION("Lustre Lite Client File System"); MODULE_LICENSE("GPL"); module_init(init_lustre_lite);