#include <linux/obd_support.h>
#include <linux/lustre_lib.h>
#include <linux/lustre_mds.h>
-#include <linux/lustre_lite.h>
-void mds_pack_inode2fid(struct ll_fid *fid, struct inode *inode)
+void mds_pack_inode2fid(struct obd_device *obd, struct ll_fid *fid,
+ struct inode *inode)
{
fid->id = inode->i_ino;
fid->generation = inode->i_generation;
fid->f_type = (S_IFMT & inode->i_mode);
+ fid->mds = obd->u.mds.mds_num;
}
-void mds_pack_inode2body(struct mds_body *b, struct inode *inode)
+/* Note that we can copy all of the fields, just some will not be "valid" */
+void mds_pack_inode2body(struct obd_device *obd, struct mds_body *b,
+ struct inode *inode)
{
- b->valid = OBD_MD_FLID | OBD_MD_FLATIME | OBD_MD_FLMTIME |
- OBD_MD_FLCTIME | OBD_MD_FLSIZE | OBD_MD_FLBLOCKS |
- OBD_MD_FLUID | OBD_MD_FLGID | OBD_MD_FLTYPE | OBD_MD_FLMODE |
- OBD_MD_FLNLINK | OBD_MD_FLGENER;
+ b->valid |= OBD_MD_FLID | OBD_MD_FLCTIME | OBD_MD_FLUID |
+ OBD_MD_FLGID | OBD_MD_FLFLAGS | OBD_MD_FLTYPE |
+ OBD_MD_FLMODE | OBD_MD_FLNLINK | OBD_MD_FLGENER |
+ OBD_MD_FLATIME | OBD_MD_FLMTIME; /* bug 2020 */
- /* The MDS file size isn't authoritative for regular files, so don't
- * even pretend. */
- if (S_ISREG(inode->i_mode))
- b->valid &= ~(OBD_MD_FLSIZE | OBD_MD_FLBLOCKS);
+ if (!S_ISREG(inode->i_mode))
+ b->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS | OBD_MD_FLATIME |
+ OBD_MD_FLMTIME | OBD_MD_FLRDEV;
b->ino = inode->i_ino;
b->atime = LTIME_S(inode->i_atime);
b->uid = inode->i_uid;
b->gid = inode->i_gid;
b->flags = inode->i_flags;
- b->rdev = b->rdev;
- b->nlink = inode->i_nlink;
+ b->rdev = inode->i_rdev;
+ /* Return the correct link count for orphan inodes */
+ if (mds_inode_is_orphan(inode)) {
+ b->nlink = 0;
+ } else if (S_ISDIR(inode->i_mode)) {
+ b->nlink = 1;
+ } else {
+ b->nlink = inode->i_nlink;
+ }
b->generation = inode->i_generation;
b->suppgid = -1;
+ b->mds = obd->u.mds.mds_num;
}
+
/* unpacking */
static int mds_setattr_unpack(struct ptlrpc_request *req, int offset,
struct mds_update_record *r)
struct mds_rec_setattr *rec;
ENTRY;
- rec = lustre_swab_reqbuf (req, offset, sizeof (*rec),
- lustre_swab_mds_rec_setattr);
+ rec = lustre_swab_reqbuf(req, offset, sizeof(*rec),
+ lustre_swab_mds_rec_setattr);
if (rec == NULL)
RETURN (-EFAULT);
if (r->ur_eadata == NULL)
RETURN (-EFAULT);
r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 1];
- } else {
- r->ur_eadata = NULL;
- r->ur_eadatalen = 0;
+ }
+
+ if (req->rq_reqmsg->bufcount > offset + 2) {
+ r->ur_logcookies = lustre_msg_buf(req->rq_reqmsg, offset + 2,0);
+ if (r->ur_eadata == NULL)
+ RETURN (-EFAULT);
+
+ r->ur_cookielen = req->rq_reqmsg->buflens[offset + 2];
}
RETURN(0);
r->ur_fid2 = &rec->cr_replayfid;
r->ur_mode = rec->cr_mode;
r->ur_rdev = rec->cr_rdev;
- r->ur_uid = rec->cr_uid;
- r->ur_gid = rec->cr_gid;
r->ur_time = rec->cr_time;
r->ur_flags = rec->cr_flags;
r->ur_suppgid1 = rec->cr_suppgid;
LASSERT_REQSWAB (req, offset + 2);
if (req->rq_reqmsg->bufcount > offset + 2) {
- /* NB for now, we only seem to pass NULL terminated symlink
- * target strings here. If this ever changes, we'll have
- * to stop checking for a buffer filled completely with a
- * NULL terminated string here, and make the callers check
- * depending on what they expect. We should probably stash
- * it in r->ur_eadata in that case, so it's obvious... -eeb
- */
- r->ur_tgt = lustre_msg_string(req->rq_reqmsg, offset + 2, 0);
- if (r->ur_tgt == NULL)
- RETURN (-EFAULT);
- r->ur_tgtlen = req->rq_reqmsg->buflens[offset + 2];
- } else {
- r->ur_tgt = NULL;
- r->ur_tgtlen = 0;
+ if (S_ISLNK(r->ur_mode)) {
+ r->ur_tgt = lustre_msg_string(req->rq_reqmsg,
+ offset + 2, 0);
+ if (r->ur_tgt == NULL)
+ RETURN (-EFAULT);
+ r->ur_tgtlen = req->rq_reqmsg->buflens[offset + 2];
+ } else if (S_ISDIR(r->ur_mode)) {
+ /* Stripe info for mkdir - just a 16bit integer */
+ if (req->rq_reqmsg->buflens[offset + 2] != 2) {
+ CERROR("mkdir stripe info does not match "
+ "expected size %d vs 2\n",
+ req->rq_reqmsg->buflens[offset + 2]);
+ RETURN (-EINVAL);
+ }
+ r->ur_eadata = lustre_swab_buf (req->rq_reqmsg,
+ offset + 2, 2, __swab16s);
+ r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 2];
+ } else {
+ /* Hm, no other users so far? */
+ LBUG();
+ }
}
RETURN(0);
}
r->ur_suppgid2 = rec->lk_suppgid2;
r->ur_fid1 = &rec->lk_fid1;
r->ur_fid2 = &rec->lk_fid2;
+ r->ur_time = rec->lk_time;
LASSERT_REQSWAB (req, offset + 1);
r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0);
r->ur_suppgid2 = -1;
r->ur_fid1 = &rec->ul_fid1;
r->ur_fid2 = &rec->ul_fid2;
+ r->ur_time = rec->ul_time;
LASSERT_REQSWAB (req, offset + 1);
r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0);
r->ur_suppgid2 = rec->rn_suppgid2;
r->ur_fid1 = &rec->rn_fid1;
r->ur_fid2 = &rec->rn_fid2;
+ r->ur_time = rec->rn_time;
LASSERT_REQSWAB (req, offset + 1);
r->ur_name = lustre_msg_string(req->rq_reqmsg, offset + 1, 0);
RETURN(0);
}
+static int mds_open_unpack(struct ptlrpc_request *req, int offset,
+ struct mds_update_record *r)
+{
+ struct mds_rec_create *rec;
+ ENTRY;
+
+ rec = lustre_swab_reqbuf (req, offset, sizeof (*rec),
+ lustre_swab_mds_rec_create);
+ if (rec == NULL)
+ RETURN (-EFAULT);
+
+ r->ur_fsuid = rec->cr_fsuid;
+ r->ur_fsgid = rec->cr_fsgid;
+ r->ur_cap = rec->cr_cap;
+ r->ur_fid1 = &rec->cr_fid;
+ r->ur_fid2 = &rec->cr_replayfid;
+ r->ur_mode = rec->cr_mode;
+ r->ur_rdev = rec->cr_rdev;
+ r->ur_time = rec->cr_time;
+ r->ur_flags = rec->cr_flags;
+ r->ur_suppgid1 = rec->cr_suppgid;
+ r->ur_suppgid2 = -1;
+
+ LASSERT_REQSWAB (req, offset + 1);
+ r->ur_name = lustre_msg_string (req->rq_reqmsg, offset + 1, 0);
+ if (r->ur_name == NULL)
+ RETURN (-EFAULT);
+ r->ur_namelen = req->rq_reqmsg->buflens[offset + 1];
+
+ LASSERT_REQSWAB (req, offset + 2);
+ if (req->rq_reqmsg->bufcount > offset + 2) {
+ r->ur_eadata = lustre_msg_buf(req->rq_reqmsg, offset + 2, 0);
+ if (r->ur_eadata == NULL)
+ RETURN (-EFAULT);
+ r->ur_eadatalen = req->rq_reqmsg->buflens[offset + 2];
+ }
+ RETURN(0);
+}
+
typedef int (*update_unpacker)(struct ptlrpc_request *req, int offset,
struct mds_update_record *r);
[REINT_LINK] mds_link_unpack,
[REINT_UNLINK] mds_unlink_unpack,
[REINT_RENAME] mds_rename_unpack,
- [REINT_OPEN] mds_create_unpack,
+ [REINT_OPEN] mds_open_unpack,
};
int mds_update_unpack(struct ptlrpc_request *req, int offset,