Whamcloud - gitweb
64-bit warning fixes. Someone should take a closer look at ext2_obd.c
[fs/lustre-release.git] / lustre / llite / super.c
index 5977ebe..dd426b4 100644 (file)
 
 #include <linux/config.h>
 #include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/mm.h>
-#include <linux/string.h>
-#include <linux/stat.h>
-#include <linux/errno.h>
-#include <linux/locks.h>
-#include <linux/unistd.h>
 
-#include <asm/system.h>
-#include <asm/uaccess.h>
+#define DEBUG_SUBSYSTEM S_LLITE
 
-#include <linux/fs.h>
-#include <linux/stat.h>
-#include <asm/uaccess.h>
-#include <asm/segment.h>
-
-#define DEBUG_SUBSYSTEM S_LLIGHT
-
-#include <linux/lustre_light.h>
+#include <linux/lustre_lite.h>
+#include <linux/lustre_ha.h>
 
 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;
+extern int ll_commitcbd_setup(struct ll_sb_info *);
+extern int ll_commitcbd_cleanup(struct ll_sb_info *);
 
 static char *ll_read_opt(const char *opt, char *data)
 {
@@ -48,34 +36,29 @@ static char *ll_read_opt(const char *opt, char *data)
         ENTRY;
 
         CDEBUG(D_INFO, "option: %s, data %s\n", opt, data);
-        if ( strncmp(opt, data, strlen(opt)) ) {
-                EXIT;
-                return NULL;
-        }
-        if ( (value = strchr(data, '=')) == NULL ) {
-                EXIT;
-                return NULL;
-        }
+        if ( strncmp(opt, data, strlen(opt)) )
+                RETURN(NULL);
+        if ( (value = strchr(data, '=')) == NULL )
+                RETURN(NULL);
 
         value++;
         OBD_ALLOC(retval, strlen(value) + 1);
         if ( !retval ) {
                 CERROR("out of memory!\n");
-                return NULL;
+                RETURN(NULL);
         }
         
         memcpy(retval, value, strlen(value)+1);
         CDEBUG(D_SUPER, "Assigned option: %s, value %s\n", opt, retval);
-        EXIT;
-        return retval;
+        RETURN(retval);
 }
 
 static void ll_options(char *options, char **dev, char **vers)
 {
         char *this_char;
-        ENTRY; 
+        ENTRY;
 
-        if (!options) { 
+        if (!options) {
                 EXIT;
                 return;
         }
@@ -87,123 +70,140 @@ static void ll_options(char *options, char **dev, char **vers)
                 if ( (!*dev && (*dev = ll_read_opt("device", this_char)))||
                      (!*vers && (*vers = ll_read_opt("version", this_char))) )
                         continue;
-                
         }
         EXIT;
 }
 
-static struct super_block * ll_read_super(struct super_block *sb, 
-                                            void *data, int silent)
+static struct super_block * ll_read_super(struct super_block *sb,
+                                          void *data, int silent)
 {
-        struct inode *root = 0; 
+        struct inode *root = 0;
         struct ll_sb_info *sbi;
         char *device = NULL;
         char *version = NULL;
-        int connected = 0;
         int devno;
         int err;
+        struct ll_fid rootfid;
         struct ptlrpc_request *request = NULL;
 
         ENTRY;
-        MOD_INC_USE_COUNT; 
+        MOD_INC_USE_COUNT;
 
         OBD_ALLOC(sbi, sizeof(*sbi));
-        if (!sbi) { 
-                EXIT;
-                return NULL;
+        if (!sbi) {
+                MOD_DEC_USE_COUNT;
+                RETURN(NULL);
         }
-        memset(sbi, 0, sizeof(*sbi));
+
         sb->u.generic_sbp = sbi;
 
         ll_options(data, &device, &version);
 
         if ( !device ) {
                 CERROR("no device\n");
-                sb = NULL; 
-                goto ERR;
+                GOTO(out_free, sb = NULL);
         }
 
         devno = simple_strtoul(device, NULL, 0);
         if ( devno >= MAX_OBD_DEVICES ) {
                 CERROR("device of %s too high\n", device);
-                sb = NULL; 
-                goto ERR;
-        } 
+                GOTO(out_free, sb = NULL);
+        }
 
         sbi->ll_conn.oc_dev = &obd_dev[devno];
         err = obd_connect(&sbi->ll_conn);
         if ( err ) {
                 CERROR("cannot connect to %s\n", device);
-                sb = NULL; 
-                goto ERR;
+                GOTO(out_free, sb = NULL);
         }
-        connected = 1;
-
-        /* the first parameter should become an mds device no */
-        err = ptlrpc_connect_client(-1, "mds", 
-                                    MDS_REQUEST_PORTAL,
-                                    MDC_REPLY_PORTAL,
-                                    mds_pack_req,
-                                    mds_unpack_rep, 
-                                    &sbi->ll_mds_client);
-        
+
+        ptlrpc_init_client(ptlrpc_connmgr, MDS_REQUEST_PORTAL, MDC_REPLY_PORTAL,
+                           &sbi->ll_mds_client);
+
+        sbi->ll_mds_conn = ptlrpc_uuid_to_connection("mds");
+        if (!sbi->ll_mds_conn) {
+                CERROR("cannot find MDS\n");
+                GOTO(out_disc, sb = NULL);
+        }
+
+        err = connmgr_connect(ptlrpc_connmgr, sbi->ll_mds_conn);
         if (err) {
-                CERROR("cannot find MDS\n");  
-                sb = NULL;
-                goto ERR;
+                CERROR("cannot connect to MDS\n");
+                GOTO(out_disc, sb = NULL);
+        }
+
+        sbi->ll_mds_conn->c_level = LUSTRE_CONN_FULL;
+
+        err= mdc_connect(&sbi->ll_mds_client, sbi->ll_mds_conn, 
+                    &rootfid, &request); 
+        CERROR("rootfid %Ld\n", rootfid.id);
+        if (err) { 
+                CERROR("cannot mds_connect %d\n", err);
+                GOTO(out_disc, sb = NULL);
         }
-        sbi->ll_super = sb;
-        sbi->ll_rootino = 2;
+        sbi->ll_rootino = rootfid.id;
 
-        sb->s_maxbytes = 1LL << 36;
+        sb->s_maxbytes = 1ULL << 36;
         sb->s_blocksize = PAGE_SIZE;
         sb->s_blocksize_bits = (unsigned char)PAGE_SHIFT;
         sb->s_magic = LL_SUPER_MAGIC;
         sb->s_op = &ll_super_operations;
 
         /* make root inode */
-        err = mdc_getattr(&sbi->ll_mds_client, sbi->ll_rootino, S_IFDIR, 
+        err = mdc_getattr(&sbi->ll_mds_client, sbi->ll_mds_conn,
+                          sbi->ll_rootino, S_IFDIR,
                           OBD_MD_FLNOTOBD|OBD_MD_FLBLOCKS, &request);
         if (err) {
                 CERROR("mdc_getattr failed for root %d\n", err);
-                sb = NULL; 
-                goto ERR;
+                GOTO(out_req, sb = NULL);
+        }
+
+        /* initialize committed transaction callback daemon */
+        INIT_LIST_HEAD(&sbi->ll_commitcbd_not_committed);
+        spin_lock_init(&sbi->ll_commitcbd_lock); 
+        init_waitqueue_head(&sbi->ll_commitcbd_waitq);
+        init_waitqueue_head(&sbi->ll_commitcbd_ctl_waitq);
+        sbi->ll_commitcbd_flags = 0;
+        err = ll_commitcbd_setup(sbi);
+        if (err) { 
+                CERROR("failed to start commit callback daemon\n");
+                GOTO(out_req, sb = NULL); 
         }
 
-        root = iget4(sb, sbi->ll_rootino, NULL, request->rq_rep.mds);
+        root = iget4(sb, sbi->ll_rootino, NULL,
+                     lustre_msg_buf(request->rq_repmsg, 0));
         if (root) {
                 sb->s_root = d_alloc_root(root);
         } else {
-                CERROR("lustre_light: bad iget4 for root\n");
-                sb = NULL; 
-                goto ERR;
-        } 
+                CERROR("lustre_lite: bad iget4 for root\n");
+                GOTO(out_req, sb = NULL);
+        }
 
-ERR:
+out_req:
         ptlrpc_free_req(request);
-        if (device)
+        if (!sb) {
+out_disc:
+                obd_disconnect(&sbi->ll_conn);
+out_free:
+                MOD_DEC_USE_COUNT;
+                OBD_FREE(sbi, sizeof(*sbi));
+        }
+        if (device) 
                 OBD_FREE(device, strlen(device) + 1);
         if (version)
                 OBD_FREE(version, strlen(version) + 1);
-        if (!sb && connected) 
-                obd_disconnect(&sbi->ll_conn);
 
-        if (!sb && root) {
-                iput(root);
-        }
-        if (!sb) 
-                MOD_DEC_USE_COUNT;
-
-        EXIT;
-        return sb;
+        RETURN(sb);
 } /* ll_read_super */
 
 static void ll_put_super(struct super_block *sb)
 {
         struct ll_sb_info *sbi = sb->u.generic_sbp;
         ENTRY;
+        ll_commitcbd_cleanup(sbi);
         obd_disconnect(&sbi->ll_conn);
-        OBD_FREE(sb->u.generic_sbp, sizeof(struct ll_sb_info));
+        ptlrpc_put_connection(sbi->ll_mds_conn);
+        OBD_FREE(sb->u.generic_sbp, sizeof(*sbi));
         MOD_DEC_USE_COUNT;
         EXIT;
 } /* ll_put_super */
@@ -222,7 +222,7 @@ static void ll_delete_inode(struct inode *inode)
 
                 err = obd_destroy(ll_i2obdconn(inode), oa); 
                 CDEBUG(D_INODE, "obd destroy of %Ld error %d\n",
-                       oa->o_id, err);
+                       (unsigned long long)oa->o_id, err);
                 obdo_free(oa);
         }
 
@@ -264,7 +264,7 @@ out:
 
 int ll_inode_setattr(struct inode *inode, struct iattr *attr, int do_trunc)
 {
-        struct ptlrpc_request *request;
+        struct ptlrpc_request *request = NULL;
         struct ll_sb_info *sbi = ll_i2sbi(inode);
         int err;
 
@@ -273,14 +273,14 @@ int ll_inode_setattr(struct inode *inode, struct iattr *attr, int do_trunc)
         /* change incore inode */
         ll_attr2inode(inode, attr, do_trunc);
 
-        err = mdc_setattr(&sbi->ll_mds_client, inode, attr, &request);
+        err = mdc_setattr(&sbi->ll_mds_client, sbi->ll_mds_conn, inode, attr,
+                          &request);
         if (err)
                 CERROR("mdc_setattr fails (%d)\n", err);
 
         ptlrpc_free_req(request);
 
-        EXIT;
-        return err;
+        RETURN(err);
 }
 
 int ll_setattr(struct dentry *de, struct iattr *attr)
@@ -292,53 +292,51 @@ static int ll_statfs(struct super_block *sb, struct statfs *buf)
 {
         struct statfs tmp;
         int err;
-
         ENTRY;
 
         err = obd_statfs(ID(sb), &tmp);
         if ( err ) { 
                 CERROR("obd_statfs fails (%d)\n", err);
-                return err;
+                RETURN(err);
         }
         memcpy(buf, &tmp, sizeof(*buf));
         CDEBUG(D_SUPER, "statfs returns avail %ld\n", tmp.f_bavail);
-        EXIT;
 
-        return err; 
+        RETURN(err);
 }
 
-static void inline ll_to_inode(struct inode *dst, struct mds_rep *rep)
+static void inline ll_to_inode(struct inode *dst, struct mds_body *body)
 {
         struct ll_inode_info *ii = 
                 (struct ll_inode_info *) &dst->u.generic_ip;
 
         /* core attributes first */
-        if ( rep->valid & OBD_MD_FLID )
-                dst->i_ino = rep->ino;
-        if ( rep->valid & OBD_MD_FLATIME ) 
-                dst->i_atime = rep->atime;
-        if ( rep->valid & OBD_MD_FLMTIME ) 
-                dst->i_mtime = rep->mtime;
-        if ( rep->valid & OBD_MD_FLCTIME ) 
-                dst->i_ctime = rep->ctime;
-        if ( rep->valid & OBD_MD_FLSIZE ) 
-                dst->i_size = rep->size;
-        if ( rep->valid & OBD_MD_FLMODE ) 
-                dst->i_mode = rep->mode;
-        if ( rep->valid & OBD_MD_FLUID ) 
-                dst->i_uid = rep->uid;
-        if ( rep->valid & OBD_MD_FLGID ) 
-                dst->i_gid = rep->gid;
-        if ( rep->valid & OBD_MD_FLFLAGS ) 
-                dst->i_flags = rep->flags;
-        if ( rep->valid & OBD_MD_FLNLINK )
-                dst->i_nlink = rep->nlink;
-        if ( rep->valid & OBD_MD_FLGENER )
-                dst->i_generation = rep->generation;
+        if ( body->valid & OBD_MD_FLID )
+                dst->i_ino = body->ino;
+        if ( body->valid & OBD_MD_FLATIME ) 
+                dst->i_atime = body->atime;
+        if ( body->valid & OBD_MD_FLMTIME ) 
+                dst->i_mtime = body->mtime;
+        if ( body->valid & OBD_MD_FLCTIME ) 
+                dst->i_ctime = body->ctime;
+        if ( body->valid & OBD_MD_FLSIZE ) 
+                dst->i_size = body->size;
+        if ( body->valid & OBD_MD_FLMODE ) 
+                dst->i_mode = body->mode;
+        if ( body->valid & OBD_MD_FLUID ) 
+                dst->i_uid = body->uid;
+        if ( body->valid & OBD_MD_FLGID ) 
+                dst->i_gid = body->gid;
+        if ( body->valid & OBD_MD_FLFLAGS ) 
+                dst->i_flags = body->flags;
+        if ( body->valid & OBD_MD_FLNLINK )
+                dst->i_nlink = body->nlink;
+        if ( body->valid & OBD_MD_FLGENER )
+                dst->i_generation = body->generation;
 
         /* this will become more elaborate for striping etc */ 
-        if (rep->valid & OBD_MD_FLOBJID) 
-                ii->lli_objid = rep->objid;
+        if (body->valid & OBD_MD_FLOBJID) 
+                ii->lli_objid = body->objid;
 #if 0
 
         if (obdo_has_inline(oa)) {
@@ -359,10 +357,10 @@ static void inline ll_to_inode(struct inode *dst, struct mds_rep *rep)
 
 static inline void ll_read_inode2(struct inode *inode, void *opaque)
 {
-        struct mds_rep *rep = opaque; 
+        struct mds_body *body = opaque; 
         
         ENTRY;
-        ll_to_inode(inode, rep); 
+        ll_to_inode(inode, body); 
 
         /* OIDEBUG(inode); */
 
@@ -382,9 +380,9 @@ static inline void ll_read_inode2(struct inode *inode, void *opaque)
         } else {
                 init_special_inode(inode, inode->i_mode,
                                    ((int *)ll_i2info(inode)->lli_inline)[0]);
+                EXIT;
         }
 
-        EXIT;
         return;
 }
 
@@ -397,31 +395,30 @@ struct super_operations ll_super_operations =
         // statfs: ll_statfs
 };
 
-struct file_system_type lustre_light_fs_type = {
-        "lustre_light", 0, ll_read_super, NULL
+struct file_system_type lustre_lite_fs_type = {
+        "lustre_lite", 0, ll_read_super, NULL
 };
 
-static int __init init_lustre_light(void)
+static int __init init_lustre_lite(void)
 {
-        printk(KERN_INFO "Lustre Light 0.0.1, braam@clusterfs.com\n");
+        printk(KERN_INFO "Lustre Lite 0.0.1, braam@clusterfs.com\n");
         ll_file_data_slab = kmem_cache_create("ll_file_data",
                                               sizeof(struct ll_file_data), 0,
                                                SLAB_HWCACHE_ALIGN, NULL, NULL);
         if (ll_file_data_slab == NULL)
                 return -ENOMEM;
-
-        return register_filesystem(&lustre_light_fs_type);
+        return register_filesystem(&lustre_lite_fs_type);
 }
 
-static void __exit exit_lustre_light(void)
+static void __exit exit_lustre_lite(void)
 {
-        unregister_filesystem(&lustre_light_fs_type);
+        unregister_filesystem(&lustre_lite_fs_type);
         kmem_cache_destroy(ll_file_data_slab);
 }
 
 MODULE_AUTHOR("Peter J. Braam <braam@clusterfs.com>");
-MODULE_DESCRIPTION("Lustre Light Client File System v1.0");
+MODULE_DESCRIPTION("Lustre Lite Client File System v1.0");
 MODULE_LICENSE("GPL");
 
-module_init(init_lustre_light);
-module_exit(exit_lustre_light);
+module_init(init_lustre_lite);
+module_exit(exit_lustre_lite);