static ssize_t osd_read(const struct lu_env *env, struct dt_object *dt,
struct lu_buf *buf, loff_t *pos)
{
- struct inode *inode = osd_dt_obj(dt)->oo_inode;
- int rc;
+ struct inode *inode = osd_dt_obj(dt)->oo_inode;
+ int rc;
- /* Read small symlink from inode body as we need to maintain correct
- * on-disk symlinks for ldiskfs.
- */
- if (S_ISLNK(dt->do_lu.lo_header->loh_attr) &&
- (buf->lb_len < sizeof(LDISKFS_I(inode)->i_data)))
- rc = osd_ldiskfs_readlink(inode, buf->lb_buf, buf->lb_len);
- else
- rc = osd_ldiskfs_read(inode, buf->lb_buf, buf->lb_len, pos);
+ /* Read small symlink from inode body as we need to maintain correct
+ * on-disk symlinks for ldiskfs.
+ */
+ if (S_ISLNK(dt->do_lu.lo_header->loh_attr)) {
+ loff_t size = i_size_read(inode);
- return rc;
+ if (buf->lb_len < size)
+ return -EOVERFLOW;
+
+ if (size < sizeof(LDISKFS_I(inode)->i_data))
+ rc = osd_ldiskfs_readlink(inode, buf->lb_buf, size);
+ else
+ rc = osd_ldiskfs_read(inode, buf->lb_buf, size, pos);
+ } else {
+ rc = osd_ldiskfs_read(inode, buf->lb_buf, buf->lb_len, pos);
+ }
+
+ return rc;
}
static inline int osd_extents_enabled(struct super_block *sb,
ln -s $migrate_dir/$tfile $migrate_dir/${tfile}_ln
ln -s $other_dir/$tfile $migrate_dir/${tfile}_ln_other
+ local len
+ local lnktgt
+
+ # inline symlink
+ for len in 58 59 60; do
+ lnktgt=$(str_repeat 'l' $len)
+ touch $migrate_dir/$lnktgt
+ ln -s $lnktgt $migrate_dir/${len}char_ln
+ done
+
+ # PATH_MAX
+ for len in 4094 4095; do
+ lnktgt=$(str_repeat 'l' $len)
+ ln -s $lnktgt $migrate_dir/${len}char_ln
+ done
+
+ # NAME_MAX
+ for len in 254 255; do
+ touch $migrate_dir/$(str_repeat 'l' $len)
+ done
+
$LFS migrate -m $MDTIDX $migrate_dir ||
error "fails on migrating remote dir to MDT1"
for ((i = 0; i < 10; i++)); do
for file in $(find $migrate_dir/dir_${i}); do
mdt_index=$($LFS getstripe -m $file)
- [ $mdt_index == $MDTIDX ] ||
+ # broken symlink getstripe will fail
+ [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
error "$file is not on MDT${MDTIDX}"
done
done
echo "migrate back to MDT0, checking.."
for file in $(find $migrate_dir); do
mdt_index=$($LFS getstripe -m $file)
- [ $mdt_index == $MDTIDX ] ||
+ [ $mdt_index -ne $MDTIDX ] && stat -L $file &&
error "$file is not on MDT${MDTIDX}"
done