X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fliblustre%2Fdir.c;h=9f7797d8e7e1e8483b3b4a440516360c4c60f45a;hb=79e6f0e38a1c532e069246f79cc5ebe1189eb4e9;hp=3b9b0f6abbdaa1768986d7743f1a7037f97b6bf4;hpb=c39489126f88bb5b30643ebb11c72fbe9f9d2241;p=fs%2Flustre-release.git diff --git a/lustre/liblustre/dir.c b/lustre/liblustre/dir.c index 3b9b0f6..9f7797d 100644 --- a/lustre/liblustre/dir.c +++ b/lustre/liblustre/dir.c @@ -30,19 +30,34 @@ #include #include #include -#include +#include #include +#ifdef HAVE_XTIO_H +#include +#endif #include #include #include #include +#ifdef HAVE_FILE_H #include +#endif #undef LIST_HEAD -#include +#ifdef HAVE_ASM_TYPES_H +#include +#elif defined(HAVE_SYS_TYPES_H) +#include +#endif + +#ifdef HAVE_LINUX_UNISTD_H #include +#elif defined(HAVE_UNISTD_H) +#include +#endif + #include #include "llite_lib.h" @@ -50,6 +65,7 @@ static int llu_dir_do_readpage(struct inode *inode, struct page *page) { struct llu_inode_info *lli = llu_i2info(inode); + struct intnl_stat *st = llu_i2stat(inode); struct llu_sb_info *sbi = llu_i2sbi(inode); struct ll_fid mdc_fid; __u64 offset; @@ -61,19 +77,19 @@ static int llu_dir_do_readpage(struct inode *inode, struct page *page) struct mdc_op_data data; struct obd_device *obddev = class_exp2obd(sbi->ll_mdc_exp); struct ldlm_res_id res_id = - { .name = {lli->lli_st_ino, (__u64)lli->lli_st_generation} }; + { .name = {st->st_ino, (__u64)lli->lli_st_generation} }; ldlm_policy_data_t policy = { .l_inodebits = { MDS_INODELOCK_UPDATE } }; ENTRY; rc = ldlm_lock_match(obddev->obd_namespace, LDLM_FL_BLOCK_GRANTED, - &res_id, LDLM_IBITS, &policy, LCK_PR, &lockh); + &res_id, LDLM_IBITS, &policy, LCK_CR, &lockh); if (!rc) { llu_prepare_mdc_op_data(&data, inode, NULL, NULL, 0, 0); - rc = mdc_enqueue(sbi->ll_mdc_exp, LDLM_IBITS, &it, LCK_PR, + rc = mdc_enqueue(sbi->ll_mdc_exp, LDLM_IBITS, &it, LCK_CR, &data, &lockh, NULL, 0, ldlm_completion_ast, llu_mdc_blocking_ast, - inode); + inode, LDLM_FL_CANCEL_ON_BLOCK); request = (struct ptlrpc_request *)it.d.lustre.it_data; if (request) ptlrpc_req_finished(request); @@ -84,28 +100,30 @@ static int llu_dir_do_readpage(struct inode *inode, struct page *page) } ldlm_lock_dump_handle(D_OTHER, &lockh); - mdc_pack_fid(&mdc_fid, lli->lli_st_ino, lli->lli_st_generation, S_IFDIR); + mdc_pack_fid(&mdc_fid, st->st_ino, lli->lli_st_generation, S_IFDIR); - offset = page->index << PAGE_SHIFT; + offset = (__u64)page->index << CFS_PAGE_SHIFT; rc = mdc_readpage(sbi->ll_mdc_exp, &mdc_fid, offset, page, &request); if (!rc) { - body = lustre_msg_buf(request->rq_repmsg, 0, sizeof (*body)); - LASSERT (body != NULL); /* checked by mdc_readpage() */ - LASSERT_REPSWABBED (request, 0); /* swabbed by mdc_readpage() */ + body = lustre_msg_buf(request->rq_repmsg, REPLY_REC_OFF, + sizeof(*body)); + LASSERT(body != NULL); /* checked by mdc_readpage() */ + /* swabbed by mdc_readpage() */ + LASSERT_REPSWABBED(request, REPLY_REC_OFF); - lli->lli_st_size = body->size; + st->st_size = body->size; } else { CERROR("read_dir_page(%ld) error %d\n", page->index, rc); } ptlrpc_req_finished(request); EXIT; - ldlm_lock_decref(&lockh, LCK_PR); + ldlm_lock_decref(&lockh, LCK_CR); return rc; } -static struct page *llu_dir_read_page(struct inode *ino, int pgidx) +static struct page *llu_dir_read_page(struct inode *ino, unsigned long pgidx) { struct page *page; int rc; @@ -165,9 +183,11 @@ static int filldir(char *buf, int buflen, return 1; dirent->d_ino = ino; - dirent->d_off = offset, + dirent->d_off = offset; dirent->d_reclen = reclen; +#ifndef _AIX dirent->d_type = (unsigned short) d_type; +#endif memcpy(dirent->d_name, name, namelen); dirent->d_name[namelen] = 0; @@ -176,27 +196,29 @@ static int filldir(char *buf, int buflen, return 0; } -ssize_t llu_iop_getdirentries(struct inode *ino, char *buf, size_t nbytes, - _SYSIO_OFF_T *basep) +ssize_t llu_iop_filldirentries(struct inode *ino, _SYSIO_OFF_T *basep, + char *buf, size_t nbytes) { struct llu_inode_info *lli = llu_i2info(ino); + struct intnl_stat *st = llu_i2stat(ino); loff_t pos = *basep, offset; - int maxpages, pgidx, filled = 0; + int filled = 0; + unsigned long pgidx, maxpages; ENTRY; - if (lli->lli_st_size == 0) { + liblustre_wait_event(0); + + if (st->st_size == 0) { CWARN("dir size is 0?\n"); RETURN(0); } - liblustre_wait_event(0); - if (pos == -1) pos = lli->lli_dir_pos; - maxpages = (lli->lli_st_size + PAGE_SIZE - 1) >> PAGE_SHIFT; - pgidx = pos >> PAGE_SHIFT; - offset = pos & ~PAGE_MASK; + maxpages = (st->st_size + CFS_PAGE_SIZE - 1) >> CFS_PAGE_SHIFT; + pgidx = pos >> CFS_PAGE_SHIFT; + offset = pos & ~CFS_PAGE_MASK; for ( ; pgidx < maxpages ; pgidx++, offset = 0) { struct page *page; @@ -208,11 +230,11 @@ ssize_t llu_iop_getdirentries(struct inode *ino, char *buf, size_t nbytes, continue; /* size might have been updated by mdc_readpage */ - maxpages = (lli->lli_st_size + PAGE_SIZE - 1) >> PAGE_SHIFT; + maxpages = (st->st_size + CFS_PAGE_SIZE - 1) >> CFS_PAGE_SHIFT; /* fill in buffer */ addr = page->addr; - limit = addr + PAGE_SIZE - EXT2_DIR_REC_LEN(1); + limit = addr + CFS_PAGE_SIZE - EXT2_DIR_REC_LEN(1); de = (struct ext2_dirent *) (addr + offset); for ( ; (char*) de <= limit; de = ext2_next_entry(de)) { @@ -225,7 +247,8 @@ ssize_t llu_iop_getdirentries(struct inode *ino, char *buf, size_t nbytes, offset = (char*) de - addr; over = filldir(buf, nbytes, de->name, de->name_len, - (pgidx << PAGE_SHIFT) | offset, + (((__u64)pgidx << CFS_PAGE_SHIFT) | offset) + + le16_to_cpu(de->rec_len), le32_to_cpu(de->inode), d_type, &filled); if (over) { free_page(page); @@ -237,7 +260,8 @@ ssize_t llu_iop_getdirentries(struct inode *ino, char *buf, size_t nbytes, free_page(page); } done: - lli->lli_dir_pos = pgidx << PAGE_SHIFT | offset; + lli->lli_dir_pos = (__u64)pgidx << CFS_PAGE_SHIFT | offset; *basep = lli->lli_dir_pos; + liblustre_wait_event(0); RETURN(filled); }