📄 mdc_lib.c
字号:
/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * * Copyright (c) 2003 Cluster File Systems, Inc. * * This file is part of the Lustre file system, http://www.lustre.org * Lustre is a trademark of Cluster File Systems, Inc. * * You may have signed or agreed to another license before downloading * this software. If so, you are bound by the terms and conditions * of that agreement, and the following does not apply to you. See the * LICENSE file included with this distribution for more information. * * If you did not agree to a different license, then this copy of Lustre * is open source software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * In either case, Lustre is distributed in the hope that it will be * useful, but WITHOUT ANY WARRANTY; without even the implied warranty * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * license text for more details. */#define DEBUG_SUBSYSTEM S_MDC#ifndef __KERNEL__# include <fcntl.h># include <liblustre.h>#endif#include <lustre/lustre_idl.h>#include <lustre_net.h>#include "mdc_internal.h"#ifndef __KERNEL__/* some liblustre hackings here */#ifndef O_DIRECTORY#define O_DIRECTORY 0#endif#endifvoid mdc_readdir_pack(struct ptlrpc_request *req, int offset, __u64 pg_off, __u32 size, struct ll_fid *fid){ struct mds_body *b; b = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*b)); b->fsuid = current->fsuid; b->fsgid = current->fsgid; b->capability = current->cap_effective; b->fid1 = *fid; b->size = pg_off; /* !! */ b->suppgid = -1; b->nlink = size; /* !! */}static void mdc_pack_body(struct mds_body *b){ LASSERT (b != NULL); b->fsuid = current->fsuid; b->fsgid = current->fsgid; b->capability = current->cap_effective;}void mdc_pack_req_body(struct ptlrpc_request *req, int offset, __u64 valid, struct ll_fid *fid, int ea_size, int flags){ struct mds_body *b = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*b)); if (fid) b->fid1 = *fid; b->valid = valid; b->eadatasize = ea_size; b->flags = flags; mdc_pack_body(b);}/* packing of MDS records */void mdc_create_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *op_data, const void *data, int datalen, __u32 mode, __u32 uid, __u32 gid, __u32 cap_effective, __u64 rdev){ struct mds_rec_create *rec; char *tmp; rec = lustre_msg_buf(req->rq_reqmsg, offset, sizeof (*rec)); rec->cr_opcode = REINT_CREATE; rec->cr_fsuid = uid; rec->cr_fsgid = gid; rec->cr_cap = cap_effective; rec->cr_fid = op_data->fid1; memset(&rec->cr_replayfid, 0, sizeof(rec->cr_replayfid)); rec->cr_mode = mode; rec->cr_rdev = rdev; rec->cr_time = op_data->mod_time; rec->cr_suppgid = op_data->suppgids[0]; tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1, op_data->namelen + 1); LOGL0(op_data->name, op_data->namelen, tmp); if (data) { tmp = lustre_msg_buf(req->rq_reqmsg, offset + 2, datalen); memcpy (tmp, data, datalen); }}static __u32 mds_pack_open_flags(__u32 flags){ __u32 cr_flags = (flags & (FMODE_READ | FMODE_WRITE | MDS_OPEN_DELAY_CREATE | MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS | MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK)); 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; if (flags & O_JOIN_FILE) cr_flags |= MDS_OPEN_JOIN_FILE;#ifdef FMODE_EXEC if (flags & FMODE_EXEC) cr_flags |= MDS_FMODE_EXEC;#endif return cr_flags;}/* packing of MDS records */void mdc_join_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *op_data, __u64 head_size){ struct mds_rec_join *rec; rec = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*rec)); LASSERT(rec != NULL); rec->jr_fid = op_data->fid2; rec->jr_headsize = head_size;}void mdc_open_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *op_data, __u32 mode, __u64 rdev, __u32 flags, const void *lmm, int lmmlen){ struct mds_rec_create *rec; char *tmp; rec = lustre_msg_buf(req->rq_reqmsg, offset, sizeof (*rec)); /* XXX do something about time, uid, gid */ rec->cr_opcode = REINT_OPEN; rec->cr_fsuid = current->fsuid; rec->cr_fsgid = current->fsgid; rec->cr_cap = current->cap_effective; rec->cr_fid = op_data->fid1; memset(&rec->cr_replayfid, 0, sizeof(rec->cr_replayfid)); rec->cr_mode = mode; rec->cr_flags = mds_pack_open_flags(flags); rec->cr_rdev = rdev; rec->cr_time = op_data->mod_time; rec->cr_suppgid = op_data->suppgids[0]; if (op_data->name) { tmp = lustre_msg_buf(req->rq_reqmsg, offset + 1, op_data->namelen + 1); LOGL0(op_data->name, op_data->namelen, tmp); } if (lmm) { rec->cr_flags |= MDS_OPEN_HAS_EA;#ifndef __KERNEL__ /*XXX a hack for liblustre to set EA (LL_IOC_LOV_SETSTRIPE) */ rec->cr_replayfid = op_data->fid2;#endif tmp = lustre_msg_buf(req->rq_reqmsg, offset + 2, lmmlen); memcpy (tmp, lmm, lmmlen); }}static inline __u64 attr_pack(unsigned int ia_valid) { __u64 sa_valid = 0; if (ia_valid & ATTR_MODE) sa_valid |= MDS_ATTR_MODE; if (ia_valid & ATTR_UID) sa_valid |= MDS_ATTR_UID; if (ia_valid & ATTR_GID) sa_valid |= MDS_ATTR_GID; if (ia_valid & ATTR_SIZE) sa_valid |= MDS_ATTR_SIZE; if (ia_valid & ATTR_ATIME) sa_valid |= MDS_ATTR_ATIME; if (ia_valid & ATTR_MTIME) sa_valid |= MDS_ATTR_MTIME; if (ia_valid & ATTR_CTIME) sa_valid |= MDS_ATTR_CTIME; if (ia_valid & ATTR_ATIME_SET) sa_valid |= MDS_ATTR_ATIME_SET; if (ia_valid & ATTR_MTIME_SET) sa_valid |= MDS_ATTR_MTIME_SET; if (ia_valid & ATTR_FORCE) sa_valid |= MDS_ATTR_FORCE; if (ia_valid & ATTR_ATTR_FLAG) sa_valid |= MDS_ATTR_ATTR_FLAG; if (ia_valid & ATTR_KILL_SUID) sa_valid |= MDS_ATTR_KILL_SUID; if (ia_valid & ATTR_KILL_SGID) sa_valid |= MDS_ATTR_KILL_SGID; if (ia_valid & ATTR_CTIME_SET) sa_valid |= MDS_ATTR_CTIME_SET; if (ia_valid & ATTR_FROM_OPEN) sa_valid |= MDS_ATTR_FROM_OPEN; if (ia_valid & MDS_OPEN_OWNEROVERRIDE) /* NFSD hack (see bug 5781) */ sa_valid |= MDS_OPEN_OWNEROVERRIDE; return sa_valid;}void mdc_setattr_pack(struct ptlrpc_request *req, int offset, struct mdc_op_data *data, struct iattr *iattr, void *ea, int ealen, void *ea2, int ea2len){ struct mds_rec_setattr *rec = lustre_msg_buf(req->rq_reqmsg, offset, sizeof(*rec)); rec->sa_opcode = REINT_SETATTR; rec->sa_fsuid = current->fsuid;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -