If mdt_open_by_fid_lock() returns -ENOENT and MDS_OPEN_CREAT is not
set in create flags then bail out and return -ENOENT from
mdt_reint_open(). In mdt_open_by_fid_lock() if -ENOENT is returned
then ensure that DISP_IT_EXECD is set in the reply disposition. Add
sanity test_27B to call the LL_IOC_LOV_SETSTRIPE ioctl() on an open
unlinked file, a situation which triggers the first case. In sanityn
test 30, remote the requirement that opening an unlinked file via
/proc/PID/exe return -ESTALE. In racer's file_create.sh, reinstate
the call to 'lfs setstripe' before dd is started, effectively
reverting commit
0be1c87fe2d4ffddaca9e568cc137518b7368b2d.
Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: I74e2297c4210ff18acbf60efdf51049d9a88cbea
Reviewed-on: http://review.whamcloud.com/5417
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Tested-by: Hudson
Reviewed-by: Fan Yong <fan.yong@intel.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
PFID(rr->rr_fid2));
GOTO(out, rc = -EREMOTE);
} else if (!mdt_object_exists(o)) {
PFID(rr->rr_fid2));
GOTO(out, rc = -EREMOTE);
} else if (!mdt_object_exists(o)) {
- mdt_set_disposition(info, rep, (DISP_LOOKUP_EXECD |
- DISP_LOOKUP_NEG));
+ mdt_set_disposition(info, rep,
+ DISP_IT_EXECD |
+ DISP_LOOKUP_EXECD |
+ DISP_LOOKUP_NEG);
GOTO(out, rc = -ENOENT);
}
GOTO(out, rc = -ENOENT);
}
} else if ((rr->rr_namelen == 0 && create_flags & MDS_OPEN_LOCK) ||
(create_flags & MDS_OPEN_BY_FID)) {
result = mdt_open_by_fid_lock(info, ldlm_rep, lhc);
} else if ((rr->rr_namelen == 0 && create_flags & MDS_OPEN_LOCK) ||
(create_flags & MDS_OPEN_BY_FID)) {
result = mdt_open_by_fid_lock(info, ldlm_rep, lhc);
- if ((result != -ENOENT && !(create_flags & MDS_OPEN_CREAT)) &&
- result != -EREMOTE)
+ /* If result is 0 then open by FID has found the file
+ * and there is nothing left for us to do here. More
+ * generally if it is anything other than -ENOENT or
+ * -EREMOTE then we return that now. If -ENOENT and
+ * MDS_OPEN_CREAT is set then we must create the file
+ * below. If -EREMOTE then we need to return a LOOKUP
+ * lock to the client, which we do below. Hence this
+ * odd looking condition. See LU-2523. */
+ if (!(result == -ENOENT && (create_flags & MDS_OPEN_CREAT)) &&
+ result != -EREMOTE)
if (unlikely(rr->rr_namelen == 0))
GOTO(out, result = -EINVAL);
if (unlikely(rr->rr_namelen == 0))
GOTO(out, result = -EINVAL);
CDEBUG(D_INFO, "No object(2), continue as regular open.\n");
}
CDEBUG(D_INFO, "No object(2), continue as regular open.\n");
}
#define ALIGN_LEN 65535
char usage[] =
#define ALIGN_LEN 65535
char usage[] =
-"Usage: %s filename command-sequence\n"
+"Usage: %s filename command-sequence [path...]\n"
" command-sequence items:\n"
" c close\n"
" command-sequence items:\n"
" c close\n"
+" B[num] call setstripe ioctl to create stripes\n"
" C[num] create with optional stripes\n"
" d mkdir\n"
" D open(O_DIRECTORY)\n"
" C[num] create with optional stripes\n"
" d mkdir\n"
" D open(O_DIRECTORY)\n"
" F print FID\n"
" G gid get grouplock\n"
" g gid put grouplock\n"
" F print FID\n"
" G gid get grouplock\n"
" g gid put grouplock\n"
-" L link\n"
-" l symlink\n"
+" K link path to filename\n"
+" L link filename to path\n"
+" l symlink filename to path\n"
" m mknod\n"
" M rw mmap to EOF (must open and stat prior)\n"
" m mknod\n"
" M rw mmap to EOF (must open and stat prior)\n"
+" n rename path to filename\n"
+" N rename filename to path\n"
" o open(O_RDONLY)\n"
" O open(O_CREAT|O_RDWR)\n"
" r[num] read [optional length]\n"
" o open(O_RDONLY)\n"
" O open(O_CREAT|O_RDWR)\n"
" r[num] read [optional length]\n"
- const char *string;
- const int flag;
+ const char *string;
+ const int flag;
- {"O_RDONLY", O_RDONLY},
- {"O_WRONLY", O_WRONLY},
- {"O_RDWR", O_RDWR},
- {"O_CREAT", O_CREAT},
- {"O_EXCL", O_EXCL},
- {"O_NOCTTY", O_NOCTTY},
- {"O_TRUNC", O_TRUNC},
- {"O_APPEND", O_APPEND},
- {"O_NONBLOCK", O_NONBLOCK},
- {"O_NDELAY", O_NDELAY},
- {"O_SYNC", O_SYNC},
+ {"O_RDONLY", O_RDONLY},
+ {"O_WRONLY", O_WRONLY},
+ {"O_RDWR", O_RDWR},
+ {"O_CREAT", O_CREAT},
+ {"O_EXCL", O_EXCL},
+ {"O_NOCTTY", O_NOCTTY},
+ {"O_TRUNC", O_TRUNC},
+ {"O_APPEND", O_APPEND},
+ {"O_NONBLOCK", O_NONBLOCK},
+ {"O_NDELAY", O_NDELAY},
+ {"O_SYNC", O_SYNC},
- {"O_DIRECT", O_DIRECT},
+ {"O_DIRECT", O_DIRECT},
- {"O_LARGEFILE", O_LARGEFILE},
- {"O_DIRECTORY", O_DIRECTORY},
- {"O_NOFOLLOW", O_NOFOLLOW},
- {"", -1}
+ {"O_LARGEFILE", O_LARGEFILE},
+ {"O_DIRECTORY", O_DIRECTORY},
+ {"O_NOFOLLOW", O_NOFOLLOW},
+ {"O_LOV_DELAY_CREATE", O_LOV_DELAY_CREATE},
+ {"", -1}
};
int get_flags(char *data, int *rflags)
};
int get_flags(char *data, int *rflags)
{
char *fname, *commands;
const char *newfile;
{
char *fname, *commands;
const char *newfile;
struct stat st;
struct statfs stfs;
size_t mmap_len = 0, i;
struct stat st;
struct statfs stfs;
size_t mmap_len = 0, i;
int gid = 0;
lustre_fid fid;
struct timespec ts;
int gid = 0;
lustre_fid fid;
struct timespec ts;
+ struct lov_user_md_v3 lum;
if (argc < 3) {
fprintf(stderr, usage, argv[0]);
if (argc < 3) {
fprintf(stderr, usage, argv[0]);
+ case 'B':
+ lum = (struct lov_user_md_v3) {
+ .lmm_magic = LOV_USER_MAGIC_V3,
+ .lmm_stripe_count = atoi(commands + 1),
+ };
+
+ if (ioctl(fd, LL_IOC_LOV_SETSTRIPE, &lum) < 0) {
+ save_errno = errno;
+ perror("LL_IOC_LOV_SETSTRIPE");
+ exit(save_errno);
+ }
+ break;
case 'C':
len = atoi(commands+1);
fd = llapi_file_open(fname, O_CREAT | O_WRONLY, 0644,
case 'C':
len = atoi(commands+1);
fd = llapi_file_open(fname, O_CREAT | O_WRONLY, 0644,
exit(save_errno);
}
break;
exit(save_errno);
}
break;
+ case 'K':
+ oldpath = POP_ARG();
+ if (oldpath == NULL)
+ oldpath = fname;
+
+ if (link(oldpath, fname)) {
+ save_errno = errno;
+ perror("link()");
+ exit(save_errno);
+ }
+ break;
case 'l':
newfile = POP_ARG();
if (!newfile)
case 'l':
newfile = POP_ARG();
if (!newfile)
exit(save_errno);
}
break;
exit(save_errno);
}
break;
- case 'L':
- newfile = POP_ARG();
- if (!newfile)
- newfile = fname;
- if (link(fname, newfile)) {
- save_errno = errno;
- perror("symlink()");
- exit(save_errno);
- }
- break;
+ case 'L':
+ newfile = POP_ARG();
+ if (newfile == NULL)
+ newfile = fname;
+
+ if (link(fname, newfile)) {
+ save_errno = errno;
+ perror("link()");
+ exit(save_errno);
+ }
+ break;
case 'm':
if (mknod(fname, S_IFREG | 0644, 0) == -1) {
save_errno = errno;
case 'm':
if (mknod(fname, S_IFREG | 0644, 0) == -1) {
save_errno = errno;
exit(save_errno);
}
break;
exit(save_errno);
}
break;
+ case 'n':
+ oldpath = POP_ARG();
+ if (oldpath == NULL)
+ oldpath = fname;
+
+ if (rename(oldpath, fname) < 0) {
+ save_errno = errno;
+ perror("rename()");
+ exit(save_errno);
+ }
+ break;
case 'N':
newfile = POP_ARG();
if (!newfile)
case 'N':
newfile = POP_ARG();
if (!newfile)
exit(save_errno);
}
break;
exit(save_errno);
}
break;
case '0':
case '1':
case '2':
case '0':
case '1':
case '2':
-# disable until LU-2523 and LU-2789 are fixed
-[ -z "$RACER_SETSTRIPE" ] && RACER_SETSTRIPE=false
OSTCOUNT=${OSTCOUNT:-$(lfs df $DIR 2> /dev/null | grep -c OST)}
while /bin/true ; do
file=$((RANDOM % MAX))
SIZE=$((RANDOM * MAX_MB / 32))
echo "file_create: FILE=$DIR/$file SIZE=$SIZE"
OSTCOUNT=${OSTCOUNT:-$(lfs df $DIR 2> /dev/null | grep -c OST)}
while /bin/true ; do
file=$((RANDOM % MAX))
SIZE=$((RANDOM * MAX_MB / 32))
echo "file_create: FILE=$DIR/$file SIZE=$SIZE"
- [ $OSTCOUNT -gt 0 ] && $RACER_SETSTRIPE &&
lfs setstripe -c $((RANDOM % OSTCOUNT)) $DIR/$file 2> /dev/null
dd if=/dev/zero of=$DIR/$file bs=1k count=$SIZE 2> /dev/null
done
lfs setstripe -c $((RANDOM % OSTCOUNT)) $DIR/$file 2> /dev/null
dd if=/dev/zero of=$DIR/$file bs=1k count=$SIZE 2> /dev/null
done
}
run_test 27A "check filesystem-wide default LOV EA values"
}
run_test 27A "check filesystem-wide default LOV EA values"
+test_27B() { # LU-2523
+ test_mkdir -p $DIR/$tdir
+ rm -f $DIR/$tdir/f0 $DIR/$tdir/f1
+ touch $DIR/$tdir/f0
+ # open f1 with O_LOV_DELAY_CREATE
+ # rename f0 onto f1
+ # call setstripe ioctl on open file descriptor for f1
+ # close
+ multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:nB1c \
+ $DIR/$tdir/f0
+
+ rm -f $DIR/$tdir/f1
+ # open f1 with O_LOV_DELAY_CREATE
+ # unlink f1
+ # call setstripe ioctl on open file descriptor for f1
+ # close
+ multiop $DIR/$tdir/f1 oO_RDWR:O_CREAT:O_LOV_DELAY_CREATE:uB1c
+
+ # Allow multiop to fail in imitation of NFS's busted semantics.
+ true
+}
+run_test 27B "call setstripe on open unlinked file/rename victim"
+
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
# createtest also checks that device nodes are created and
# then visible correctly (#2091)
test_28() { # bug 2091
#bug 11549 - permanently turn test off in b1_5
run_test 29 "lock put race between glimpse and enqueue ========="
#bug 11549 - permanently turn test off in b1_5
run_test 29 "lock put race between glimpse and enqueue ========="
+test_30() { #bug #11110, LU-2523
test_mkdir -p $DIR1/$tdir
cp -f /bin/bash $DIR1/$tdir/bash
/bin/sh -c 'sleep 1; rm -f $DIR2/$tdir/bash;
cp /bin/bash $DIR2/$tdir' &
test_mkdir -p $DIR1/$tdir
cp -f /bin/bash $DIR1/$tdir/bash
/bin/sh -c 'sleep 1; rm -f $DIR2/$tdir/bash;
cp /bin/bash $DIR2/$tdir' &
- local err=$($DIR1/$tdir/bash -c 'sleep 2;
- openfile -f O_RDONLY /proc/$$/exe >& /dev/null; echo $?')
+ $DIR1/$tdir/bash -c 'sleep 2;
+ openfile -f O_RDONLY /proc/$$/exe >& /dev/null; echo $?'
- [ $err -ne 116 ] &&
- error_ignore 12900 "return code ($err) != -ESTALE" && return