static inline __u64 mds_pack_open_flags(__u64 flags) { __u64 cr_flags = (flags & (FMODE_READ | FMODE_WRITE | MDS_OPEN_FL_INTERNAL)); if (flags & O_CREAT) cr_flags |= MDS_OPEN_CREAT; if (flags & O_EXCL) cr_flags |= MDS_OPEN_EXCL; if (flags & O_TRUNC) cr_flags |= MDS_OPEN_TRUNC; if (flags & O_APPEND) cr_flags |= MDS_OPEN_APPEND; if (flags & O_SYNC) cr_flags |= MDS_OPEN_SYNC; if (flags & O_DIRECTORY) cr_flags |= MDS_OPEN_DIRECTORY; #ifdef FMODE_EXEC if (flags & FMODE_EXEC) cr_flags |= MDS_FMODE_EXEC; #endif if (cl_is_lov_delay_create(flags)) cr_flags |= MDS_OPEN_DELAY_CREATE; if (flags & O_NONBLOCK) cr_flags |= MDS_OPEN_NORESTORE; return cr_flags; }
static __u64 mds_pack_open_flags(__u64 flags, __u32 mode) { __u64 cr_flags = (flags & (FMODE_READ | FMODE_WRITE | MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS | MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK | MDS_OPEN_BY_FID | MDS_OPEN_LEASE | MDS_OPEN_RELEASE)); if (flags & O_CREAT) cr_flags |= MDS_OPEN_CREAT; if (flags & O_EXCL) cr_flags |= MDS_OPEN_EXCL; if (flags & O_TRUNC) cr_flags |= MDS_OPEN_TRUNC; if (flags & O_APPEND) cr_flags |= MDS_OPEN_APPEND; if (flags & O_SYNC) cr_flags |= MDS_OPEN_SYNC; if (flags & O_DIRECTORY) cr_flags |= MDS_OPEN_DIRECTORY; #ifdef FMODE_EXEC if (flags & FMODE_EXEC) cr_flags |= MDS_FMODE_EXEC; #endif if (cl_is_lov_delay_create(flags)) cr_flags |= MDS_OPEN_DELAY_CREATE; if (flags & O_NONBLOCK) cr_flags |= MDS_OPEN_NORESTORE; return cr_flags; }
int llu_iop_open(struct pnode *pnode, int flags, mode_t mode) { struct inode *inode = pnode->p_base->pb_ino; struct llu_inode_info *lli = llu_i2info(inode); struct intnl_stat *st = llu_i2stat(inode); struct ptlrpc_request *request; struct lookup_intent *it; int rc = 0; ENTRY; liblustre_wait_event(0); /* don't do anything for '/' */ if (llu_is_root_inode(inode)) RETURN(0); CDEBUG(D_VFSTRACE, "VFS Op:inode=%llu\n", (long long)st->st_ino); LL_GET_INTENT(inode, it); if (!it->d.lustre.it_disposition) { LBUG(); } rc = it_open_error(DISP_OPEN_OPEN, it); if (rc) GOTO(out_release, rc); rc = llu_local_open(lli, it); if (rc) LBUG(); if (!S_ISREG(st->st_mode)) GOTO(out_release, rc = 0); 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; ptlrpc_req_finished(request); it->it_op_release(it); OBD_FREE(it, sizeof(*it)); /* libsysio hasn't done anything for O_TRUNC. here we * simply simulate it as open(...); truncate(...); */ if (rc == 0 && (flags & O_TRUNC) && S_ISREG(st->st_mode)) { struct iattr attr; memset(&attr, 0, sizeof(attr)); attr.ia_size = 0; attr.ia_valid |= ATTR_SIZE | ATTR_RAW; rc = llu_setattr_raw(inode, &attr); if (rc) CERROR("error %d truncate in open()\n", rc); } liblustre_wait_event(0); RETURN(rc); }