- fix rename of one directory over another leaking an inode (5953)
- avoid SetPageDirty on 2.6 (5981)
- don't re-add just-being-destroyed locks to the waiting list (5653)
+ - when creating new directories, inherit the parent's custom
+ striping settings if present parent (3048)
* miscellania
- by default create 1 inode per 4kB space on MDS, per 16kB on OSTs
- allow --write-conf on an MDS with different nettype than client (5619)
- init scripts are now turned off by default; run chkconfig --on
lustre and chkconfig --on lustrefs to use them
- upcalls are no longer needed for clients to recover to failover
- servers (3262)
+ servers (3262)
- add --abort-recovery option to lconf to abort recovery on device
- startup (6017)
+ startup (6017)
2005-03-22 Cluster File Systems, Inc. <info@clusterfs.com>
* version 1.4.1
if (rc == 0 && (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)) &&
rec->ur_eadata != NULL) {
struct lov_stripe_md *lsm = NULL;
+ struct lov_user_md *lum = NULL;
rc = ll_permission(inode, MAY_WRITE, NULL);
if (rc < 0)
GOTO(cleanup, rc);
- rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE,
- mds->mds_osc_exp, 0, &lsm, rec->ur_eadata);
- if (rc)
- GOTO(cleanup, rc);
-
- obd_free_memmd(mds->mds_osc_exp, &lsm);
-
- rc = fsfilt_set_md(obd, inode, handle, rec->ur_eadata,
- rec->ur_eadatalen);
- if (rc)
- GOTO(cleanup, rc);
+ lum = rec->ur_eadata;
+ /* if lmm_stripe_size is -1, then delete the stripe
+ info from the dir */
+ if (S_ISDIR(inode->i_mode) &&
+ lum->lmm_stripe_size == (typeof(lum->lmm_stripe_size))(-1)){
+ rc = fsfilt_set_md(obd, inode, handle, NULL, 0);
+ if (rc)
+ GOTO(cleanup, rc);
+ } else {
+ rc = obd_iocontrol(OBD_IOC_LOV_SETSTRIPE,
+ mds->mds_osc_exp, 0,
+ &lsm, rec->ur_eadata);
+ if (rc)
+ GOTO(cleanup, rc);
+
+ obd_free_memmd(mds->mds_osc_exp, &lsm);
+
+ rc = fsfilt_set_md(obd, inode, handle, rec->ur_eadata,
+ rec->ur_eadatalen);
+ if (rc)
+ GOTO(cleanup, rc);
+ }
}
body = lustre_msg_buf(req->rq_repmsg, 0, sizeof (*body));
if (rc)
CERROR("error on parent setattr: rc = %d\n", rc);
+ if (S_ISDIR(inode->i_mode)) {
+ struct lov_mds_md lmm;
+ int lmm_size = sizeof(lmm);
+ rc = mds_get_md(obd, dir, &lmm, &lmm_size, 1);
+ if (rc > 0) {
+ down(&inode->i_sem);
+ rc = fsfilt_set_md(obd, inode, handle,
+ &lmm, lmm_size);
+ up(&inode->i_sem);
+ }
+ if (rc)
+ CERROR("error on copy stripe info: rc = %d\n",
+ rc);
+ }
+
body = lustre_msg_buf(req->rq_repmsg, offset, sizeof (*body));
mds_pack_inode2fid(&body->fid1, inode);
mds_pack_inode2body(body, inode);
mkdir -p $DIR/d65
$LSTRIPE $DIR/d65 0 -1 0 || error "setstripe"
+ $LFS find -v $DIR/d65 | grep "$DIR/d65/ has no stripe info" || error "no stripe info failed"
touch $DIR/d65/f6
$LVERIFY $DIR/d65 $DIR/d65/f6 || error "lverify failed"
}
-run_test 65e "directory setstripe 0 -1 0 (default) ============="
+run_test 65e "directory setstripe 0 -1 0 ============="
test_65f() {
mkdir -p $DIR/d65f
}
run_test 65f "dir setstripe permission (should return error) ==="
+test_65g() {
+ mkdir -p $DIR/d65
+ $LSTRIPE $DIR/d65 $(($STRIPESIZE * 2)) 0 1 || error "setstripe"
+ $LSTRIPE -d $DIR/d65 || error "setstripe"
+ $LFS find -v $DIR/d65 | grep "$DIR/d65/ has no stripe info" || error "no stripe info failed"
+}
+run_test 65g "directory setstripe -d ========"
+
+test_65h() {
+ mkdir -p $DIR/d65
+ $LSTRIPE $DIR/d65 $(($STRIPESIZE * 2)) 0 1 || error "setstripe"
+ mkdir -p $DIR/d65/dd1
+ [ "`$LFS find -v $DIR/d65 | grep "^count"`" == \
+ "`$LFS find -v $DIR/d65/dd1 | grep "^count"`" ] || error "stripe info inherit failed"
+}
+run_test 65h "directory stripe info inherit ======"
+
# bug 2543 - update blocks count on client
test_66() {
COUNT=${COUNT:-8}
command_t cmdlist[] = {
{"setstripe", lfs_setstripe, 0,
"Create a new file with a specific striping pattern or\n"
- "Set the default striping pattern on an existing directory\n"
+ "set the default striping pattern on an existing directory or\n"
+ "delete the default striping pattern from an existing directory\n"
"usage: setstripe <filename|dirname> <stripe size> <stripe start> <stripe count>\n"
+ " or \n"
+ " setstripe -d <dirname>\n"
"\tstripe size: Number of bytes in each stripe (0 default)\n"
"\tstripe start: OST index of first stripe (-1 default)\n"
"\tstripe count: Number of OSTs to stripe over (0 default, -1 all)"},
/* functions */
static int lfs_setstripe(int argc, char **argv)
{
+ char *fname;
int result;
long st_size;
int st_offset, st_count;
char *end;
int page_size;
- if (argc != 5)
+ if (argc != 5 && argc != 3)
return CMD_HELP;
- // get the stripe size
- st_size = strtoul(argv[2], &end, 0);
- if (*end != '\0') {
- fprintf(stderr, "error: %s: bad stripe size '%s'\n",
- argv[0], argv[2]);
- return CMD_HELP;
- }
- /* 64 KB is the largest common page size I'm aware of (on ia64), but
- * check the local page size just in case. */
- page_size = 65536;
- if (getpagesize() > page_size) {
- fprintf(stderr, "WARNING: your page size (%d) is larger than "
- "expected.\n", getpagesize());
- page_size = getpagesize();
- }
- if (st_size % page_size) {
- fprintf(stderr, "FATAL: stripe_size must be an even multiple "
- "of %d bytes.\n", page_size);
- return CMD_HELP;
- }
- // get the stripe offset
- st_offset = strtoul(argv[3], &end, 0);
- if (*end != '\0') {
- fprintf(stderr, "error: %s: bad stripe offset '%s'\n",
+ if (argc == 3) {
+ if (strcmp(argv[1], "-d") != 0)
+ return CMD_HELP;
+
+ fname = argv[2];
+ st_size = -1;
+ st_count = 0;
+ st_offset = 0;
+ } else {
+ fname = argv[1];
+
+ // get the stripe size
+ st_size = strtoul(argv[2], &end, 0);
+ if (*end != '\0') {
+ fprintf(stderr, "error: %s: bad stripe size '%s'\n",
+ argv[0], argv[2]);
+ return CMD_HELP;
+ }
+ /* 64 KB is the largest common page size I'm aware of (on ia64), but
+ * check the local page size just in case. */
+ page_size = 65536;
+ if (getpagesize() > page_size) {
+ fprintf(stderr, "WARNING: your page size (%d) is larger than "
+ "expected.\n", getpagesize());
+ page_size = getpagesize();
+ }
+ if (st_size % page_size) {
+ fprintf(stderr, "FATAL: stripe_size must be an even multiple "
+ "of %d bytes.\n", page_size);
+ return CMD_HELP;
+ }
+
+ // get the stripe offset
+ st_offset = strtoul(argv[3], &end, 0);
+ if (*end != '\0') {
+ fprintf(stderr, "error: %s: bad stripe offset '%s'\n",
argv[0], argv[3]);
- return CMD_HELP;
- }
- // get the stripe count
- st_count = strtoul(argv[4], &end, 0);
- if (*end != '\0') {
- fprintf(stderr, "error: %s: bad stripe count '%s'\n",
+ return CMD_HELP;
+ }
+ // get the stripe count
+ st_count = strtoul(argv[4], &end, 0);
+ if (*end != '\0') {
+ fprintf(stderr, "error: %s: bad stripe count '%s'\n",
argv[0], argv[4]);
- return CMD_HELP;
+ return CMD_HELP;
+ }
}
- result = llapi_file_create(argv[1], st_size, st_offset, st_count, 0);
+ result = llapi_file_create(fname, st_size, st_offset, st_count, 0);
if (result)
fprintf(stderr, "error: %s: create stripe file failed\n",
argv[0]);
{
struct lov_user_md lum = { 0 };
int fd, rc = 0;
+ int isdir = 0;
/* Initialize IOCTL striping pattern structure */
lum.lmm_magic = LOV_USER_MAGIC;
lum.lmm_stripe_offset = stripe_offset;
fd = open(name, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644);
- if (errno == EISDIR)
+ if (errno == EISDIR) {
fd = open(name, O_DIRECTORY | O_RDONLY);
+ isdir++;
+ }
if (fd < 0) {
err_msg("unable to open '%s'",name);
return rc;
}
+ /* setting stripe pattern 0 -1 0 to a dir means to delete it */
+ if (isdir) {
+ if (stripe_size == 0 && stripe_count == 0 &&
+ stripe_offset == -1)
+ lum.lmm_stripe_size = -1;
+ } else {
+ if (stripe_size == -1) {
+ err_msg("deleting file stripe info is not allowed\n");
+ rc = -EPERM;
+ goto out;
+ }
+ }
+
if (ioctl(fd, LL_IOC_LOV_SETSTRIPE, &lum)) {
char *errmsg = "stripe already set";
if (errno != EEXIST && errno != EALREADY)
(__u64)LL_IOC_LOV_SETSTRIPE, name, fd, errmsg);
rc = -errno;
}
+out:
if (close(fd) < 0) {
err_msg("error on close for '%s' (%d)", name, fd);
if (rc == 0)