KVM: x86 emulator: reject SYSENTER in compatibility mode on AMD guests
[pandora-kernel.git] / fs / sysfs / inode.c
index e3f091a..9db61a4 100644 (file)
@@ -136,12 +136,13 @@ static int sysfs_sd_setsecdata(struct sysfs_dirent *sd, void **secdata, u32 *sec
        void *old_secdata;
        size_t old_secdata_len;
 
-       iattrs = sd->s_iattr;
-       if (!iattrs)
-               iattrs = sysfs_init_inode_attrs(sd);
-       if (!iattrs)
-               return -ENOMEM;
+       if (!sd->s_iattr) {
+               sd->s_iattr = sysfs_init_inode_attrs(sd);
+               if (!sd->s_iattr)
+                       return -ENOMEM;
+       }
 
+       iattrs = sd->s_iattr;
        old_secdata = iattrs->ia_secdata;
        old_secdata_len = iattrs->ia_secdata_len;
 
@@ -202,18 +203,6 @@ static inline void set_inode_attr(struct inode * inode, struct iattr * iattr)
        inode->i_ctime = iattr->ia_ctime;
 }
 
-static int sysfs_count_nlink(struct sysfs_dirent *sd)
-{
-       struct sysfs_dirent *child;
-       int nr = 0;
-
-       for (child = sd->s_dir.children; child; child = child->s_sibling)
-               if (sysfs_type(child) == SYSFS_DIR)
-                       nr++;
-
-       return nr + 2;
-}
-
 static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode)
 {
        struct sysfs_inode_attrs *iattrs = sd->s_iattr;
@@ -230,7 +219,7 @@ static void sysfs_refresh_inode(struct sysfs_dirent *sd, struct inode *inode)
        }
 
        if (sysfs_type(sd) == SYSFS_DIR)
-               inode->i_nlink = sysfs_count_nlink(sd);
+               set_nlink(inode, sd->s_dir.subdirs + 2);
 }
 
 int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat)
@@ -330,14 +319,15 @@ int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const void *ns, const cha
        struct sysfs_addrm_cxt acxt;
        struct sysfs_dirent *sd;
 
-       if (!dir_sd)
+       if (!dir_sd) {
+               WARN(1, KERN_WARNING "sysfs: can not remove '%s', no directory\n",
+                       name);
                return -ENOENT;
+       }
 
        sysfs_addrm_start(&acxt, dir_sd);
 
        sd = sysfs_find_dirent(dir_sd, ns, name);
-       if (sd && (sd->s_ns != ns))
-               sd = NULL;
        if (sd)
                sysfs_remove_one(&acxt, sd);