+ -
当前位置:首页 → 问答吧 → 函数结构

函数结构

时间:2010-08-02

来源:互联网

int Client::_setattr(Inode *in, struct stat_precise *attr, int mask, int uid, int gid)
{
  int issued = in->caps_issued();

  dout(10) << "_setattr mask " << mask << " issued " << ccap_string(issued) << dendl;

  // make the change locally?
  if (in->caps_issued_mask(CEPH_CAP_AUTH_EXCL)) {
    if (mask & CEPH_SETATTR_MODE) {
      in->ctime = g_clock.now();
      in->mode = (in->mode & ~07777) | (attr->st_mode & 07777);
      mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL);
      mask &= ~CEPH_SETATTR_MODE;
    }
    if (mask & CEPH_SETATTR_UID) {
      in->ctime = g_clock.now();
      in->uid = attr->st_uid;
      mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL);
      mask &= ~CEPH_SETATTR_UID;
    }
    if (mask & CEPH_SETATTR_GID) {
      in->ctime = g_clock.now();
      in->gid = attr->st_gid;
      mark_caps_dirty(in, CEPH_CAP_AUTH_EXCL);
      mask &= ~CEPH_SETATTR_GID;
    }
  }
  if (in->caps_issued_mask(CEPH_CAP_FILE_EXCL)) {
    if (mask & (CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME)) {
      if (mask & CEPH_SETATTR_MTIME)
        in->mtime = utime_t(attr->st_mtime_sec, attr->st_mtime_micro);
      if (mask & CEPH_SETATTR_ATIME)
        in->atime = utime_t(attr->st_atime_sec, attr->st_atime_micro);
      in->ctime = g_clock.now();
      in->time_warp_seq++;
      mark_caps_dirty(in, CEPH_CAP_FILE_EXCL);
      mask &= ~(CEPH_SETATTR_MTIME|CEPH_SETATTR_ATIME);
    }
  }
  if (!mask)
    return 0;

MetaRequest *req = new MetaRequest(CEPH_MDS_OP_SETATTR);///////////

  filepath path;
  in->make_path(path);
  req->set_filepath(path);

  if (mask & CEPH_SETATTR_MODE) {
    req->head.args.setattr.mode = attr->st_mode;
    req->inode_drop |= CEPH_CAP_AUTH_SHARED;
    req->inode = in;
  }
  if (mask & CEPH_SETATTR_UID) {
    req->head.args.setattr.uid = attr->st_uid;
    req->inode_drop |= CEPH_CAP_AUTH_SHARED;
    req->inode = in;
  }
  if (mask & CEPH_SETATTR_GID) {
    req->head.args.setattr.gid = attr->st_gid;
    req->inode_drop |= CEPH_CAP_AUTH_SHARED;
    req->inode = in;
  }
  if (mask & CEPH_SETATTR_MTIME) {
    req->head.args.setattr.mtime =
      utime_t(attr->st_mtime_sec, attr->st_mtime_micro);
    req->inode_drop |= CEPH_CAP_AUTH_SHARED | CEPH_CAP_FILE_RD |
      CEPH_CAP_FILE_WR;
    req->inode = in;
  }
  if (mask & CEPH_SETATTR_ATIME) {
    req->head.args.setattr.atime =
      utime_t(attr->st_atime_sec, attr->st_atime_micro);
    req->inode_drop |= CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD |
      CEPH_CAP_FILE_WR;
    req->inode = in;
  }
  if (mask & CEPH_SETATTR_SIZE) {
    if ((unsigned long)attr->st_size < mdsmap->get_max_filesize())
      req->head.args.setattr.size = attr->st_size;
    else { //too big!
      delete req;
      return -EFBIG;
    }
    req->inode_drop |= CEPH_CAP_AUTH_SHARED | CEPH_CAP_FILE_RD |
      CEPH_CAP_FILE_WR;
    req->inode = in;
  }
  req->head.args.setattr.mask = mask;

  int res = make_request(req, uid, gid);
  dout(10) << "_setattr result=" << res << dendl;
  return res;
}

从打了很多///////的那句开始是个什么意思阿?
是不是进行原数据请求在使用mask看要设置哪个参数?

作者: hjwsm1989   发布时间: 2010-08-02

好家伙,这个怎么能看得懂?期待高手。。。

作者: rain_fish   发布时间: 2010-08-02

回复 rain_fish


    是啊,还要大家多多指教,这个问题很难难搞懂……

作者: hjwsm1989   发布时间: 2010-08-02

相关阅读 更多