Whamcloud - gitweb
add an assert, from alex.
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index 8c625cd..d0ca61d 100644 (file)
@@ -263,15 +263,23 @@ static int lustre_connect_ost(struct super_block *sb, char *lov,
                 RETURN(err);
         }
 
-        if (pag) {
+        /* FIXME Because of the async nature of file i/o, we never know
+         * who is actually dirty the pages; and any process have chance
+         * to trigger dirty-flushing within its own process context. So
+         * for simplicity we simply use root's credential, we suppose root
+         * always have credential.
+         */
+        if (pag)
                 sec_flags = PTLRPC_SEC_FL_PAG;
-                err = obd_set_info(obd->obd_self_export,
-                                   strlen("sec_flags"), "sec_flags",
-                                   sizeof(sec_flags), &sec_flags);
-                if (err) {
-                        OBD_FREE(data, sizeof(*data));
-                        RETURN(err);
-                }
+        else
+                sec_flags = PTLRPC_SEC_FL_OSS;
+
+        err = obd_set_info(obd->obd_self_export,
+                           strlen("sec_flags"), "sec_flags",
+                           sizeof(sec_flags), &sec_flags);
+        if (err) {
+                OBD_FREE(data, sizeof(*data));
+                RETURN(err);
         }
 
         err = obd_connect(&dt_conn, obd, &sbi->ll_sb_uuid, data, 0);
@@ -583,6 +591,8 @@ void ll_lli_init(struct ll_inode_info *lli)
         lli->lli_audit_mask = AUDIT_OFF;
         lli->lli_key_info = NULL;
         init_waitqueue_head(&lli->lli_dirty_wait);
+        lli->lli_io_epoch = 0;
+        INIT_LIST_HEAD(&lli->lli_capas);
 }
 
 int ll_fill_super(struct super_block *sb, void *data, int silent)
@@ -1144,6 +1154,7 @@ void ll_clear_inode(struct inode *inode)
         struct lustre_id id;
         struct ll_inode_info *lli = ll_i2info(inode);
         struct ll_sb_info *sbi = ll_i2sbi(inode);
+        struct obd_capa *ocapa, *tmp;
         ENTRY;
 
         CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p)\n", inode->i_ino,
@@ -1197,10 +1208,10 @@ void ll_clear_inode(struct inode *inode)
                 lli->lli_remote_acl = NULL;
         }
 
-        if (lli->lli_trunc_capa) {
-                OBD_FREE(lli->lli_trunc_capa, sizeof(struct lustre_capa));
-                lli->lli_trunc_capa = NULL;
-        }
+        list_for_each_entry_safe(ocapa, tmp, &lli->lli_capas, u.client.lli_list)
+                capa_put(ocapa);
+
+        LASSERT(!mapping_has_pages(inode->i_mapping));
 
         lli->lli_inode_magic = LLI_INODE_DEAD;
         EXIT;
@@ -1226,7 +1237,6 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr)
         struct ll_sb_info *sbi = ll_i2sbi(inode);
         struct ptlrpc_request *request = NULL;
         struct mdc_op_data *op_data;
-        struct lustre_capa *trunc_capa = NULL;
         int ia_valid = attr->ia_valid;
         int err, rc = 0;
         ENTRY;
@@ -1313,21 +1323,11 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr)
                 }
 
                 if (attr->ia_valid & ATTR_SIZE) {
-                        /* XXX: hack for truncate capa */
-                        rc = mdc_req2lustre_capa(request, 0, &trunc_capa);
+                        rc = ll_set_trunc_capa(request, 0, inode);
                         if (rc) {
                                 ptlrpc_req_finished(request);
                                 RETURN(rc);
                         }
-
-                        spin_lock(&lli->lli_lock);
-                        if (trunc_capa) {
-                                if (lli->lli_trunc_capa)
-                                        OBD_FREE(lli->lli_trunc_capa,
-                                                 sizeof(*trunc_capa));
-                                lli->lli_trunc_capa = trunc_capa;
-                        }
-                        spin_unlock(&lli->lli_lock);
                 }
 
                 /* We call inode_setattr to adjust timestamps, but we first
@@ -1449,7 +1449,7 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr)
 
                 obdo_from_inode(oa, inode, OBD_MD_FLTYPE | OBD_MD_FLATIME |
                                 OBD_MD_FLMTIME | OBD_MD_FLCTIME);
-                rc = obd_setattr(sbi->ll_dt_exp, oa, lsm, NULL);
+                rc = obd_setattr(sbi->ll_dt_exp, oa, lsm, NULL, NULL);
                 obdo_free(oa);
                 if (rc)
                         CERROR("obd_setattr fails: rc = %d\n", rc);
@@ -2303,7 +2303,7 @@ int ll_iocontrol(struct inode *inode, struct file *file,
                 oa->o_valid = OBD_MD_FLID | OBD_MD_FLFLAGS | OBD_MD_FLGROUP 
                               | OBD_MD_FLIFID;
 
-                rc = obd_setattr(sbi->ll_dt_exp, oa, lsm, NULL);
+                rc = obd_setattr(sbi->ll_dt_exp, oa, lsm, NULL, NULL);
                 obdo_free(oa);
                 if (rc) {
                         if (rc != -EPERM && rc != -EACCES)