Whamcloud - gitweb
LU-169 lov: add lsm refcounting
[fs/lustre-release.git] / lustre / llite / xattr.c
index aaa7631..c765611 100644 (file)
@@ -431,6 +431,7 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name,
             (strncmp(name, XATTR_LUSTRE_PREFIX,
                      sizeof(XATTR_LUSTRE_PREFIX) - 1) == 0 &&
              strcmp(name + sizeof(XATTR_LUSTRE_PREFIX) - 1, "lov") == 0)) {
+               struct lov_stripe_md *lsm;
                 struct lov_user_md *lump;
                 struct lov_mds_md *lmm = NULL;
                 struct ptlrpc_request *request = NULL;
@@ -445,7 +446,8 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name,
                         GOTO(out, rc = sizeof(struct lov_user_md));
                 }
 
-                if (!ll_i2info(inode)->lli_smd) {
+               lsm = ccc_inode_lsm_get(inode);
+               if (lsm == NULL) {
                         if (S_ISDIR(inode->i_mode)) {
                                 rc = ll_dir_getstripe(inode, &lmm,
                                                       &lmmsize, &request);
@@ -455,10 +457,10 @@ ssize_t ll_getxattr(struct dentry *dentry, const char *name,
                 } else {
                         /* LSM is present already after lookup/getattr call.
                          * we need to grab layout lock once it is implemented */
-                        rc = obd_packmd(ll_i2dtexp(inode), &lmm,
-                                        ll_i2info(inode)->lli_smd);
-                        lmmsize = rc;
-                }
+                       rc = obd_packmd(ll_i2dtexp(inode), &lmm, lsm);
+                       lmmsize = rc;
+               }
+               ccc_inode_lsm_put(inode, lsm);
 
                 if (rc < 0)
                        GOTO(out, rc);
@@ -535,8 +537,8 @@ ssize_t ll_listxattr(struct dentry *dentry, char *buffer, size_t size)
                        rc -= xlen;
                }
        }
-        if (S_ISREG(inode->i_mode)) {
-                if (ll_i2info(inode)->lli_smd == NULL)
+       if (S_ISREG(inode->i_mode)) {
+               if (!ll_i2info(inode)->lli_has_smd)
                         rc2 = -1;
         } else if (S_ISDIR(inode->i_mode)) {
                 rc2 = ll_dir_getstripe(inode, &lmm, &lmmsize, &request);