From 8b025e890dc67a3270bcea70dfd05fcf56b02408 Mon Sep 17 00:00:00 2001 From: James Simmons Date: Mon, 8 Apr 2013 07:25:49 -0400 Subject: [PATCH] LU-1812 osd-ldiskfs: oti_obj_dentry needs d_sb set Commit 431547b3 (v2.6.33) changed the generic xattr handlers to use dentry->d_sb rather than dentry->d_inode->i_sb. This patch ensures it's set before calling the xattr ops, which filter through the generic xattr handlers. Really, since any call into the kernel using a dentry can deref d_sb, it should be set so we'll set it for fsync as well. Signed-off-by: Jeff Mahoney Signed-off-by: James Simmons Change-Id: I0ce38970cd839a220f852f96632b473011adbdc6 Reviewed-on: http://review.whamcloud.com/5120 Reviewed-by: Bob Glossman Tested-by: Hudson Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/osd-ldiskfs/osd_handler.c | 4 ++++ lustre/osd-ldiskfs/osd_internal.h | 1 + lustre/osd-ldiskfs/osd_io.c | 1 + 3 files changed, 6 insertions(+) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 135acf9..5d44fc2 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -172,6 +172,7 @@ static inline int __osd_xattr_get(struct inode *inode, struct dentry *dentry, const char *name, void *buf, int len) { dentry->d_inode = inode; + dentry->d_sb = inode->i_sb; return inode->i_op->getxattr(dentry, name, buf, len); } @@ -2684,6 +2685,7 @@ static int osd_xattr_list(const struct lu_env *env, struct dt_object *dt, return -EACCES; dentry->d_inode = inode; + dentry->d_sb = inode->i_sb; return inode->i_op->listxattr(dentry, buf->lb_buf, buf->lb_len); } @@ -2729,6 +2731,7 @@ static int osd_xattr_del(const struct lu_env *env, struct dt_object *dt, ll_vfs_dq_init(inode); dentry->d_inode = inode; + dentry->d_sb = inode->i_sb; rc = inode->i_op->removexattr(dentry, name); return rc; } @@ -2832,6 +2835,7 @@ static int osd_object_sync(const struct lu_env *env, struct dt_object *dt) ENTRY; dentry->d_inode = inode; + dentry->d_sb = inode->i_sb; file->f_dentry = dentry; file->f_mapping = inode->i_mapping; file->f_op = inode->i_fop; diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index 73432fe..628f90e 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -614,6 +614,7 @@ static inline int __osd_xattr_set(struct osd_thread_info *info, ll_vfs_dq_init(inode); dentry->d_inode = inode; + dentry->d_sb = inode->i_sb; return inode->i_op->setxattr(dentry, name, buf, buflen, fl); } diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index f350188..695e883 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1307,6 +1307,7 @@ static int osd_fiemap_get(const struct lu_env *env, struct dt_object *dt, LASSERT(inode); dentry->d_inode = inode; + dentry->d_sb = inode->i_sb; file->f_dentry = dentry; file->f_mapping = inode->i_mapping; file->f_op = inode->i_fop; -- 1.8.3.1