From 4968f1ca8c9b706849601384703b52b900046f41 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 23 Jul 2009 15:35:36 +0000 Subject: [PATCH] - udmu_object_setattr() sets rdev - cleanups in osd_object_create() --- lustre/dmu-osd/osd_handler.c | 45 +++++++++++++++++++++++++++----------------- lustre/dmu-osd/udmu.c | 3 +++ 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/lustre/dmu-osd/osd_handler.c b/lustre/dmu-osd/osd_handler.c index 4edc6cb..b2b9ce4 100644 --- a/lustre/dmu-osd/osd_handler.c +++ b/lustre/dmu-osd/osd_handler.c @@ -312,7 +312,8 @@ static void lu_attr2vnattr(struct lu_attr *la, vnattr_t *vap) #if 0 if (la->la_valid & LA_FLAGS) { - vap->va_flags = (la->la_flags & FS_FL_USER_MODIFIABLE); + vap->va_flags = (la->la_flags & + (LUSTRE_APPEND_FL | LUSTRE_IMMUTABLE_FL)); vap->va_mask |= DMU_AT_FLAGS; } #endif @@ -1247,30 +1248,40 @@ static dmu_buf_t* osd_mksym(struct osd_thread_info *info, struct osd_device *os return db; } -static dmu_buf_t* osd_mknod(struct osd_thread_info *info, struct osd_device *osd, - struct lu_attr *attr, - struct osd_thandle *oh) +static dmu_buf_t* osd_mknod(struct osd_thread_info *info, struct osd_device *osd, + struct lu_attr *attr, struct osd_thandle *oh) { - dmu_buf_t * db; - vnattr_t vap; - umode_t mode = attr->la_mode & (S_IFMT | S_IRWXUGO | S_ISVTX); + umode_t mode = attr->la_mode & (S_IFMT | S_IRWXUGO | S_ISVTX); + dmu_buf_t *db; + vnattr_t vap; - LASSERT(S_ISCHR(mode) || S_ISBLK(mode) || - S_ISFIFO(mode) || S_ISSOCK(mode)); + vap.va_mask = DMU_AT_MODE; + if (S_ISCHR(mode)) { + vap.va_type = VCHR; + vap.va_mask |= DMU_AT_RDEV; + vap.va_rdev = attr->la_rdev; + } else if (S_ISBLK(mode)) { + vap.va_type = VBLK; + vap.va_mask |= DMU_AT_RDEV; + vap.va_rdev = attr->la_rdev; + } else if (S_ISFIFO(mode)) + vap.va_type = VFIFO; + else if (S_ISSOCK(mode)) + vap.va_type = VSOCK; + else + LBUG(); udmu_object_create(&osd->od_objset, &db, oh->ot_tx, osd_object_tag); - if (db && (S_ISCHR(mode)||S_ISBLK(mode))) { - vap.va_mask = DMU_AT_RDEV; - vap.va_rdev = attr->la_rdev; - udmu_object_setattr(db, oh->ot_tx, &vap); - } + udmu_object_setattr(db, oh->ot_tx, &vap); + return db; } -typedef dmu_buf_t* (*osd_obj_type_f)(struct osd_thread_info *info, struct osd_device *osd, - struct lu_attr *attr, - struct osd_thandle *oh); +typedef dmu_buf_t* (*osd_obj_type_f)(struct osd_thread_info *info, + struct osd_device *osd, + struct lu_attr *attr, + struct osd_thandle *oh); static osd_obj_type_f osd_create_type_f(enum dt_format_type type) { diff --git a/lustre/dmu-osd/udmu.c b/lustre/dmu-osd/udmu.c index 61c2301..930f482 100644 --- a/lustre/dmu-osd/udmu.c +++ b/lustre/dmu-osd/udmu.c @@ -799,6 +799,9 @@ void udmu_object_setattr(dmu_buf_t *db, dmu_tx_t *tx, vnattr_t *vap) if (mask & DMU_AT_NLINK) zp->zp_links = vap->va_nlink; + + if (mask & DMU_AT_RDEV) + zp->zp_rdev = vap->va_rdev; } /* -- 1.8.3.1