X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fllite_close.c;h=28f5b0726db3d207d270bb13a956553d2ebc1251;hb=0a714ba01bbcdb43fa2d07e88652be2b8fb1c52f;hp=1c973b600162227bded755854270c8516594d6d1;hpb=6869932b552ac705f411de3362f01bd50c1f6f7d;p=fs%2Flustre-release.git diff --git a/lustre/llite/llite_close.c b/lustre/llite/llite_close.c index 1c973b6..28f5b07 100644 --- a/lustre/llite/llite_close.c +++ b/lustre/llite/llite_close.c @@ -46,55 +46,58 @@ #include #include "llite_internal.h" -/* record that a write is in flight */ -void llap_write_pending(struct inode *inode, struct ll_async_page *llap) +/** records that a write is in flight */ +void vvp_write_pending(struct ccc_object *club, struct ccc_page *page) { - struct ll_inode_info *lli = ll_i2info(inode); + struct ll_inode_info *lli = ll_i2info(club->cob_inode); ENTRY; spin_lock(&lli->lli_lock); lli->lli_flags |= LLIF_SOM_DIRTY; - if (llap && list_empty(&llap->llap_pending_write)) - list_add(&llap->llap_pending_write, - &lli->lli_pending_write_llaps); + if (page != NULL && list_empty(&page->cpg_pending_linkage)) + list_add(&page->cpg_pending_linkage, &club->cob_pending_list); spin_unlock(&lli->lli_lock); EXIT; } -/* record that a write has completed */ -int llap_write_complete(struct inode *inode, struct ll_async_page *llap) +/** records that a write has completed */ +void vvp_write_complete(struct ccc_object *club, struct ccc_page *page) { - struct ll_inode_info *lli = ll_i2info(inode); + struct ll_inode_info *lli = ll_i2info(club->cob_inode); int rc = 0; - + ENTRY; spin_lock(&lli->lli_lock); - if (llap && !list_empty(&llap->llap_pending_write)) { - list_del_init(&llap->llap_pending_write); + if (page != NULL && !list_empty(&page->cpg_pending_linkage)) { + list_del_init(&page->cpg_pending_linkage); rc = 1; } spin_unlock(&lli->lli_lock); - RETURN(rc); + if (rc) + ll_queue_done_writing(club->cob_inode, 0); + EXIT; } -/* Queue DONE_WRITING if +/** Queues DONE_WRITING if * - done writing is allowed; * - inode has no no dirty pages; */ void ll_queue_done_writing(struct inode *inode, unsigned long flags) { struct ll_inode_info *lli = ll_i2info(inode); + struct ccc_object *club = cl2ccc(ll_i2info(inode)->lli_clob); + ENTRY; spin_lock(&lli->lli_lock); lli->lli_flags |= flags; if ((lli->lli_flags & LLIF_DONE_WRITING) && - list_empty(&lli->lli_pending_write_llaps)) { + list_empty(&club->cob_pending_list)) { struct ll_close_queue *lcq = ll_i2sbi(inode)->ll_lcq; if (lli->lli_flags & LLIF_MDS_SIZE_LOCK) CWARN("ino %lu/%u(flags %lu) som valid it just after " "recovery\n", - inode->i_ino, inode->i_generation, + inode->i_ino, inode->i_generation, lli->lli_flags); /* DONE_WRITING is allowed and inode has no dirty page. */ spin_lock(&lcq->lcq_lock); @@ -116,18 +119,20 @@ void ll_queue_done_writing(struct inode *inode, unsigned long flags) spin_unlock(&lcq->lcq_lock); } spin_unlock(&lli->lli_lock); + EXIT; } -/* Close epoch and send Size-on-MDS attribute update if possible. - * Call this under @lli->lli_lock spinlock. */ +/** Closes epoch and sends Size-on-MDS attribute update if possible. Call + * this under ll_inode_info::lli_lock spinlock. */ void ll_epoch_close(struct inode *inode, struct md_op_data *op_data, struct obd_client_handle **och, unsigned long flags) { struct ll_inode_info *lli = ll_i2info(inode); + struct ccc_object *club = cl2ccc(ll_i2info(inode)->lli_clob); ENTRY; spin_lock(&lli->lli_lock); - if (!(list_empty(&lli->lli_pending_write_llaps))) { + if (!(list_empty(&club->cob_pending_list))) { if (!(lli->lli_flags & LLIF_EPOCH_PENDING)) { LASSERT(*och != NULL); LASSERT(lli->lli_pending_och == NULL); @@ -140,7 +145,7 @@ void ll_epoch_close(struct inode *inode, struct md_op_data *op_data, inode = igrab(inode); LASSERT(inode); GOTO(out, 0); - } + } if (flags & LLIF_DONE_WRITING) { /* Some pages are still dirty, it is early to send * DONE_WRITE. Wait untill all pages will be flushed @@ -179,7 +184,7 @@ void ll_epoch_close(struct inode *inode, struct md_op_data *op_data, } } - LASSERT(list_empty(&lli->lli_pending_write_llaps)); + LASSERT(list_empty(&club->cob_pending_list)); lli->lli_flags &= ~LLIF_SOM_DIRTY; spin_unlock(&lli->lli_lock); op_data->op_flags |= MF_SOM_CHANGE; @@ -190,7 +195,7 @@ void ll_epoch_close(struct inode *inode, struct md_op_data *op_data, "recovery\n", inode->i_ino, inode->i_generation, lli->lli_flags); - if (!ll_local_size(inode)) { + if (!cl_local_size(inode)) { /* Send Size-on-MDS Attributes if valid. Atime is sent along * with all the attributes. */ op_data->op_attr.ia_valid |= ATTR_MTIME_SET | ATTR_CTIME_SET | @@ -201,15 +206,15 @@ out: return; } -int ll_sizeonmds_update(struct inode *inode, struct md_open_data *mod, - struct lustre_handle *fh, __u64 ioepoch) +int ll_sizeonmds_update(struct inode *inode, struct lustre_handle *fh, + __u64 ioepoch) { struct ll_inode_info *lli = ll_i2info(inode); struct md_op_data *op_data; struct obdo *oa; int rc; ENTRY; - + /* LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK)); */ /* After recovery that can be valid. */ if (lli->lli_flags & LLIF_MDS_SIZE_LOCK) @@ -242,7 +247,7 @@ int ll_sizeonmds_update(struct inode *inode, struct md_open_data *mod, op_data->op_ioepoch = ioepoch; op_data->op_flags |= MF_SOM_CHANGE; - rc = ll_md_setattr(inode, op_data, &mod); + rc = ll_md_setattr(inode, op_data, NULL); EXIT; out: if (oa) @@ -252,7 +257,8 @@ out: return rc; } -/* Send a DONE_WRITING rpc, pack Size-on-MDS attributes into it, if possible */ +/** Sends a DONE_WRITING rpc, packs Size-on-MDS attributes into it, if + * possible */ static void ll_done_writing(struct inode *inode) { struct obd_client_handle *och = NULL; @@ -261,7 +267,7 @@ static void ll_done_writing(struct inode *inode) ENTRY; LASSERT(ll_i2mdexp(inode)->exp_connect_flags & OBD_CONNECT_SOM); - + OBD_ALLOC_PTR(op_data); if (op_data == NULL) { CERROR("can't allocate op_data\n"); @@ -273,15 +279,15 @@ static void ll_done_writing(struct inode *inode) /* If there is no @och, we do not do D_W yet. */ if (och == NULL) GOTO(out, 0); - + ll_pack_inode2opdata(inode, op_data, &och->och_fh); - rc = md_done_writing(ll_i2sbi(inode)->ll_md_exp, op_data, och->och_mod); + rc = md_done_writing(ll_i2sbi(inode)->ll_md_exp, op_data, NULL); if (rc == -EAGAIN) { - /* MDS has instructed us to obtain Size-on-MDS attribute from + /* MDS has instructed us to obtain Size-on-MDS attribute from * OSTs and send setattr to back to MDS. */ - rc = ll_sizeonmds_update(inode, och->och_mod, - &och->och_fh, op_data->op_ioepoch); + rc = ll_sizeonmds_update(inode, &och->och_fh, + op_data->op_ioepoch); } else if (rc) { CERROR("inode %lu mdc done_writing failed: rc = %d\n", inode->i_ino, rc); @@ -322,7 +328,7 @@ static int ll_close_thread(void *arg) snprintf(name, sizeof(name) - 1, "ll_close"); cfs_daemonize(name); } - + complete(&lcq->lcq_comp); while (1) {