Whamcloud - gitweb
LU-761: Check return of ll_prep_md_op_data() using IS_ERR().
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index abff420..713d581 100644 (file)
@@ -140,8 +140,8 @@ static struct ll_sb_info *ll_init_sbi(void)
 
         /* metadata statahead is enabled by default */
         sbi->ll_sa_max = LL_SA_RPC_DEF;
-        atomic_set(&sbi->ll_sa_total, 0);
-        atomic_set(&sbi->ll_sa_wrong, 0);
+        cfs_atomic_set(&sbi->ll_sa_total, 0);
+        cfs_atomic_set(&sbi->ll_sa_wrong, 0);
 
         RETURN(sbi);
 }
@@ -207,10 +207,10 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
 
         /* indicate the features supported by this client */
         data->ocd_connect_flags = OBD_CONNECT_IBITS    | OBD_CONNECT_NODEVOH  |
-                                  OBD_CONNECT_JOIN     | OBD_CONNECT_ATTRFID  |
+                                  OBD_CONNECT_ATTRFID  |
                                   OBD_CONNECT_VERSION  | OBD_CONNECT_BRW_SIZE |
                                   OBD_CONNECT_MDS_CAPA | OBD_CONNECT_OSS_CAPA |
-                                  OBD_CONNECT_CANCELSET| OBD_CONNECT_FID      |
+                                  OBD_CONNECT_CANCELSET | OBD_CONNECT_FID     |
                                   OBD_CONNECT_AT       | OBD_CONNECT_LOV_V3   |
                                   OBD_CONNECT_RMT_CLIENT | OBD_CONNECT_VBR    |
                                   OBD_CONNECT_FULL20   | OBD_CONNECT_64BITHASH;
@@ -279,6 +279,30 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
         if (err)
                 GOTO(out_md_fid, err);
 
+        /* This needs to be after statfs to ensure connect has finished.
+         * Note that "data" does NOT contain the valid connect reply.
+         * If connecting to a 1.8 server there will be no LMV device, so
+         * we can access the MDC export directly and exp_connect_flags will
+         * be non-zero, but if accessing an upgraded 2.1 server it will
+         * have the correct flags filled in.
+         * XXX: fill in the LMV exp_connect_flags from MDC(s). */
+        valid = sbi->ll_md_exp->exp_connect_flags & CLIENT_CONNECT_MDT_REQD;
+        if (sbi->ll_md_exp->exp_connect_flags != 0 &&
+            valid != CLIENT_CONNECT_MDT_REQD) {
+                char *buf;
+
+                OBD_ALLOC_WAIT(buf, CFS_PAGE_SIZE);
+                obd_connect_flags2str(buf, CFS_PAGE_SIZE,
+                                      valid ^ CLIENT_CONNECT_MDT_REQD, ",");
+                LCONSOLE_ERROR_MSG(0x170, "Server %s does not support "
+                                   "feature(s) needed for correct operation "
+                                   "of this client (%s). Please upgrade "
+                                   "server or downgrade client.\n",
+                                   sbi->ll_md_exp->exp_obd->obd_name, buf);
+                OBD_FREE(buf, CFS_PAGE_SIZE);
+                GOTO(out_md, err = -EPROTO);
+        }
+
         size = sizeof(*data);
         err = obd_get_info(sbi->ll_md_exp, sizeof(KEY_CONN_DATA),
                            KEY_CONN_DATA,  &size, data, NULL);
@@ -387,8 +411,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                 if (OBD_FAIL_CHECK(OBD_FAIL_OSC_CKSUM_ADLER_ONLY))
                         data->ocd_cksum_types = OBD_CKSUM_ADLER;
                 else
-                        /* send the list of supported checksum types */
-                        data->ocd_cksum_types = OBD_CKSUM_ALL;
+                        data->ocd_cksum_types = cksum_types_supported();
         }
 
 #ifdef HAVE_LRU_RESIZE_SUPPORT
@@ -473,7 +496,6 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt,
                 CERROR("md_getattr failed for root: rc = %d\n", err);
                 GOTO(out_lock_cn_cb, err);
         }
-        memset(&lmd, 0, sizeof(lmd));
         err = md_get_lustre_md(sbi->ll_md_exp, request, sbi->ll_dt_exp,
                                sbi->ll_md_exp, &lmd);
         if (err) {
@@ -851,6 +873,7 @@ void ll_lli_init(struct ll_inode_info *lli)
         cfs_sema_init(&lli->lli_rmtperm_sem, 1);
         CFS_INIT_LIST_HEAD(&lli->lli_oss_capas);
         cfs_spin_lock_init(&lli->lli_sa_lock);
+        lli->lli_clob = NULL;
         cfs_sema_init(&lli->lli_readdir_sem, 1);
         fid_zero(&lli->lli_pfid);
 }
@@ -860,7 +883,9 @@ static inline int ll_bdi_register(struct backing_dev_info *bdi)
 #ifdef HAVE_BDI_REGISTER
         static atomic_t ll_bdi_num = ATOMIC_INIT(0);
 
+#ifdef HAVE_BDI_NAME
         bdi->name = "lustre";
+#endif
         return bdi_register(bdi, NULL, "lustre-%d",
                             atomic_inc_return(&ll_bdi_num));
 #else
@@ -876,7 +901,8 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
         char  *dt = NULL, *md = NULL;
         char  *profilenm = get_profile_name(sb);
         struct config_llog_instance *cfg;
-        const int instlen = sizeof(cfg->cfg_instance) * 2 + 1;
+        /* %p for void* in printf needs 16+2 characters: 0xffffffffffffffff */
+        const int instlen = sizeof(cfg->cfg_instance) * 2 + 2;
         int    err;
         ENTRY;
 
@@ -937,12 +963,12 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
         CDEBUG(D_CONFIG, "Found profile %s: mdc=%s osc=%s\n", profilenm,
                lprof->lp_md, lprof->lp_dt);
 
-        OBD_ALLOC(dt, strlen(lprof->lp_dt) + instlen);
+        OBD_ALLOC(dt, strlen(lprof->lp_dt) + instlen + 2);
         if (!dt)
                 GOTO(out_free, err = -ENOMEM);
         sprintf(dt, "%s-%p", lprof->lp_dt, cfg->cfg_instance);
 
-        OBD_ALLOC(md, strlen(lprof->lp_md) + instlen);
+        OBD_ALLOC(md, strlen(lprof->lp_md) + instlen + 2);
         if (!md)
                 GOTO(out_free, err = -ENOMEM);
         sprintf(md, "%s-%p", lprof->lp_md, cfg->cfg_instance);
@@ -952,9 +978,9 @@ int ll_fill_super(struct super_block *sb, struct vfsmount *mnt)
 
 out_free:
         if (md)
-                OBD_FREE(md, strlen(lprof->lp_md) + instlen);
+                OBD_FREE(md, strlen(lprof->lp_md) + instlen + 2);
         if (dt)
-                OBD_FREE(dt, strlen(lprof->lp_dt) + instlen);
+                OBD_FREE(dt, strlen(lprof->lp_dt) + instlen + 2);
         if (err)
                 ll_put_super(sb);
         else
@@ -1700,8 +1726,8 @@ void ll_read_inode2(struct inode *inode, void *opaque)
         struct ll_inode_info *lli = ll_i2info(inode);
         ENTRY;
 
-        CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n",
-               inode->i_ino, inode->i_generation, inode);
+        CDEBUG(D_VFSTRACE, "VFS Op:inode="DFID"(%p)\n",
+               PFID(&lli->lli_fid), inode);
 
         ll_lli_init(lli);
 
@@ -1792,8 +1818,8 @@ int ll_iocontrol(struct inode *inode, struct file *file,
                 op_data = ll_prep_md_op_data(NULL, inode, NULL, NULL,
                                              0, 0, LUSTRE_OPC_ANY,
                                              NULL);
-                if (op_data == NULL)
-                        RETURN(-ENOMEM);
+                if (IS_ERR(op_data))
+                        RETURN(PTR_ERR(op_data));
 
                 op_data->op_valid = OBD_MD_FLFLAGS;
                 rc = md_getattr(sbi->ll_md_exp, op_data, &req);
@@ -2003,8 +2029,6 @@ int ll_prep_inode(struct inode **inode,
 
         LASSERT(*inode || sb);
         sbi = sb ? ll_s2sbi(sb) : ll_i2sbi(*inode);
-        memset(&md, 0, sizeof(struct lustre_md));
-
         rc = md_get_lustre_md(sbi->ll_md_exp, req, sbi->ll_dt_exp,
                               sbi->ll_md_exp, &md);
         if (rc)