X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fliblustre%2Ffile.c;h=5a302990890147d2a761c7bfa02b52bd6ea28f0b;hb=9d72ec94b56590ad5da7003e93dd268d81fc8d14;hp=c23a27db1dd40df42603503a70af583a796593a5;hpb=e3a7c58aebafce40323db54bf6056029e5af4a70;p=fs%2Flustre-release.git diff --git a/lustre/liblustre/file.c b/lustre/liblustre/file.c index c23a27d..5a30299 100644 --- a/lustre/liblustre/file.c +++ b/lustre/liblustre/file.c @@ -27,7 +27,7 @@ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, Whamcloud, Inc. + * Copyright (c) 2011, 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -40,15 +40,23 @@ #define DEBUG_SUBSYSTEM S_LLITE -#include +#include +#include #include -#include -#include -#include #include -#include -#include - +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include "llite_lib.h" /* Pack the required supplementary groups into the supplied groups array. @@ -57,22 +65,22 @@ * array in case it might be useful. Not needed if doing an MDS-side upcall. */ void ll_i2gids(__u32 *suppgids, struct inode *i1, struct inode *i2) { - LASSERT(i1 != NULL); - LASSERT(suppgids != NULL); - - if (cfs_curproc_is_in_groups(i1->i_stbuf.st_gid)) - suppgids[0] = i1->i_stbuf.st_gid; - else - suppgids[0] = -1; - - if (i2) { - if (cfs_curproc_is_in_groups(i2->i_stbuf.st_gid)) - suppgids[1] = i2->i_stbuf.st_gid; - else - suppgids[1] = -1; - } else { - suppgids[1] = -1; - } + LASSERT(i1 != NULL); + LASSERT(suppgids != NULL); + + if (in_group_p(i1->i_stbuf.st_gid)) + suppgids[0] = i1->i_stbuf.st_gid; + else + suppgids[0] = -1; + + if (i2) { + if (in_group_p(i2->i_stbuf.st_gid)) + suppgids[1] = i2->i_stbuf.st_gid; + else + suppgids[1] = -1; + } else { + suppgids[1] = -1; + } } void llu_prep_md_op_data(struct md_op_data *op_data, struct inode *i1, @@ -95,7 +103,6 @@ void llu_prep_md_op_data(struct md_op_data *op_data, struct inode *i1, else fid_zero(&op_data->op_fid2); - op_data->op_opc = opc; op_data->op_name = name; op_data->op_mode = mode; op_data->op_namelen = namelen; @@ -173,8 +180,7 @@ int llu_local_open(struct llu_inode_info *lli, struct lookup_intent *it) fd->fd_mds_och.och_fid = lli->lli_fid; lli->lli_file_data = fd; llu_ioepoch_open(lli, body->ioepoch); - md_set_open_replay_data(lli->lli_sbi->ll_md_exp, - &fd->fd_mds_och, it->d.lustre.it_data); + md_set_open_replay_data(lli->lli_sbi->ll_md_exp, &fd->fd_mds_och, it); RETURN(0); } @@ -186,7 +192,6 @@ int llu_iop_open(struct pnode *pnode, int flags, mode_t mode) struct intnl_stat *st = llu_i2stat(inode); struct ptlrpc_request *request; struct lookup_intent *it; - struct lov_stripe_md *lsm; int rc = 0; ENTRY; @@ -214,11 +219,15 @@ int llu_iop_open(struct pnode *pnode, int flags, mode_t mode) if (!S_ISREG(st->st_mode)) GOTO(out_release, rc = 0); - lsm = lli->lli_smd; - if (lsm) - flags &= ~O_LOV_DELAY_CREATE; - /*XXX: open_flags are overwritten and the previous ones are lost */ - lli->lli_open_flags = flags & ~(O_CREAT | O_EXCL | O_TRUNC); + if (lli->lli_has_smd && cl_is_lov_delay_create(flags)) { + /* a bit ugly, but better than changing the open() API */ + unsigned int tmp_flags = flags; + + cl_lov_delay_create_clear(&tmp_flags); + flags = tmp_flags; + } + /*XXX: open_flags are overwritten and the previous ones are lost */ + lli->lli_open_flags = flags & ~(O_CREAT | O_EXCL | O_TRUNC); out_release: request = it->d.lustre.it_data; @@ -284,8 +293,7 @@ int llu_objects_destroy(struct ptlrpc_request *req, struct inode *dir) if (oa == NULL) GOTO(out_free_memmd, rc = -ENOMEM); - oa->o_id = lsm->lsm_object_id; - oa->o_seq = lsm->lsm_object_seq; + oa->o_oi = lsm->lsm_oi; oa->o_mode = body->mode & S_IFMT; oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLGROUP; obdo_set_parent_fid(oa, &llu_i2info(dir)->lli_fid); @@ -302,15 +310,15 @@ int llu_objects_destroy(struct ptlrpc_request *req, struct inode *dir) } } - rc = obd_destroy(llu_i2obdexp(dir), oa, lsm, &oti, NULL, NULL); - OBDO_FREE(oa); - if (rc) - CERROR("obd destroy objid 0x"LPX64" error %d\n", - lsm->lsm_object_id, rc); - out_free_memmd: - obd_free_memmd(llu_i2obdexp(dir), &lsm); - out: - return rc; + rc = obd_destroy(NULL, llu_i2obdexp(dir), oa, lsm, &oti, NULL, NULL); + OBDO_FREE(oa); + if (rc) + CERROR("obd destroy objid "DOSTID" error %d\n", + POSTID(&lsm->lsm_oi), rc); +out_free_memmd: + obd_free_memmd(llu_i2obdexp(dir), &lsm); +out: + return rc; } /** Cliens updates SOM attributes on MDS: obd_getattr and md_setattr. */ @@ -335,10 +343,7 @@ int llu_som_update(struct inode *inode, struct md_op_data *op_data) old_flags & MF_GETATTR_LOCK); if (rc) { oa.o_valid = 0; - if (rc == -ENOENT) - CDEBUG(D_INODE, "objid "LPX64" is destroyed\n", - lli->lli_smd->lsm_object_id); - else + if (rc != -ENOENT) CERROR("inode_getattr failed (%d): unable to " "send a Size-on-MDS attribute update " "for inode %llu/%lu\n", rc,